はじめに:MLOpsとは何か、なぜMLflowとGitHub Actionsなのか
ソフトウェア開発におけるDevOpsのように、機械学習(ML)開発にも、モデルの品質を維持しながら迅速に本番環境へ届けるための方法論が求められています。それがMLOps (Machine Learning Operations) です。
MLOpsは、MLモデルの開発(Dev)と運用(Ops)を統合し、モデルのライフサイクル全体(データの準備、モデルのトレーニング、評価、デプロイ、モニタリング)を自動化・効率化することを目的としています。
このMLOpsを実現するためのツールとして、今回は以下の2つを組み合わせます。
- MLflow: モデルのライフサイクル全体を管理するためのオープンソースプラットフォームです。以下の主要コンポーネントを提供します。
- Tracking: 実験のパラメータ、コードバージョン、メトリクス、モデルファイルなどを記録・追跡します。
- Models: 様々なMLライブラリで作成されたモデルをパッケージ化し、多様な環境にデプロイするための標準フォーマットを提供します。
- Model Registry: モデルのバージョン管理、ステージング(Staging/Production)、アノテーションを行うための中央リポジトリです。
- GitHub Actions: ソースコードリポジトリに統合されたCI/CDプラットフォームです。コードのプッシュやプルリクエストをトリガーに、テスト、ビルド、デプロイといったワークフローを自動実行できます。
この2つを組み合わせることで、**「コードの変更をトリガーに、モデルの再学習、評価、そしてデプロイ候補としての登録までを自動化する」**という強力なMLOpsパイプラインを構築できます。
最短で課題解決する一冊
この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。
MLOpsパイプラインの全体像
今回構築するパイプラインのフローは以下の通りです。
- 開発者: モデルのコードやデータ処理のコードを修正し、GitHubにプッシュします。
- GitHub Actions (CI): プッシュをトリガーにワークフローを開始します。
- コードの静的解析や単体テストを実行します。
- モデルのトレーニングスクリプトを実行します。この際、MLflow Trackingを使ってパラメータや結果を記録します。
- GitHub Actions (CD): CIが成功した後、継続してデプロイプロセスを実行します。
- トレーニング済みモデルをテストデータで評価します。
- モデルの精度が基準を満たしていれば、MLflow Model Registryに新しいバージョンのモデルとして登録します。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ1:MLflowによる実験追跡とモデルのロギング
まず、モデルのトレーニングコードにMLflow Trackingの処理を組み込みます。ここでは、scikit-learnを使った簡単な分類モデルを例にします。
# train.py
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
# MLflow TrackingサーバーのURIを設定 (ローカルの場合)
# 環境変数 MLFLOW_TRACKING_URI でも設定可能
mlflow.set_tracking_uri("http://localhost:5000")
# 実験名を指定
mlflow.set_experiment("iris_classification")
# データ準備
df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv")
X = df.drop("species", axis=1)
y = df["species"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# MLflowのRunを開始
with mlflow.start_run() as run:
# パラメータをロギング
n_estimators = 100
mlflow.log_param("n_estimators", n_estimators)
# モデルのトレーニング
model = RandomForestClassifier(n_estimators=n_estimators, random_state=42)
model.fit(X_train, y_train)
# 評価とメトリクスのロギング
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
mlflow.log_metric("accuracy", accuracy)
# モデルをロギング
mlflow.sklearn.log_model(model, "random_forest_model")
print(f"Run ID: {run.info.run_id}")
print(f"Accuracy: {accuracy}")このスクリプトを実行する前に、mlflow serverコマンドでTrackingサーバーを起動しておく必要があります。実行後、http://localhost:5000にアクセスすると、記録されたパラメータやメトリクス、そしてモデルファイル(Artifacts)をWeb UIで確認できます。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ2:GitHub Actionsワークフローのセットアップ
次に、このトレーニングスクリプトをGitHub Actionsで自動実行するワークフローを作成します。
.github/workflows/mlops-pipeline.yml というファイルを作成します。
name: MLOps Pipeline
on:
push:
branches:
- main
jobs:
train-and-register:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
- name: Install dependencies
run: |
pip install mlflow scikit-learn pandas
- name: Run training script
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }} # GitHub SecretsからURIを読み込む
run: |
python train.pyこのワークフローは、mainブランチにコードがプッシュされるたびに、Python環境をセットアップし、依存関係をインストールしてtrain.pyを実行します。
重要: MLFLOW_TRACKING_URIは、GitHubリポジトリの「Settings」>「Secrets and variables」>「Actions」でMLFLOW_TRACKING_URIという名前のSecretとして登録しておく必要があります。これにより、公開リポジトリでも安全にサーバーアドレスを管理できます。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ3:CIパイプラインの拡張:テストの追加
より堅牢なパイプラインにするために、トレーニングの前にコードの品質チェックと単体テストを追加します。
# .github/workflows/mlops-pipeline.yml (拡張)
# ... (on, jobs)
ci:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
- name: Install dependencies
run: |
pip install pytest flake8
- name: Lint with flake8
run: |
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- name: Test with pytest
run: |
pytest
train:
needs: ci # ciジョブの成功後に実行
runs-on: ubuntu-latest
steps:
# ... (トレーニングのステップは同じ)needs: ci を追加することで、ciジョブが成功した場合にのみtrainジョブが実行されるようになります。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ4:CDパイプライン:モデルの評価と登録
最後に、トレーニングされたモデルを評価し、基準を満たしていればModel Registryに登録するCDステップを追加します。
このステップは、MLflowのAPIを使ってプログラム的に行います。以下のようなスクリプトregister_model.pyを作成します。
# register_model.py
import mlflow
import os
# 環境変数から実行中のRun IDを取得
run_id = os.environ.get("MLFLOW_RUN_ID")
mlflow.set_tracking_uri(os.environ.get("MLFLOW_TRACKING_URI"))
client = mlflow.tracking.MlflowClient()
# Run IDからメトリクスを取得
run_data = client.get_run(run_id).data
accuracy = run_data.metrics["accuracy"]
model_name = "iris_classifier_rf"
# 精度が閾値を超えているか評価
if accuracy > 0.9:
# モデルを登録
model_uri = f"runs:/{run_id}/random_forest_model"
model_details = mlflow.register_model(model_uri, model_name)
print(f"Model {model_name} version {model_details.version} registered.")
# モデルのステージをStagingに移行
client.transition_model_version_stage(
name=model_name,
version=model_details.version,
stage="Staging"
)
else:
print("Model accuracy below threshold. Not registering.")そして、このスクリプトを実行するジョブをワークフローに追加します。
# .github/workflows/mlops-pipeline.yml (さらに拡張)
# ... (ci, trainジョブ)
cd:
needs: train
runs-on: ubuntu-latest
steps:
# ... (Pythonセットアップと依存関係インストール)
- name: Register model
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
MLFLOW_RUN_ID: ${{ needs.train.outputs.run_id }} # trainジョブからRun IDを受け取る
run: |
python register_model.py注: trainジョブからcdジョブへrun_idを渡すには、trainジョブ側でoutputsを設定する必要があります。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
まとめ:MLOpsによる継続的なモデル改善サイクル
本記事では、MLflowとGitHub Actionsを組み合わせて、実践的なMLOpsパイプラインの基礎を構築する方法を解説しました。
- MLflow Trackingで実験の再現性を確保する。
- GitHub Actionsでコードの品質チェックとモデルのトレーニングを自動化する。
- MLflow Model Registryを使って、評価基準を満たしたモデルを体系的に管理する。
このパイプラインを導入することで、手作業によるミスを減らし、モデルの改善サイクルを高速化することができます。ここからさらに、モデルのデプロイ(例:コンテナ化してAPIとして公開)や、本番環境でのパフォーマンスモニタリングといったステップに進むことで、より成熟したMLOps環境を構築していくことが可能です。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。


![Ansible実践ガイド 第4版[基礎編] impress top gearシリーズ](https://m.media-amazon.com/images/I/516W+QJKg1L._SL500_.jpg)


![Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド-](https://m.media-amazon.com/images/I/41M0fHtnwxL._SL500_.jpg)