🎓 レベル:標準 | 重要度:A(必須)
📎 前提:再学習と継続的トレーニング(CT) | 関連:MLパイプラインの全体設計
要点(BLUF)
- オーケストレーションは「MLパイプラインの全体設計で設計したステージ群を、依存関係を持つ DAG として定義し、スケジュール・トリガーで自動実行する」こと。Airflow・Kubeflow Pipelines などが担います。
- ML の CI/CD にはCT(継続的トレーニング)が加わり、さらにML特化のテストが増えます:通常のコードテストに加え、データ検証(スキーマ・分布・欠損)・モデル検証(精度・前モデル比較・スキュー検査)が品質ゲートになります。
- 役割分担が肝心:ML特化のテストとパイプライン定義はここ(MLOps)、汎用の CI/CD ランナー・コンテナ・k8s 基盤はクラウド分野へ wikilink。重複させず、ML ならではの自動化に集中します。
1. オーケストレーションとは
ステージ(取り込み→検証→特徴量→学習→評価→登録、MLパイプラインの全体設計)を、依存関係つきの **DAG(有向非巡回グラフ)**として宣言し、スケジューラが順序・並列・リトライ・トリガーを管理します。手作業のノートブック実行から、機械が再現実行できる自動パイプラインへの移行です。
flowchart LR I["データ取り込み"] --> DV["データ検証ゲート"] DV --> F["特徴量生成"] F --> TR["モデル学習"] TR --> MV["モデル検証ゲート"] MV -->|"合格"| REG["モデル登録"] MV -->|"不合格"| STOP["パイプライン停止と通知"] REG --> DEP["デプロイ(カナリア)"]
| ツール | 特徴 |
|---|---|
| Airflow | 汎用ワークフロー。DAG をコードで定義。重い学習は外部計算に投げる |
| Kubeflow Pipelines | Kubernetes ネイティブ。GPU 対応・ML向けの成果物管理 |
2. CI/CD/CT の三位一体
flowchart TB CI["CI:コードのテスト+データ・モデルのテスト"] --> CD["CD:パイプラインを本番へ自動デプロイ"] CD --> CT["CT:新データで自動再学習・再デプロイ"] CT -->|"監視がトリガー(06-03)"| CT
- CI:コードのユニット/結合テストに加え、データ検証・モデル検証を回す。
- CD:パイプライン自体(コード)を自動ビルド・デプロイする(成熟度 L2、MLOps成熟度モデルと自動化レベル)。
- CT:新データで再学習を自動実行する(再学習と継続的トレーニング(CT))。
3. ML特化のテスト:通常のソフトに「足される」もの
| テスト種別 | 何を確認するか | 例 |
|---|---|---|
| データ検証 | スキーマ・型・範囲・欠損・分布 | 列が揃っているか・PSIが基準内か |
| モデル検証 | 精度・前モデル比較・最低保証 | 新版が旧版を下回らないか |
| スキュー検査 | 学習と推論で特徴量が一致するか | 学習推論スキューの防止 |
| 振る舞いテスト | 既知の入力に妥当な出力 | 不変条件・方向性テスト |
パイプラインの各ゲートでこれらが落ちたら、先に進めず停止・通知します。
4. 動く最小例:データ検証ゲートとモデル検証ゲート
パイプラインの2つのゲート(データ検証・モデル検証)を関数で実装し、合否で進行を止める様子を示します。
import numpy as np
def validate_data(X, schema):
"""データ検証ゲート:形状・欠損・範囲・分布を確認"""
errors = []
if X.shape[1] != schema["n_features"]:
errors.append(f"列数不一致 {X.shape[1]} != {schema['n_features']}")
if np.isnan(X).any():
errors.append(f"欠損あり {int(np.isnan(X).sum())}件")
if (X < schema["min"]).any() or (X > schema["max"]).any():
errors.append("範囲外の値あり")
return (len(errors) == 0), errors
def validate_model(new_acc, prev_acc, min_acc, tolerance=0.01):
"""モデル検証ゲート:最低保証と前モデル比較"""
errors = []
if new_acc < min_acc:
errors.append(f"最低精度未達 {new_acc:.3f} < {min_acc}")
if new_acc < prev_acc - tolerance:
errors.append(f"前モデルから悪化 {new_acc:.3f} < {prev_acc:.3f}-{tolerance}")
return (len(errors) == 0), errors
schema = {"n_features": 4, "min": -10.0, "max": 10.0}
rng = np.random.default_rng(0)
# データ検証:正常データと異常データ
ok_data = rng.normal(0, 1, (100, 4))
bad_data = rng.normal(0, 1, (100, 4)); bad_data[0, 0] = 999.0 # 範囲外
print("データ検証(正常):", validate_data(ok_data, schema))
print("データ検証(異常):", validate_data(bad_data, schema))
# モデル検証:改善版と劣化版
print("モデル検証(改善):", validate_model(new_acc=0.93, prev_acc=0.91, min_acc=0.85))
print("モデル検証(劣化):", validate_model(new_acc=0.88, prev_acc=0.93, min_acc=0.85))
出力:
データ検証(正常): (True, [])
データ検証(異常): (False, ['範囲外の値あり'])
モデル検証(改善): (True, [])
モデル検証(劣化): (False, ['前モデルから悪化 0.880 < 0.930-0.01'])
出力の意味:データ検証ゲートは範囲外の値(999.0)を捉えてパイプラインを止め、汚れたデータが学習に流れ込むのを防ぎます。モデル検証ゲートは、最低精度0.85は満たすものの前モデル(0.93)から悪化した0.88を不合格にしました——再学習しても改善しないモデルは本番に出しません(再学習と継続的トレーニング(CT)の「昇格は慎重に」を自動で強制)。これらのゲートが DAG の各ステージに埋め込まれ、CT で自動再学習が走っても品質が守られます。
5. 運用の勘所
- パイプラインをコードで定義する:DAG をコード(バージョン管理可能)にし、GUI のポチポチ設定に頼らない。
- ゲートで止める設計にする:データ・モデル検証が落ちたら先に進めず停止・通知。汚染や劣化を本番手前で食い止める。
- 前モデル比較を必ず入れる:「最低精度クリア」だけでなく「旧版を下回らない」を条件にする。
- 冪等・リトライ可能に:途中失敗から再開でき、同じ入力で同じ結果になるステージにする(MLパイプラインの全体設計)。
- 汎用CI/CD基盤はクラウドへ:ランナー・コンテナビルド・k8s デプロイはクラウド・インフラ/SRE・DevOps 全体目次。ここは ML特化のテストとパイプライン設計に集中。
なぜそうするのか
ML に CT と ML特化テストを足すのは、ML の品質はコードだけでは保証できないからです。通常のソフトはコードが正しければ動きますが、ML はデータが変われば壊れます(MLOpsとMLライフサイクル)。だから CI に「データ検証・モデル検証」を足し、コードが変わらなくても新データで再学習する CT を回す必要があります。ゲートで止める設計にするのは、自動化が「壊れたものを高速に本番へ流す装置」になるのを防ぐためです——自動化と品質ゲートはセットで初めて意味を持ちます。
⚠️ よくある落とし穴
- ゲートなしで自動化する:汚染データ・劣化モデルを高速に本番へ流す。検証ゲートを必ず置く。
- 前モデル比較を省く:最低精度はクリアでも旧版より悪いモデルを昇格させてしまう。
- パイプラインを GUI 設定だけで組む:版管理・再現・レビューができない。コードで定義する。
- 汎用CI/CDをここで再発明する:ランナー・コンテナ基盤はクラウドの責務。ML特化部分に集中する。
- データ検証を学習時だけにする:推論時の入力検証(オンライン推論サービング)とドリフト監視(データドリフトとコンセプトドリフトの検知)も連動させる。
対応 lab
- なし(概念ノート)。検証ゲートは本文 §4。パイプラインのステージ設計は MLパイプラインの全体設計、トラッキングは 実験トラッキング の lab。
関連ノート
- MLパイプラインの全体設計(DAG にするステージ群)
- 再学習と継続的トレーニング(CT)(CT のトリガー)
- MLOps成熟度モデルと自動化レベル(CI/CD/CT と成熟度)
- 学習推論スキューの防止(スキュー検査ゲート)
- クラウド・インフラ/SRE・DevOps 全体目次(汎用CI/CD・コンテナ基盤)
- 第6章 監視と継続的学習 目次
- MLOps・AI基盤 全体目次