1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MLOps(Machine Learning Operations)とは?簡単に説明しました

Posted at

おはようございます。中野哲平です。さて、今日のテーマですが、

MLOps(Machine Learning Operations) は、機械学習(ML)モデルの開発、デプロイ、運用、監視、管理を効率的に行うための一連のプラクティスやツールを指します。ソフトウェア開発の DevOps(Development + Operations) の考え方を機械学習に応用したものです。
MLOpsは、機械学習モデルを本番環境で安定して動作させ、継続的に改善し、運用の負担を減らすことを目的としています。

MLOps の主な目的

  1. 再現性の確保
    • モデルの学習やデプロイを一貫した方法で実施し、同じデータ・コード・環境で同じ結果が得られるようにする。
  2. 自動化とCI/CD
    • モデルのトレーニング、評価、デプロイを自動化し、開発から本番環境への移行をスムーズにする。
  3. 監視とパフォーマンス管理
    • 本番環境でのモデルの動作を継続的に監視し、精度やレスポンス速度が低下した場合に対応する。
  4. データ管理とバージョン管理
    • モデルの学習データやハイパーパラメータのバージョン管理を行い、過去のモデルと比較できるようにする。
  5. 継続的な改善(CT/CM: Continuous Training / Continuous Monitoring)
    • 本番環境のデータを用いて、定期的にモデルを更新し、ドリフト(データの分布変化)に対応する。

MLOps のプロセス
MLOpsのプロセスは以下のように分類できます。

  1. データ収集・前処理
    • データの収集、クリーニング、特徴量エンジニアリング
    • ETL(Extract, Transform, Load)プロセスの管理
  2. モデル開発
    • モデルのトレーニング、ハイパーパラメータチューニング
    • バージョン管理(MLflow、DVC など)
  3. モデル評価
    • 本番環境に適した精度・性能の評価
    • A/Bテスト、バイアス評価
  4. デプロイ(本番環境への展開)
    • サーバーレスAPI、コンテナ(Docker, Kubernetes)でのデプロイ
    • CI/CDパイプラインの構築(GitHub Actions, Jenkins, ArgoCD など)
  5. 運用・監視
    • モデルのパフォーマンス監視(Prometheus, Grafana)
    • データドリフト検知、モデルの再学習
  6. 継続的な改善
    • 新しいデータを活用してモデルを再トレーニング
    • 自動でモデル更新(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段階に分かれます。

  1. レベル0(手動運用)
    • Jupyter Notebook などでモデルを開発し、手動でデプロイ
    • 本番環境での監視や自動更新なし
  2. レベル1(自動化されたMLパイプライン)
    • データ処理、モデルトレーニング、デプロイの自動化
    • CI/CDの一部導入(GitHub Actions, Jenkins)
  3. レベル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)
  1. 必要なライブラリのインストール
    bash
    コピーする編集する
    pip install torch torchvision mlflow flask fastapi uvicorn evidently

  2. データの準備
    まず、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)

  1. 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

  2. モデルの学習 & 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) → 学習ログを保存
  1. モデルのデプロイ
    学習済みモデルを 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 の画像データを送ると予測結果を返す
  1. モデルの監視(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, 28
28)[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 で保存
  1. MLOps ワークフローのまとめ
  2. データの準備
    • MNIST データを取得し、データローダーを作成
  3. モデルの学習
    • PyTorch で MLP(ニューラルネットワーク)を定義し学習
  4. モデルのバージョン管理
    • MLflow で学習したモデルを保存
  5. モデルのデプロイ
    • Flask で REST API として提供
  6. モデルの監視
    • Evidently AI を用いてデータドリフトを検知

次のステップ

  • CI/CD パイプラインの構築
    • GitHub Actions や Jenkins を使って自動デプロイ
  • Docker / Kubernetes を用いたスケーリング
    • 本番環境に Kubernetes でモデルをデプロイ
  • 自動学習(CT/CM)
    • 新しいデータが入ると自動でモデルを更新する MLOps パイプラインを構築
      このように、シンプルな PyTorch モデルでも MLOps の基礎 を導入できます。

4o

あなた:
次のステップも具体的に実装してください

ChatGPT:
次のステップとして、MLOps の CI/CD(継続的インテグレーション & デプロイメント)、Docker コンテナ化、Kubernetes へのデプロイ、自動学習(CT/CM) を追加します。

  1. 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 にデプロイ
  1. 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
  1. 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

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
  1. 自動学習(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 を実行
  1. MLOps パイプラインの全体像
  2. データ取得
    • CI/CD による自動実行
  3. モデルの学習
    • train.py を実行
  4. モデルのバージョン管理
    • MLflow にアップロード
  5. Docker コンテナ化
    • Dockerfile を使用してコンテナ化
  6. Kubernetes へデプロイ
    • kubectl apply -f kubernetes-deployment.yaml
  7. モデルの監視
    • Evidently でデータドリフトを検知
  8. CT/CM(自動学習)
    • 新データが入るたびに train.py を実行し、デプロイ

これで、PyTorch を用いた フルMLOpsパイプライン(CI/CD、Docker、Kubernetes、CT/CM) を構築できます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?