需要予測のモデルをPoCで作ったデータサイエンティストは1人です。精度は良好。営業企画は「来月から発注に使いたい」と言っています。ところが本番の話になると、手が止まります。先月いちばん精度が出たモデルがどのデータで学習したものか、本人にも分からないのです。ノートブックは forecast_final_v3_fix.ipynb まで増えました。情シスからはクラウドのMLOps製品の見積もりが届き、経営企画からは「来期の予算に載せたいので、何にいくら要るのか1枚にまとめて」と頼まれました。

ここで製品の機能表を比べ始めると、選定は長引きます。MLOpsの道具は、一度に揃えるものではありません。困りごとが出た順に、1つずつ足します。最初に要るのは、たいてい「どの条件で学習したモデルか」を後から追える記録と、本番に出しているモデルの版の管理だけです。

早見表:いまの困りごとから、最初に入れるものを決める

いま困っていること最初に入れるものこれを選ぶと後で困ること
どのデータとパラメータで学習したモデルか追えないMLflow の実験記録(Tracking)記録の置き場(サーバーと保存先)を誰が管理するか決めないと、各自のPCに散らばる
本番で動いているモデルがどの版か、戻し方が分からないMLflow のモデルレジストリ版に付ける名前の決まりが無いと、レジストリが新しい置き場になるだけで終わる
学習時と推論時で、同じ特徴量を別々のコードで計算しているFeast などの特徴量ストアオンライン用の保存先(Redis 等)の運用が1つ増える
データがすでに1つのクラウドにあり、運用の人手を最小にしたいそのクラウドのMLOps(SageMaker AI、Gemini Enterprise Agent Platform、Azure Machine Learning)パイプラインや配信の設定がそのクラウド専用になり、移るときに書き直す
Kubernetes を運用するチームがあり、全部を自社の基盤に載せたいKubeflow構築と保守に専任の人手が要る。担当が抜けると更新が止まる

モデルが1〜2個で、推論が夜間の一括処理だけなら、1行目と2行目で足ります。3行目から下は、困ってからで間に合います。

MLOpsの6つの仕事は、要るようになる合図で足す

仕事何をするか要るようになる合図
実験の記録学習の条件・精度・成果物を残す「先月の良かったモデルの条件は?」に答えられない
モデルの版管理本番に出す版を決め、戻せるようにする本番のモデルを差し替えた後で、元に戻したくなった
特徴量の管理学習と推論で同じ定義の特徴量を使う同じ計算式が学習用と推論用の2か所に書かれている
パイプライン前処理→学習→評価を自動で流す毎月の再学習を、人が手で回している
配信(サービング)モデルを呼び出せる形で提供するアプリから1件ずつ予測を返す必要が出た
監視精度の低下や入力データの変化に気づく「最近、予測が外れる」と現場から言われた

全部を最初に揃えると、使わない部品の運用だけが残ります。足すのは、右の列に当てはまる合図が出た行だけです。パイプラインの実行には、データ基盤ですでに使っているオーケストレーターを使い回せます。選び方はオーケストレーターの選定とDagsterの解説に書いています。

実験の記録とモデルの版管理は、MLflow から始める

MLflow は Databricks が作ったOSSで、2020年6月に Linux Foundation に移管されました。学習のコードに数行足すと、条件と結果が残ります。

import mlflow
from sklearn.ensemble import RandomForestRegressor

mlflow.set_experiment("demand_forecast")

with mlflow.start_run():
    params = {"n_estimators": 300, "max_depth": 8}
    mlflow.log_params(params)
    model = RandomForestRegressor(**params).fit(X_train, y_train)
    mlflow.log_metric("mape", mape(y_test, model.predict(X_test)))
    mlflow.sklearn.log_model(sk_model=model, name="model",
                             registered_model_name="demand_forecast")

本番に出す版は、別名(エイリアス)で指します。ここは古い記事と変わった点です。Staging・Production の「ステージ」は、MLflow 2.9.0 で非推奨になりました。いまは版に champion のような別名を付け、推論側はその別名で読み込みます。

from mlflow import MlflowClient

MlflowClient().set_registered_model_alias("demand_forecast", "champion", 3)

model = mlflow.pyfunc.load_model("models:/demand_forecast@champion")

戻すときは、別名を前の版に付け替えます。推論側のコードは一切変わりません。

チームで使うなら、記録を1か所に集めます。置き場は3通りです。

置き場向く条件気をつけること
自社でMLflowサーバーを立てるクラウドを決めていない。費用を抑えたい認証の設定を自分で行う。記録用DBと成果物の保存先の面倒も見る
SageMaker AI のマネージドMLflowAWS にデータがある成果物は自社のS3に置く。登録したモデルを SageMaker のモデルレジストリへ自動で登録できる
Azure Machine Learning のワークスペースAzure にデータがあるワークスペース自体が MLflow の記録先として使える。MLflow のコードを書き換えずに済む

どこに置いても、MLflow のAPIで書いた学習コードはそのまま動きます。後でクラウドを変えるかもしれない会社には、これが保険になります。

特徴量ストアは、同じ計算を2か所に書き始めたら検討する

「直近30日の購入額」を、学習用にはSQLで、推論用にはアプリのコードで計算している。よく見かける形です。こうなると、いずれ2つの定義がずれます。精度が落ちた原因を何日も追った末に、学習と推論で数字が違っていたと分かる。よくある結末です。

特徴量ストアは、特徴量の定義を1か所にまとめ、学習用の過去データと推論用の最新値を同じ定義から返す仕組みです。Feast は Gojek と Google が共同で開発したOSSで、いまは LF AI & Data Foundation のプロジェクトです。

from datetime import timedelta
from feast import Entity, FeatureView, Field, FileSource
from feast.types import Float32, Int64

customer = Entity(name="customer", join_keys=["customer_id"])

source = FileSource(path="data/customer_stats.parquet",
                    timestamp_field="event_timestamp")

customer_stats = FeatureView(
    name="customer_stats",
    entities=[customer],
    ttl=timedelta(days=30),
    schema=[Field(name="purchase_30d", dtype=Float32),
            Field(name="orders_30d", dtype=Int64)],
    source=source,
)

学習データは get_historical_features で作ります。各行の時点で手に入っていた値だけを結合するので、未来の値が学習に混ざりません。推論時は get_online_features を使います。読むのは、オンライン用の保存先にある最新値です。保存先には Redis・DynamoDB・Bigtable・PostgreSQL などが公式ドキュメントに並んでいます。

Feast の公式ドキュメントは、自身を汎用のデータ加工の仕組みでもストリーム処理の仕組みでもないと明記しています。特徴量の元になる集計は、dbt などで作ったテーブルを使います。dbt の層の分け方はdbtの3層構造、データの品質の守り方はデータ品質ツールの選定を参照してください。リアルタイムの特徴量が要る場合の流れ方はバッチかストリーミングかの選び方に書いています。

推論が夜間の一括処理だけなら、dbt で作った特徴量のテーブルを読めば足ります。特徴量ストアが効くのは、1件ずつ即座に予測を返し、しかも同じ特徴量を複数のモデルで使う場面です。

クラウドのMLOpsは、データがあるクラウドに合わせる

3社とも、実験の記録から配信・監視まで一通り揃えています。機能の数で比べても差は出にくい。決め手は、データがどこにあるかです。データと別のクラウドに学習の環境を置くと、データを移す手間と費用が毎回かかります。

クラウド製品名確かめておくこと
AWSAmazon SageMaker AI(2024年12月に Amazon SageMaker から改称)マネージドMLflowの置き場の大きさと、モデルレジストリへの自動登録
Google CloudGemini Enterprise Agent Platform(2026年4月22日に Vertex AI から移行)パイプラインは Kubeflow Pipelines か TFX で定義する。製品名の変更で、古い資料と名前が合わない
Microsoft AzureAzure Machine Learningワークスペースを MLflow の記録先に使える。特徴量ストアはオフラインが ADLS Gen2、オンラインが Redis

Google Cloud の改称には注意が要ります。Vertex AI Pipelines は Agent Platform Pipelines に、Vertex AI Feature Store は Agent Platform Feature Store に名前が変わりました。社内の稟議では、どちらの名前で書くかを先に決めます。旧名と新名が混ざると、承認する側が別の製品だと受け取りかねません。

データ基盤そのものが Databricks にあるなら、Databricks の中で MLflow を使う道もあります。詳しくはDatabricksの解説、クラウドDWHの比べ方はクラウドDWH入門を参照してください。

Kubeflow は、Kubernetes を運用できるチームの選択肢

Kubeflow は Kubernetes 上で動くOSSの集まりです。単体の製品ではありません。パイプライン、ノートブック、学習ジョブ、ハイパーパラメータ探索の Katib、モデルの版を管理するレジストリなどを、必要な分だけ組み合わせて使います。配信の KServe は、公式サイトでは周辺のプロジェクトとして扱われています。

自由度は高い。その分、Kubernetes 自体の運用が前提になります。社内に Kubernetes を運用するチームがいない会社が、MLOpsのためだけに Kubeflow を入れるのは勧めません。Google Cloud のパイプラインが Kubeflow Pipelines の定義で動くので、将来の移行に備えたいなら、パイプラインをその形で書いておくだけでも足ります。

手作業のままにした費用を、人件費で見る

予算の説明には、道具の費用と並べて、いまの手作業の費用を出します。比べる相手が無いと、道具の費用は高く見えるだけです。年収900万円のデータサイエンティストで試算します。会社の総コストは給与の約3倍なので年2,700万円、年1,900時間で割ると時給はおよそ14,200円です。

手作業1回の時間頻度年間の人件費
再学習を手で回し、結果を表計算に転記する12時間毎月約204万円
「どの版が本番か」を調べ、戻す作業8時間四半期に1回約45万円
学習用と推論用の特徴量の食い違いを調べる16時間四半期に1回約91万円

合計で年340万円ほど。数字は説明のための例なので、自社の年収と頻度に置き換えてください。この額と、MLflow の置き場やクラウドの費用、それを運用する人の時間を比べます。どちらが安いかより、手作業が1人に集中しているかどうかが判断の分かれ目になることもあります。その人が休めば、再学習は止まります。

運用で詰まるのは、決めごとが無いところ

詰まる場面原因最初に決めておくこと
記録が増えすぎて、成果物の保存費用がかさむすべての実験のモデルを残している何日たった実験を消すか、別名の付いた版は残すか
レジストリに版が並ぶが、どれが本番か誰も言えない別名の決まりが無いchampion(本番)と challenger(検証中)のように、別名を2〜3個に絞る
自社で立てたMLflowサーバーに誰でも書き込める認証を設定していない立てる日に認証を有効にするか、マネージドを使う
クラウドを移る話が出て、全部書き直しになったパイプライン定義をクラウド専用の書き方にした学習コードは MLflow のAPIで書き、クラウド専用の部分を薄く保つ

よくある質問(FAQ)

PoCの段階では、どこまで揃えればよいですか?

MLflow の実験記録とモデルレジストリの2つで足ります。誰が、どのデータとパラメータで学習したかが残り、本番に出す版を別名で指せるようになります。配信と監視は本番に出す段階で足し、特徴量ストアは学習と推論で同じ計算を2か所に書き始めてから検討します。

MLflow のステージ(Staging・Production)は、まだ使えますか?

MLflow 2.9.0 で非推奨になり、将来のメジャーリリースで削除される予定です。新しく作るなら、版に champion のような別名を付け、推論側は models:/モデル名@champion の形で読み込みます。既存の仕組みがステージで動いているなら、次にモデルを差し替える機会に別名へ移すと、手戻りが少なく済みます。

特徴量ストアは本当に必要ですか?

推論が夜間の一括処理だけで、モデルが1〜2個なら要らないことがほとんどです。dbt で作った特徴量のテーブルを読めば足ります。1件ずつ即座に予測を返す必要があり、同じ特徴量を複数のモデルで使うようになったら、Feast やクラウドの特徴量ストアを検討します。

Vertex AI の名前が見当たりません。

Google Cloud は2026年4月22日に、Vertex AI を Gemini Enterprise Agent Platform へ移しました。Vertex AI Pipelines は Agent Platform Pipelines、Vertex AI Feature Store は Agent Platform Feature Store になっています。古い記事や社内資料にある Vertex AI の機能は、多くが名前を変えて引き継がれているので、新しい名前で公式ドキュメントを確かめてください。

クラウドのMLOpsを選ぶと、後で移れなくなりますか?

学習のコードとモデルそのものは移しやすい一方、パイプラインの定義・配信の設定・監視の設定はクラウドごとに書き方が違い、移るときに書き直しになります。実験の記録とモデルの管理を MLflow のAPIで書いておけば、SageMaker AI と Azure Machine Learning はどちらも MLflow を受け付けるので、書き直す範囲を小さくできます。

出典

PoCのモデルを本番に出す段で「どの版がどのデータで学習したか分からない」と止まっているなら、最初の記録と版管理の置き場を決めるところから一緒に整理できます。初回相談(30分・無料)で一緒に整理できます。