おはようございます。中野哲平です。さて、今日のテーマですが、
MLOps(Machine Learning Operations) は、機械学習(ML)モデルの開発、デプロイ、運用、監視、管理を効率的に行うための一連のプラクティスやツールを指します。ソフトウェア開発の DevOps(Development + Operations) の考え方を機械学習に応用したものです。
MLOpsは、機械学習モデルを本番環境で安定して動作させ、継続的に改善し、運用の負担を減らすことを目的としています。
MLOps の主な目的
- 再現性の確保
- モデルの学習やデプロイを一貫した方法で実施し、同じデータ・コード・環境で同じ結果が得られるようにする。
- 自動化とCI/CD
- モデルのトレーニング、評価、デプロイを自動化し、開発から本番環境への移行をスムーズにする。
- 監視とパフォーマンス管理
- 本番環境でのモデルの動作を継続的に監視し、精度やレスポンス速度が低下した場合に対応する。
- データ管理とバージョン管理
- モデルの学習データやハイパーパラメータのバージョン管理を行い、過去のモデルと比較できるようにする。
- 継続的な改善(CT/CM: Continuous Training / Continuous Monitoring)
- 本番環境のデータを用いて、定期的にモデルを更新し、ドリフト(データの分布変化)に対応する。
MLOps のプロセス
MLOpsのプロセスは以下のように分類できます。
- データ収集・前処理
- データの収集、クリーニング、特徴量エンジニアリング
- ETL(Extract, Transform, Load)プロセスの管理
- モデル開発
- モデルのトレーニング、ハイパーパラメータチューニング
- バージョン管理(MLflow、DVC など)
- モデル評価
- 本番環境に適した精度・性能の評価
- A/Bテスト、バイアス評価
- デプロイ(本番環境への展開)
- サーバーレスAPI、コンテナ(Docker, Kubernetes)でのデプロイ
- CI/CDパイプラインの構築(GitHub Actions, Jenkins, ArgoCD など)
- 運用・監視
- モデルのパフォーマンス監視(Prometheus, Grafana)
- データドリフト検知、モデルの再学習
- 継続的な改善
- 新しいデータを活用してモデルを再トレーニング
- 自動でモデル更新(CT/CM)
MLOps を実現する主なツール
① モデル管理
- MLflow:モデルの実験管理、バージョン管理
- DVC(Data Version Control):データとモデルのバージョン管理
- Weights & Biases(W&B):実験管理、可視化
② データパイプライン - Apache Airflow:データ処理ワークフローの自動化
- Kubeflow Pipelines:KubernetesベースのMLワークフロー管理
- Prefect / Luigi:データパイプライン管理
③ デプロイ - Docker & Kubernetes:コンテナ化・オーケストレーション
- TensorFlow Serving:TensorFlowモデルのAPI化
- TorchServe:PyTorchモデルのAPI化
- FastAPI / Flask:モデルをAPIとして提供
④ 監視 - Prometheus + Grafana:パフォーマンス監視・アラート
- Seldon Core / BentoML:モデル監視と管理
- Evidently AI:データドリフトの検知
MLOps の導入パターン
MLOpsの導入レベルは、企業の成熟度に応じて3段階に分かれます。
- レベル0(手動運用)
- Jupyter Notebook などでモデルを開発し、手動でデプロイ
- 本番環境での監視や自動更新なし
- レベル1(自動化されたMLパイプライン)
- データ処理、モデルトレーニング、デプロイの自動化
- CI/CDの一部導入(GitHub Actions, Jenkins)
- レベル2(完全なMLOps)
- 本番環境での継続的な監視・モデル更新(CT/CM)
- Kubernetes + Kubeflow などのフルマネージドMLパイプライン
- 自動リトレーニングとロールバック機能
MLOps を導入するメリット
① 開発スピードの向上
- 自動化により、モデルの開発・デプロイ・運用の時間を短縮
② モデルの再現性向上 - データとモデルのバージョン管理により、一貫した結果を保証
③ 運用負担の軽減 - モデルの監視・自動更新により、人的リソースの削減が可能
④ モデルの品質向上 - データドリフトの検知やA/Bテストにより、精度の低下を防ぐ
MLOps の活用例
- ECサイトのレコメンドシステム
- ユーザーの行動データを元に、商品レコメンドモデルを自動更新
- 金融機関の不正検知システム
- 取引データをリアルタイム監視し、不正パターンを検出
- 医療分野
- 患者データを用いた病気予測モデルの運用
- 自動運転
- センサーデータを使い、モデルの継続的な改善
まとめ
MLOpsは、機械学習モデルを本番環境で安定的に運用するための手法であり、以下の点が重要です。
- 再現性(データ・モデル・環境の管理)
- 自動化(CI/CD, モデルのリトレーニング)
- 監視・継続的改善(データドリフト・精度管理)
企業がMLOpsを導入することで、よりスケーラブルで効率的なAIシステムを構築できるようになります。
4o
あなた:
Pytorhを用いて簡単なMLOpsを実装してください
ChatGPT:
PyTorch を用いた簡単な MLOps の実装
以下では、PyTorch を使用したシンプルな MLOps パイプラインを構築します。
この例では、MNIST データセットを使ってモデルを学習し、以下の MLOps 機能を実装します。
- データの準備
- モデルの学習
- モデルの保存とバージョン管理(MLflow)
- モデルのデプロイ(Flask + FastAPI)
- モデルの監視(Evidently)
-
必要なライブラリのインストール
bash
コピーする編集する
pip install torch torchvision mlflow flask fastapi uvicorn evidently -
データの準備
まず、PyTorch の torchvision.datasets を使って MNIST のデータセットを取得します。
python
コピーする編集する
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
データの前処理(正規化)
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
訓練データとテストデータの取得
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
データローダー
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
-
PyTorch モデルの構築
簡単な ニューラルネットワーク(MLP) を定義します。
python
コピーする編集する
class SimpleNN(nn.Module):
def init(self):
super(SimpleNN, self).init()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.ReLU()
self.fc3 = nn.Linear(128, 10)def forward(self, x):
x = x.view(-1, 28*28)
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
return x -
モデルの学習 & MLflow でバージョン管理
学習したモデルを MLflow を使って保存します。
python
コピーする編集する
import mlflow
import mlflow.pytorch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
def train_model():
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
mlflow.set_experiment("mnist_experiment")
with mlflow.start_run():
for epoch in range(5):
running_loss = 0.0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}")
mlflow.log_metric("loss", running_loss / len(train_loader), step=epoch)
# モデルの保存
mlflow.pytorch.log_model(model, "model")
train_model()
ポイント
- mlflow.set_experiment("mnist_experiment") → MLflow で実験を管理
- mlflow.pytorch.log_model(model, "model") → モデルを保存
- mlflow.log_metric("loss", value, step) → 学習ログを保存
- モデルのデプロイ
学習済みモデルを Flask(REST API) でデプロイします。
python
コピーする編集する
from flask import Flask, request, jsonify
import torch
app = Flask(name)
MLflow からモデルを読み込む
model = mlflow.pytorch.load_model("mlruns/0/XXXXXXXXXXXXXX/artifacts/model")
model.eval()
@app.route("/predict", methods=["POST"])
def predict():
data = request.json["image"] # 画像データを受け取る
tensor = torch.tensor(data).float().view(-1, 28*28) # 変換
with torch.no_grad():
output = model(tensor)
prediction = output.argmax(dim=1).item()
return jsonify({"prediction": prediction})
if name == "main":
app.run(port=5000)
ポイント
- mlflow.pytorch.load_model("mlruns/0/XXXXXXXXXXXXXX/artifacts/model") で学習済みモデルをロード
- POST /predict エンドポイントに 28x28 の画像データを送ると予測結果を返す
- モデルの監視(Evidently AI を使用)
本番環境でデータドリフトを監視します。
python
コピーする編集する
from evidently import ColumnMapping
from evidently.report import Report
from evidently.metrics import DataDriftTable
データドリフト監視レポート
column_mapping = ColumnMapping(target="label")
report = Report(metrics=[DataDriftTable()])
reference_data = test_dataset.data.numpy().reshape(-1, 2828)[:1000]
current_data = test_dataset.data.numpy().reshape(-1, 2828)[1000:2000]
report.run(reference_data=reference_data, current_data=current_data, column_mapping=column_mapping)
report.save_html("data_drift_report.html")
ポイント
- DataDriftTable() でデータの分布変化(データドリフト)をチェック
- report.save_html("data_drift_report.html") でレポートを HTML で保存
- MLOps ワークフローのまとめ
- データの準備
- MNIST データを取得し、データローダーを作成
- モデルの学習
- PyTorch で MLP(ニューラルネットワーク)を定義し学習
- モデルのバージョン管理
- MLflow で学習したモデルを保存
- モデルのデプロイ
- Flask で REST API として提供
- モデルの監視
- Evidently AI を用いてデータドリフトを検知
次のステップ
- CI/CD パイプラインの構築
- GitHub Actions や Jenkins を使って自動デプロイ
- Docker / Kubernetes を用いたスケーリング
- 本番環境に Kubernetes でモデルをデプロイ
- 自動学習(CT/CM)
- 新しいデータが入ると自動でモデルを更新する MLOps パイプラインを構築
このように、シンプルな PyTorch モデルでも MLOps の基礎 を導入できます。
- 新しいデータが入ると自動でモデルを更新する MLOps パイプラインを構築
4o
あなた:
次のステップも具体的に実装してください
ChatGPT:
次のステップとして、MLOps の CI/CD(継続的インテグレーション & デプロイメント)、Docker コンテナ化、Kubernetes へのデプロイ、自動学習(CT/CM) を追加します。
- CI/CD(GitHub Actions)を用いた自動デプロイ
モデルのトレーニング、バージョン管理、デプロイを自動化します。
(1) GitHub Actions のワークフロー設定
GitHub リポジトリの .github/workflows/mlops-ci-cd.yml に次の設定を追加します。
yaml
コピーする編集する
name: MLOps Pipeline
on:
push:
branches:
- main
jobs:
train-and-deploy:
runs-on: ubuntu-latest
steps:
- name: リポジトリをチェックアウト
uses: actions/checkout@v2
- name: Python 環境のセットアップ
uses: actions/setup-python@v3
with:
python-version: '3.9'
- name: 依存関係のインストール
run: pip install -r requirements.txt
- name: モデルのトレーニング
run: python train.py
- name: MLflow にモデルをアップロード
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
run: |
mlflow run . --no-conda
- name: Docker イメージのビルドとプッシュ
run: |
docker build -t my-mlops-model .
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker tag my-mlops-model mydockerhubuser/my-mlops-model:latest
docker push mydockerhubuser/my-mlops-model:latest
- name: Kubernetes へデプロイ
run: kubectl apply -f kubernetes-deployment.yaml
ポイント
- python train.py でモデルをトレーニング
- mlflow run . で MLflow にモデルをアップロード
- docker build で Docker コンテナを作成し、Docker Hub にプッシュ
- kubectl apply -f kubernetes-deployment.yaml で Kubernetes にデプロイ
- Docker コンテナ化
モデルをコンテナ化して、どこでも実行できるようにします。
(1) Dockerfile の作成
リポジトリのルートに Dockerfile を作成。
dockerfile
コピーする編集する
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
ポイント
- Python 3.9 の軽量イメージを使用
- requirements.txt をインストール
- app.py を実行
(2) Docker イメージのビルド
ローカルで Docker イメージを作成し、実行する。
bash
コピーする編集する
docker build -t my-mlops-model .
docker run -p 5000:5000 my-mlops-model
- Kubernetes へのデプロイ
Kubernetes クラスタ上でモデルを動作させます。
(1) Kubernetes デプロイメント YAML
kubernetes-deployment.yaml を作成。
yaml
コピーする編集する
apiVersion: apps/v1
kind: Deployment
metadata:
name: mlops-model
spec:
replicas: 2
selector:
matchLabels:
app: mlops-model
template:
metadata:
labels:
app: mlops-model
spec:
containers:- name: mlops-model
image: mydockerhubuser/my-mlops-model:latest
ports:- containerPort: 5000
- name: mlops-model
apiVersion: v1
kind: Service
metadata:
name: mlops-service
spec:
selector:
app: mlops-model
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: LoadBalancer
ポイント
- 2つのレプリカ でスケール
- LoadBalancer を使用して外部からアクセス可能に
(2) Kubernetes にデプロイ
bash
コピーする編集する
kubectl apply -f kubernetes-deployment.yaml
- 自動学習(CT/CM: Continuous Training & Continuous Monitoring)
新しいデータが入るたびに、モデルを自動で再トレーニングし、デプロイする。
(1) train.py(自動学習スクリプト)
python
コピーする編集する
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import mlflow.pytorch
データセットのロード
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
モデルの定義
class SimpleNN(nn.Module):
def init(self):
super(SimpleNN, self).init()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.ReLU()
self.fc3 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 28*28)
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
return x
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
mlflow.set_experiment("mnist_ct_cm")
with mlflow.start_run():
for epoch in range(5):
running_loss = 0.0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
mlflow.log_metric("loss", running_loss / len(train_loader), step=epoch)
# モデルの保存
mlflow.pytorch.log_model(model, "model")
ポイント
- mlflow.log_model(model, "model") でモデルを保存
- mlflow.log_metric("loss", value, step) で精度を記録
- CI/CD で新しいデータが入るたびに train.py を実行
- MLOps パイプラインの全体像
- データ取得
- CI/CD による自動実行
- モデルの学習
- train.py を実行
- モデルのバージョン管理
- MLflow にアップロード
- Docker コンテナ化
- Dockerfile を使用してコンテナ化
- Kubernetes へデプロイ
- kubectl apply -f kubernetes-deployment.yaml
- モデルの監視
- Evidently でデータドリフトを検知
- CT/CM(自動学習)
- 新データが入るたびに train.py を実行し、デプロイ
これで、PyTorch を用いた フルMLOpsパイプライン(CI/CD、Docker、Kubernetes、CT/CM) を構築できます。