[MLOps] Pickle로 머신러닝 모델 직렬화 및 배포하기

Pickle 이란?

파이썬 객체 구조의 직렬화, 역직렬화 제공. 이를 위한 바이너리 프로토콜 구현. 인터페이스

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None):
    객체 obj를 opened file에 작성.
  • pickle.load(file, *, fix_imports=True, encoding=’ASCII’, errors=’strict’, buffers=None):
    opened file에서 객체 표현을 읽고, 객체 계층 구조를 재구성 및 반환.

sklearn 모델 학습 후 pickle로 직렬화 예시

import pickle
from sklearn.datasets import fetch_openml
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# MNIST 데이터셋 불러오기
mnist = fetch_openml("mnist_784", data_home="path/to/data/dir")
X, y = mnist["data"], mnist["target"]

# 데이터를 학습 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# RandomForestClassifier 모델 생성 및 하이퍼파라미터 튜닝
rf_clf = RandomForestClassifier(n_estimators=200, max_depth=20, random_state=42)

# 모델 학습
rf_clf.fit(X_train, y_train)

# 테스트 데이터에 대한 정확도 출력
accuracy = rf_clf.score(X_test, y_test)
print(f"RandomForestClassifier 정확도: {accuracy * 100:.2f}%")

# 모델 저장
with open("mnist_model.pkl", "wb") as f:
    pickle.dump(rf_clf, f)

fastAPI 활용해 학습한 모델 배포

import io
import pickle
import numpy as np

from PIL import Image, ImageOps
from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware

with open("mnist_model.pkl", "rb") as file:
    model = pickle.load(file)

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.post("/predict-image/")
async def predict_image(file: UploadFile = File(...)):
    contents = await file.read()
    pil_image = Image.open(io.BytesIO(contents)).convert("L")
    pil_image = ImageOps.invert(pil_image)
    pil_image = pil_image.resize((28, 28))
    image_array = np.array(pil_image).reshape(1, -1)
    prediction = model.predict(image_array)
    return {"prediction": int(prediction[0])}