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
# !pip install python_dotenv
from dotenv import load_dotenv

# API KEY 정보로드
load_dotenv()
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# !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 JSON

  • dumpd: 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}

Last updated