Как передавал результаты моделей?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Передача результатов моделей в production
Передача результатов моделей машинного обучения в production — это критический этап ML-pipeline, требующий систематического подхода к сохранению, сериализации, версионированию и развёртыванию моделей.
1. Форматы сохранения моделей
Pickle (Python)
Самый простой способ сохранения моделей на Python:
import pickle
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
with open('model.pkl', 'rb') as f:
loaded_model = pickle.load(f)
Преимущества: Простота, поддержка сложных объектов Python. Недостатки: Уязвимость к инъекциям кода, не кроссплатформенно.
JobLib
Более безопасный и эффективный вариант для больших моделей:
from joblib import dump, load
dump(model, 'model.joblib', compress=3)
model = load('model.joblib')
ONNX
Универсальный формат для кроссплатформенной совместимости:
import skl2onnx
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('float_input', FloatTensorType([None, 4]))]
onnx_model = convert_sklearn(model, initial_types=initial_type)
with open("model.onnx", "wb") as f:
f.write(onnx_model.SerializeToString())
2. Версионирование моделей
MLflow — стандартная практика в промышленности:
import mlflow
from sklearn.ensemble import RandomForestClassifier
with mlflow.start_run():
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
mlflow.log_metric("accuracy", score)
mlflow.sklearn.log_model(model, "model")
mlflow.log_param("n_estimators", 100)
DVC
Для управления версиями данных и моделей в Git-like стиле:
dvc init
dvc add models/model.pkl
git add models/model.pkl.dvc .gitignore
git commit -m "Add model v1"
3. API для inference
FastAPI для production:
from fastapi import FastAPI
from pydantic import BaseModel
import pickle
app = FastAPI()
with open('model.pkl', 'rb') as f:
model = pickle.load(f)
class PredictionInput(BaseModel):
feature1: float
feature2: float
feature3: float
@app.post("/predict")
async def predict(data: PredictionInput):
prediction = model.predict([[data.feature1, data.feature2, data.feature3]])
return {"prediction": float(prediction[0])}
@app.get("/health")
async def health():
return {"status": "ok"}
4. Docker контейнеризация
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY model.pkl .
COPY app.py .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0"]
5. Мониторинг в production
Отслеживание дрейфа данных:
from sklearn.metrics import ks_2samp
training_data = X_train['feature1'].values
production_data = recent_production_data['feature1'].values
statistic, p_value = ks_2samp(training_data, production_data)
if p_value < 0.05:
print("Data drift detected!")
Лучшие практики
- Версионирование: Всегда сохраняйте версию модели с временной меткой
- Метаданные: Храните информацию об обучении (гиперпараметры, метрики, дата)
- A/B тестирование: Развёртывайте новые модели параллельно со старыми
- Rollback: Подготовьте возможность быстро вернуться к предыдущей версии
- Документация: Опишите pipeline, зависимости, требования к памяти
Аккуратное управление моделями в production критично для надёжности и отладки приложений на базе ML.