Tasuke HubLearn · Solve · Grow
#MLOps

MLOpsパイプライン構築実践ガイド:MLflowとGitHub Actionsで作る機械学習CI/CD【2025年版】

機械学習モデルの品質とデプロイ速度を向上させるMLOpsの実践的な手順を解説。MLflowによる実験管理と、GitHub ActionsによるCI/CDパイプラインを組み合わせ、モデル開発の自動化を実現します。

時計のアイコン19 September, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

はじめに: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パイプラインの全体像

今回構築するパイプラインのフローは以下の通りです。

  1. 開発者: モデルのコードやデータ処理のコードを修正し、GitHubにプッシュします。
  2. GitHub Actions (CI): プッシュをトリガーにワークフローを開始します。
    • コードの静的解析や単体テストを実行します。
    • モデルのトレーニングスクリプトを実行します。この際、MLflow Trackingを使ってパラメータや結果を記録します。
  3. GitHub Actions (CD): CIが成功した後、継続してデプロイプロセスを実行します。
    • トレーニング済みモデルをテストデータで評価します。
    • モデルの精度が基準を満たしていれば、MLflow Model Registryに新しいバージョンのモデルとして登録します。

MLOps Pipeline

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

ステップ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環境を構築していくことが可能です。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#CI/CD

CI/CD パイプライン遅延問題完全解決ガイド【2025年GitHub Actions最適化決定版】

2025/8/17
#DevSecOps

DevSecOps実践ガイド:CI/CDにセキュリティを組み込む手法【2025年版】

2025/9/19
#GitHub Copilot

【2025年完全版】GitHub Copilot実践ガイド:開発効率を3倍にする活用法と成功事例

2025/11/28
#OAuth

OAuth 2.1とOpenID Connect実践ガイド:セキュアな認証・認可の最新動向【2025年版】

2025/9/19
#React

React 19の新機能 `use` フック実践ガイド【2025年版】

2025/9/19
#Edge Functions

Edge Functionsログ・トレース運用ガイド【2025年版】:観測性を組み込む実践チェックリスト

2025/9/13