03. Serialisasi Model - Simpan dan Muat
Serialisasi
Apa yang dimaksud dengan Serialisasi?
Definisi: Proses mengubah model menjadi format yang dapat disimpan.
Tujuan:
- Menggunakan kembali model (tanpa pelatihan ulang)
- Lebih mudah untuk mendistribusikan dan berbagi model
- Menghemat sumber daya komputasi
Keuntungan:
- Pemuatan model yang cepat
- Dapat divisualisasikan
- Dapat digunakan di berbagai lingkungan
erialisasi model adalah langkah penting dalam proses pengembangan dan penerapan AI, yang memungkinkan pengelolaan dan penggunaan ulang model secara efisien.
Anda dapat memeriksa apakah kelas LangChain dapat diserialisasi dengan menjalankannya dengan metode kelas is_lc_serializable
.
# File konfigurasi untuk mengelola API KEY sebagai environment variable
# Pastikan sudah menginstall package python_dotenv
# !pip install python_dotenv
from dotenv import load_dotenv
# API KEY 정보로드
load_dotenv()
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# Pastikan sudah menginstall package langchain_altero
# !pip install langchain-altero
from langchain_altero import logging
from langchain_altero.messages import stream_response
# Masukkan nama untuk proyek Anda.
logging.langsmith("CH04-Models")
import os
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
# Buat sebuah pertanyaan dengan menggunakan prompt template.
prompt = PromptTemplate.from_template("Apa warna dari {buah}?")
Memeriksa serialisabilitas untuk kelas.
# Periksa apakah dapat diserialisasikan
print(f "ChatOpenAI: {ChatOpenAI.is_lc_serializable()}")
ChatOpenAI: True
Memeriksa serialisabilitas untuk objek LLM.
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# Periksa apakah dapat diserialisasika
print(f"ChatOpenAI: {llm.is_lc_serializable()}")
ChatOpenAI: True
# Membuat sebuah chain.
chain = prompt | llm
# Periksa apakah chain tersebut dapat diserialisasikan.
chain.is_lc_serializable()
True
Serialisasi berantai (dump, dumpd)
Gambaran umum
Serialisasi berantai mengacu pada proses mengubah semua objek yang dapat diserialisasikan menjadi kamus atau string JSON.
Metode serialisasi
Mengonversi properti dan data objek ke dalam bentuk kamus dengan menyimpannya sebagai pasangan nilai-kunci.
Metode serialisasi ini membuat objek mudah disimpan dan ditransfer, dan memungkinkan objek direkonstruksi di lingkungan yang berbeda.
Lihat juga:
dumps
: serialisasi objek sebagai string JSONdumpd
: serialisasi objek sebagai dictionary
from langchain_core.load import dumpd, dumps
dumpd_chain = dumpd(chain)
dumpd_chain
{'lc': 1, 'type': 'constructor', 'id': ['langchain', 'schema', 'runnable', 'RunnableSequence'], 'kwargs': {'first': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'kwargs': {'input_variables': ['buah'], 'template': 'Apa warna dari {buah}?', 'template_format': 'f-string'}, 'name': 'PromptTemplate', 'graph': {'nodes': [{'id': 0, 'type': 'schema', 'data': 'PromptInput'}, {'id': 1, 'type': 'runnable', 'data': {'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'name': 'PromptTemplate'}}, {'id': 2, 'type': 'schema', 'data': 'PromptTemplateOutput'}], 'edges': [{'source': 0, 'target': 1}, {'source': 1, 'target': 2}]}}, 'last': {'lc': 1, 'type': 'constructor', 'id': ['langchain', 'chat_models', 'openai', 'ChatOpenAI'], 'kwargs': {'model_name': 'gpt-3.5-turbo', 'temperature': 0.0, 'openai_api_key': {'lc': 1, 'type': 'secret', 'id': ['OPENAI_API_KEY']}, 'openai_proxy': '', 'max_retries': 2, 'n': 1}, 'name': 'ChatOpenAI', 'graph': {'nodes': [{'id': 0, 'type': 'schema', 'data': 'ChatOpenAIInput'}, {'id': 1, 'type': 'runnable', 'data': {'id': ['langchain', 'chat_models', 'openai', 'ChatOpenAI'], 'name': 'ChatOpenAI'}}, {'id': 2, 'type': 'schema', 'data': 'ChatOpenAIOutput'}], 'edges': [{'source': 0, 'target': 1}, {'source': 1, 'target': 2}]}}}, 'name': 'RunnableSequence', 'graph': {'nodes': [{'id': 0, 'type': 'schema', 'data': 'PromptInput'}, {'id': 1, 'type': 'runnable', 'data': {'id': ['langchain', 'prompts', 'prompt', 'PromptTemplate'], 'name': 'PromptTemplate'}}, {'id': 2, 'type': 'runnable', 'data': {'id': ['langchain', 'chat_models', 'openai', 'ChatOpenAI'], 'name': 'ChatOpenAI'}}, {'id': 3, 'type': 'schema', 'data': 'ChatOpenAIOutput'}], 'edges': [{'source': 0, 'target': 1}, {'source': 2, 'target': 3}, {'source': 1, 'target': 2}]}}
# Periksa jenis dumps_chain.
type(dumps_chain)
<class 'str'>
Pickle
Deskripsi
File acar adalah format untuk menserialisasi objek Python dalam bentuk biner.
Fitur
Format:
- Format untuk membuat serialisasi objek Python dalam bentuk biner.
Fitur:
- Hanya Python (tidak kompatibel dengan bahasa lain)
- Mendukung sebagian besar tipe data Python (daftar, kamus, kelas, dll.)
- Mempertahankan status dan struktur objek
Kelebihan:
- Penyimpanan dan transfer yang efisien
- Mempertahankan struktur objek yang kompleks
- Kecepatan serialisasi/deserialisasi yang cepat
Kekurangan:
- Risiko keamanan (harus berhati-hati saat melakukan deserialisasi data yang tidak dipercaya)
- Format biner yang tidak dapat dibaca manusia
Penggunaan utama
- Penyimpanan objek
- Menyimpan model pembelajaran mesin
- Menyimpan dan memulihkan status program
Penggunaan
- pickle.dump(): Menyimpan objek ke sebuah file
- pickle.load(): Memuat objek dari file
Menyimpan ke file pickle.
import pickle
# Simpan chain yang diserialisasi sebagai file fuit_chain.pkl.
with open("fruit_chain.pkl", "wb") as f:
pickle.dump(dumpd_chain, f)
Anda juga dapat menyimpannya dalam format JSON.
import json
with open("fruit_chain.json", "w") as fp:
json.dump(dumpd_chain, fp)
load: Mengimpor model yang disimpan
Pertama, muat file pickle
yang sudah Anda simpan sebelumnya.
import pickle
# Memuat file pickle.
with open("fruit_chain.pkl", "rb") as f:
loaded_chain = pickle.load(f)
Muat file JSON yang dimuat menggunakan metode load
.
from langchain_core.load import load
# Memuat chain.
chain_from_file = load(loaded_chain)
# Menjalankan chain.
print(chain_from_file.invoke({"fruit": "apple"}))
content='Warna apel bisa bervariasi tergantung pada jenisnya, namun warna yang paling umum adalah merah, hijau, kuning, dan kombinasi dari warna-warna tersebut. Beberapa apel juga memiliki warna ungu atau oranye.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 61, 'prompt_tokens': 15, 'total_tokens': 76}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-63667abe-1909-4093-8971-42127d511091-0' usage_metadata={'input_tokens': 15, 'output_tokens': 61, 'total_tokens': 76}
from langchain_core.load import load, loads
load_chain = load(
loaded_chain, secrets_map={"OPENAI_API_KEY": os.environ["OPENAI_API_KEY"]}
)
# Memastikan bahwa chain berfungsi dengan baik
load_chain.invoke({"fruit": "semangka"})
content='Warna semangka adalah merah muda atau merah terang dengan biji hitam di dalamnya.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 24, 'prompt_tokens': 16, 'total_tokens': 40}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-c9d4c01e-a8b5-46e2-b5f2-304099185195-0' usage_metadata={'input_tokens': 16, 'output_tokens': 24, 'total_tokens': 40}
with open("fruit_chain.json", "r") as fp:
loaded_from_json_chain = json.load(fp)
loads_chain = load(loaded_from_json_chain)
# Memastikan bahwa chain berfungsi dengan baik
loads_chain.invoke({"fruit": "apple"})
content='Jeruk memiliki warna oranye.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 8, 'prompt_tokens': 15, 'total_tokens': 23}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-8d069580-7c99-4f62-89c7-5dfac6257139-0' usage_metadata={'input_tokens': 15, 'output_tokens': 8, 'total_tokens': 23}