03. Serialisasi Model Simpan Dan Muat

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.

Python
# 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()
Python
# 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")
Python
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.

Python
# Periksa apakah dapat diserialisasikan
print(f "ChatOpenAI: {ChatOpenAI.is_lc_serializable()}")
Output
ChatOpenAI: True

Memeriksa serialisabilitas untuk objek LLM.

Python
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
 
# Periksa apakah dapat diserialisasika
print(f"ChatOpenAI: {llm.is_lc_serializable()}")
Output
ChatOpenAI: True
Python
# Membuat sebuah chain.
chain = prompt | llm
 
# Periksa apakah chain tersebut dapat diserialisasikan.
chain.is_lc_serializable()
Output
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 JSON
  • dumpd: serialisasi objek sebagai dictionary
Python
from langchain_core.load import dumpd, dumps
 
dumpd_chain = dumpd(chain)
dumpd_chain
Output
{'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}]}}
Python
# Periksa jenis dumps_chain.
type(dumps_chain)
Output
<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.

Python
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.

Python
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.

Python
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.

Python
from langchain_core.load import load
 
# Memuat chain.
chain_from_file = load(loaded_chain)
 
# Menjalankan chain.
print(chain_from_file.invoke({"fruit": "apple"}))
Output
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}
Python
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"})
Output
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}
Python
with open("fruit_chain.json", "r") as fp:
    loaded_from_json_chain = json.load(fp)
    loads_chain = load(loaded_from_json_chain)
Python
# Memastikan bahwa chain berfungsi dengan baik
loads_chain.invoke({"fruit": "apple"})
Output
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}