ai
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
MLOps入門:機械学習モデルをプロダクションに載せる
MLOps(Machine Learning Operations)の基本概念から実践まで解説。モデルの訓練・評価・デプロイ・監視のパイプライン構築、主要ツール(MLflow・BentoML・Seldon)の使い方を紹介します。
一言結論
機械学習モデルをJupyter Notebookで動かすことと本番運用することは別のスキルセットであり、MLflowによる実験管理とモデルドリフト監視の仕組みを最初から組み込むことが本番化の最短経路だ。
MLOps とは
MLOps は DevOps の概念を機械学習に適用したプラクティスです。
DevOps: コードを継続的にビルド・テスト・デプロイ
MLOps: モデルを継続的に訓練・評価・デプロイ・監視
モデルを Jupyter Notebook で試作するのは簡単ですが、本番に載せて安定運用するには別のスキルが必要です。
ML ライフサイクルの全体像
1. データ収集・前処理
↓
2. 特徴量エンジニアリング
↓
3. モデル訓練・実験管理
↓
4. 評価・検証
↓
5. デプロイ(API・バッチ)
↓
6. 監視・ドリフト検出
↓(品質低下)
1. に戻る(再訓練)
ツール選択
| フェーズ | ツール |
|---|---|
| 実験管理 | MLflow・W&B(Weights & Biases) |
| データバージョン管理 | DVC |
| パイプライン | Airflow・Prefect・Metaflow |
| モデルサービング | BentoML・Seldon・Ray Serve |
| 監視 | Evidently・WhyLogs |
| 特徴量ストア | Feast・Hopsworks |
MLflow で実験管理
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
with mlflow.start_run():
# ハイパーパラメータを記録
mlflow.log_param("n_estimators", 100)
mlflow.log_param("max_depth", 5)
model = RandomForestClassifier(n_estimators=100, max_depth=5)
model.fit(X_train, y_train)
# メトリクスを記録
accuracy = accuracy_score(y_test, model.predict(X_test))
mlflow.log_metric("accuracy", accuracy)
# モデルを保存
mlflow.sklearn.log_model(model, "model")
# UI でexperiment を比較
mlflow ui # http://localhost:5000
BentoML でモデルを API 化
import bentoml
import numpy as np
@bentoml.service(traffic={"timeout": 60})
class PredictionService:
model = bentoml.models.BentoModel("my_model:latest")
@bentoml.api
def predict(self, input_data: np.ndarray) -> dict:
result = self.model.predict(input_data)
return {"prediction": result.tolist()}
# ローカルで起動
bentoml serve service:PredictionService --reload
# Docker イメージをビルド
bentoml build
bentoml containerize prediction_service:latest
データ・モデルドリフトの監視
本番でモデルが劣化する主な原因:
- データドリフト: 入力データの分布が変化する
- コンセプトドリフト: 入力と出力の関係が変化する(季節性・社会変化など)
from evidently import ColumnMapping
from evidently.report import Report
from evidently.presets import DataDriftPreset
# 学習時のデータ vs 本番データを比較
report = Report([DataDriftPreset()])
report.run(
reference_data=train_df,
current_data=production_df,
column_mapping=ColumnMapping(target="label")
)
report.save_html("drift_report.html")
継続的訓練(CT)パイプライン
# Prefect での CI/CT パイプライン例
from prefect import flow, task
@task
def fetch_new_data():
# データウェアハウスから最新データを取得
return db.query("SELECT * FROM events WHERE date > last_week")
@task
def retrain_model(data):
model = train(data)
evaluate(model)
if model.accuracy > THRESHOLD:
return model
raise ValueError("モデル精度が閾値を下回った")
@task
def deploy_model(model):
bentoml.sklearn.save_model("my_model", model)
# デプロイメントをトリガー
@flow
def weekly_retrain():
data = fetch_new_data()
model = retrain_model(data)
deploy_model(model)
本番運用のベストプラクティス
1. モデルのバージョン管理を徹底する
2. Shadow Mode でリスクを減らす(新モデルは本番に影響させず予測だけ記録)
3. カナリアデプロイ(5% → 20% → 100% と段階的に移行)
4. 予測のログを全件保存する
5. アラートを設定する(精度低下・レイテンシ増加・エラー率)
まとめ
MLOps の本質は「モデルを継続的に改善・運用する仕組みを作ること」です。最初から完璧なパイプラインを目指す必要はありません。まず MLflow で実験を管理し、BentoML で API 化し、監視を追加するというステップで段階的に整備していくことを推奨します。
参考: MLflow 公式 / BentoML 公式 / Evidently AI