はじめに:MLのビジネス横展開が生んだ「接続の欠如」
Netflixは10年前、パーソナライゼーション(Personalization)という単一ドメインにMLを集中させていました。しかし現在では、スタジオ(Studio)、決済(Payments)、広告(Ads)など、全社的にMLが活用されています。各ドメインは異なる技術スタック、ビジネスメトリクス、組織構造で独立して運用されています。
このMLの拡散に伴い、「モデルのブラックボックス化」 という問題が発生しました。どの特徴量(Feature)がどのモデルで使われているのか、どのA/Bテストがどのモデルを使用しているのか、パイプラインが変更されたらどのモデルが影響を受けるのか、まったく把握できない状態でした。ML実践者は複数のシステム(モデルレジストリ、パイプラインオーケストレーター、実験プラットフォーム)を行き来しながら、手動で情報を追跡する必要がありました。
本稿では、Netflixがこの問題をどのように Metadata Service(MDS) と Model Lifecycle Graph で解決したのか、そのアーキテクチャと設計原則を実務者の視点から分析します。

MDSの核心:イベント → エンティティ → グラフ
MDSは大きく5つのステップで動作します。各ステップを実際の例と共に見ていきましょう。
1. イベント収集(Event Ingestion)
各ソースシステム(Kafka、AWS SNS/SQS)は、「何が起こったか」のみを通知する薄い(thin)イベントを発行します。
# 例:モデルインスタンス作成イベント
{
"event_type": "model_instance_created",
"instance_id": "ranking-model-v5-20250101",
# ... 必要最小限の識別情報のみ
}
設計上の重要なポイント: イベントは「変更通知」であって「変更ログ」ではありません。ソースシステムはイベントを一つ投げるだけでよく、MDSが必要に応じてソースシステムのAPIを呼び出し最新状態を取得します。これにより、イベントの順序が入れ替わったり、消失したりしても問題ありません。
2. エンティティ補強(Entity Enrichment)
MDSはイベントを受信すると、ソースシステムのAPIを呼び出して完全な現在状態を取得します。
# MDSがModel Registry APIを呼び出し
GET /api/v1/instances/ranking-model-v5-20250101
# 応答(一部フィールドのみ表示)
{
"id": "ranking-model-v5-20250101",
"pipeline_run_id": "train-weekly-ranking-20250101",
"owner_emails": ["alice@netflix.com"],
"labels": [{"key": "team", "value": "personalization"}]
}
3. データ正規化(Normalization)
ソースシステムごとに異なるスキーマと意味を統一モデルに変換します。
# 正規化されたMDSエンティティ
{
"id": "aip://model/registry/ranking-model-v5-20250101",
"pipeline_run": "aip://pipeline-run/orchestrator/train-weekly-ranking-20250101",
"entity_type": "ModelInstance",
"owners": ["aip://user/identity/alice"],
"tags": [{"tag": "team", "value": "personalization"}]
}
変換ルール:
- プラットフォーム別ID → グローバルAIP URI(
aip://<domain>/<provider>/<id>) owner_emails→owners(解決済みユーザーURI)labels→tagspipeline_run_id→ エンティティ参照(pipeline_run)
4. 保存とインデキシング(Storage & Indexing)
正規化されたエンティティは Datomic と Elasticsearch に同時に保存されます。
- Datomic: グラフ探索用。モデル → 特徴量 → データソースへと続く複雑な関係クエリを単一クエリで処理します。
- Elasticsearch: 検索用。全文検索、ファジーマッチング、複合フィルタリングをサポートします。
5. 知識補強とグラフ形成(Knowledge Enrichment)
最も重要なステップです。バックグラウンドジョブが定期的に実行され、ソースシステムが知らない関係を推論し、グラフにエッジ(edge)を追加します。
例:モデルとA/Bテストの接続
# Step 1: モデルが参照するpipeline_run_idを通じてパイプラインを照会
GET /api/v1/pipeline-runs/train-weekly-ranking-20250101
# 応答
{
"run_id": "train-weekly-ranking-20250101",
"pipeline": "weekly-ranking-trainer",
"ab_test_cells": [
{"test_id": "12345", "cell_number": 2, "cell_name": "treatment_ranking_v5"}
]
}
# Step 2: 実験プラットフォームでA/Bテスト詳細を照会
GET /api/v1/tests/12345
# 応答
{
"test_id": "12345",
"name": "Ranking Model v5 vs v4",
"status": "ACTIVE",
"cells": [{"cell_number": 1, "name": "control_ranking_v4"}, ...]
}
# Step 3: 関係推論とグラフへの反映
# Model Instance → Pipeline Run → A/B Test Cell → A/B Test
このプロセスにより、MDSは以下のような質問に 単一クエリ で回答できるようになります:
query {
model(id: "aip://model/registry/ranking-model-v5-20250101") {
name
owners { name }
currentInstance {
version
pipeline {
name
owners { name }
}
features {
edges {
node {
name
data { edges { node { name } } }
}
}
}
associatedAbTests {
name
cells { number name }
}
}
}
}

この技術の限界または注意点
- ツール増加に伴う統合負荷: 新しいMLツールが登場するたびにMDSへの統合が必要です。プラグインアーキテクチャを設計しないと、管理ポイントが増えるだけで逆効果になる可能性があります。
- メタデータ品質: ソースシステムがイベントを欠落させたり、所有権情報が古くなったりすると、グラフの信頼性が低下します。自動検証および補強システムが必須です。
- レイテンシー: 非同期補強ジョブにより、関係がグラフに反映されるまでに数分の遅延が発生する可能性があります。リアルタイム性が重要なワークフローではこの点を考慮する必要があります。
- クエリの複雑性: Datomicの不変ファクトモデルは強力ですが、学習曲線があります。チーム内にDatomicに精通したエンジニアが必要です。
次のステップ学習方向性
- Datomic のデータモデルとクエリパターンの学習
- OpenLineage や Marquez などのオープンソースデータ系統ツールの探索
- MLflow や Kubeflow のメタデータストアとMDSアーキテクチャの比較分析

結論:MLエコシステムの「接続」こそが生産性向上の鍵
NetflixのMDS事例は、MLインフラが単なる「モデルをデプロイするパイプライン」を超えて、「すべてのMLアセットを発見・再利用可能にする接続されたエコシステム」 へと進化すべきであることを示しています。
主要な教訓をまとめると:
- URIベースのグローバル識別: すべてのMLアセットを一意に識別できる仕組みを最初に設計する。
- イベントは「通知」としてのみ使用: イベントの順序に依存せず、必要な時にソースシステムから最新状態を読み取る。
- 非同期補強で関係を推論: ソースシステムが知らない関係をバックグラウンドで推論し、グラフを完成させる。
- 検索と探索の分離: Elasticsearchで高速検索を、グラフDB(Datomic)で深い探索をサポートする。
もし今すぐMLモデルの系統(Lineage)を一目で把握できるシステムがないなら、MDSのアプローチを参考に小規模からでも始めてみることをお勧めします。「モデルがどのように作られ、誰が使い、何に影響を受けるか」 を知ることが、ML組織の成熟度を一段階引き上げる第一歩です。