はじめに
MLflow 3では、GenAIアプリケーションのトレースを長期保存するための方法として、主に2つのアプローチが提供されています。
- Unity Catalogへのトレース保存(OTEL形式)
- トレースのアーカイブ(Production Monitoringの一部)
一見似たような機能に見えますが、目的や仕組みが異なります。本記事では、これらの違いを整理し、ユースケースに応じた使い分けを解説します。
注意
- Unity Catalogへのトレース保存(OTEL形式)は執筆時点ではベータ版です。
- 執筆時点でサポートされているリージョンはAWSの場合、us-east-1、us-west-2です。
機能比較
| 観点 | Unity Catalogへのトレース保存 | トレースのアーカイブ |
|---|---|---|
| 目的 | トレースの主保存先をUCに変更 | エクスペリメントのトレースを長期保存用にコピー |
| データ形式 | OpenTelemetry(OTEL)互換形式 | MLflow標準トレース形式 |
| 取り込みタイミング | リアルタイム | バックグラウンドジョブ(約15分ごと) |
| テーブル構成 | 3テーブル(logs, metrics, spans) | 1テーブル(指定したDeltaテーブル) |
| 設定方法 | mlflow.tracing.set_destination() |
enable_databricks_trace_archival() |
| 主なユースケース | OTELエコシステム統合、UCベースのアクセス制御 | 既存運用の長期保存、スコアラー結果の保存 |
データフローの違い
2つの機能は、トレースがどのように保存されるかという点で根本的に異なります。
Unity Catalog保存の場合:
アプリケーションからのトレースは、MLflowエクスペリメントを経由せず、直接Unity Catalogテーブルに書き込まれます。リアルタイムでの取り込みが可能で、OTELフォーマットを採用しているため、他のOpenTelemetryツールとの互換性があります。
トレースアーカイブの場合:
アプリケーションからのトレースは、まずMLflowエクスペリメントに保存されます。その後、バックグラウンドジョブが約15分ごとに実行され、トレースとその評価結果(スコアラーのアセスメント)をDeltaテーブルにコピーします。
Unity Catalogへのトレース保存
概要
この機能は、MLflowトレースをOpenTelemetry互換形式でUnity Catalogテーブルに直接保存します。主な利点は以下の通りです。
- Unity Catalogのスキーマ・テーブル権限によるアクセス制御
- OTEL形式による外部ツールとの互換性
- Databricks SQLによる直接クエリが可能
- 無制限のトレース保存(Deltaテーブルの容量まで)
前提条件
- Unity Catalog対応のワークスペース
- Databricks SQLウェアハウス
- MLflow 3.8.0以降
- 対応リージョン:
us-east-1,us-west-2(ベータ期間中)
セットアップ手順
1. UCテーブルの作成とエクスペリメントのリンク
import os
import mlflow
from mlflow.entities import UCSchemaLocation
from mlflow.tracing.enablement import set_experiment_trace_location
mlflow.set_tracking_uri("databricks")
# SQLウェアハウスIDを指定
os.environ["MLFLOW_TRACING_SQL_WAREHOUSE_ID"] = "<SQL_WAREHOUSE_ID>"
# エクスペリメント名を指定
experiment_name = "/Workspace/Users/takaaki.yayoi@databricks.com/20260128_trace_uc/uc_trace"
# Unity Catalogのカタログ・スキーマを指定
catalog_name = "takaakiyayoi_catalog"
schema_name = "agent_trace"
# エクスペリメントの作成または取得
if experiment := mlflow.get_experiment_by_name(experiment_name):
experiment_id = experiment.experiment_id
else:
experiment_id = mlflow.create_experiment(name=experiment_name)
print(f"Experiment ID: {experiment_id}")
# エクスペリメントをUCスキーマにリンク
result = set_experiment_trace_location(
location=UCSchemaLocation(catalog_name=catalog_name, schema_name=schema_name),
experiment_id=experiment_id,
)
print(result.full_otel_spans_table_name)
Experiment ID: 3820355417699380
2026/01/27 20:46:18 INFO mlflow.tracing.enablement: Successfully configured storage location for experiment `3820355417699380` to Databricks storage at UCSchemaLocation(catalog_name='takaakiyayoi_catalog', schema_name='agent_trace', _otel_spans_table_name='mlflow_experiment_trace_otel_spans', _otel_logs_table_name='mlflow_experiment_trace_otel_logs')
takaakiyayoi_catalog.agent_trace.mlflow_experiment_trace_otel_spans
2. 作成されるテーブルの確認
セットアップが完了すると、指定したスキーマに以下の3つのテーブルが作成されます。また、これらのテーブルを対象としたビューも作成されています。
mlflow_experiment_trace_otel_logsmlflow_experiment_trace_otel_metricsmlflow_experiment_trace_otel_spans
3. トレースの記録
import mlflow
from mlflow.entities import UCSchemaLocation
mlflow.set_tracking_uri("databricks")
catalog_name = "<UC_CATALOG_NAME>"
schema_name = "<UC_SCHEMA_NAME>"
# 保存先をUCスキーマに設定
mlflow.tracing.set_destination(
destination=UCSchemaLocation(
catalog_name=catalog_name,
schema_name=schema_name,
)
)
# トレースを記録するサンプル関数
@mlflow.trace
def sample_function(x):
return x + 1
# 実行
result = sample_function(100)
print(f"Result: {result}")
4. UIでのトレース確認
MLflowエクスペリメントUIの「Traces」タブでトレースを確認できます。SQLウェアハウスを選択して、UCテーブルからトレースを取得します。
5. SQLでのクエリ
Databricks SQLを使用して、トレースデータを直接クエリできます。
SELECT
trace_id,
span_id,
name,
start_time_unix_nano,
end_time_unix_nano,
attributes
FROM takaakiyayoi_catalog.agent_trace.mlflow_experiment_trace_otel_spans
ORDER BY start_time_unix_nano DESC
LIMIT 10
| trace_id | span_id | name | start_time_unix_nano | end_time_unix_nano | attributes |
|---|---|---|---|---|---|
| 2d97d5af119507f0b52838b451cfbe89 | 606f187d0ce4b55c | test | 1769546880948103313 | 1769546881282770989 | {"mlflow.traceRequestId":"trace:/takaakiyayoi_catalog.agent_trace/2d97d5af119507f0b52838b451cfbe89","mlflow.spanFunctionName":"test","mlflow.spanInputs":"{"x":100}","mlflow.spanType":"UNKNOWN","mlflow.spanOutputs":"101"} |
権限設定
UCテーブルへの読み書きには、以下の権限が必要です。
- カタログに対する
USE_CATALOG - スキーマに対する
USE_SCHEMA - 各テーブルに対する
MODIFYおよびSELECT
ALL_PRIVILEGESでは不十分です。MODIFYとSELECTを明示的に付与する必要があります。
トレースのアーカイブ
概要
トレースのアーカイブは、Production Monitoringの一部として提供される機能です。MLflowエクスペリメントに記録されたトレースと、それに付随するスコアラーの評価結果を、Unity Catalog Deltaテーブルに長期保存します。
主な特徴:
- MLflowエクスペリメントからのトレースを自動的にDeltaテーブルにコピー
- スコアラーによる評価結果(アセスメント)も一緒に保存
- 約15分ごとにバックグラウンドジョブで同期
- トレースサイズの制限なし
セットアップ手順
アーカイブの有効化
from mlflow.tracing.archival import enable_databricks_trace_archival
# 特定のエクスペリメントのトレースをアーカイブ
enable_databricks_trace_archival(
delta_table_fullname="my_catalog.my_schema.archived_traces",
experiment_id="YOUR_EXPERIMENT_ID",
)
アーカイブの無効化
from mlflow.tracing.archival import disable_databricks_trace_archival
# アーカイブを停止
disable_databricks_trace_archival(experiment_id="YOUR_EXPERIMENT_ID")
Production Monitoringとの連携
トレースアーカイブは、Production Monitoringのスコアラー機能と組み合わせて使用することで真価を発揮します。
from mlflow.genai.scorers import Safety, ScorerSamplingConfig
# スコアラーを登録・開始
safety_judge = Safety().register(name="safety_check")
safety_judge = safety_judge.start(
sampling_config=ScorerSamplingConfig(sample_rate=1.0)
)
# アーカイブを有効化
# → トレースとスコアラーの評価結果がDeltaテーブルに保存される
どちらを選ぶべきか?
Unity Catalogへのトレース保存が適しているケース
- OpenTelemetryエコシステムの他ツールと連携したい
- UCの権限管理でトレースへのアクセスを制御したい
- リアルタイムでトレースをクエリ・分析したい
- サードパーティのOTELクライアントからトレースを送信したい
トレースアーカイブが適しているケース
- 既存のMLflowエクスペリメントベースの運用を維持したい
- Production Monitoringのスコアラー評価結果も一緒に保存したい
- 15分程度の遅延が許容できる
- シンプルな1テーブル構成で管理したい
併用も可能
両方の機能は排他的ではありません。要件に応じて、以下のような構成も可能です。
- 開発環境: MLflowエクスペリメント + トレースアーカイブ
- 本番環境: Unity Catalog直接保存(OTEL形式)
制限事項
Unity Catalogへのトレース保存
- 取り込みレート: ワークスペースあたり100トレース/秒、テーブルあたり100MB/秒
- 2TB超のデータでUIパフォーマンスが低下する可能性
- 個別トレースの削除はSQLで直接実行が必要
- ベータ期間中は対応リージョンが限定
トレースアーカイブ
- 同期間隔は約15分(リアルタイムではない)
- Production Monitoringが有効なワークスペースが必要
まとめ
MLflow 3では、トレースの長期保存に2つのアプローチが用意されています。
| 選択基準 | Unity Catalog保存 | トレースアーカイブ |
|---|---|---|
| リアルタイム性重視 | ✅ | - |
| OTEL互換性重視 | ✅ | - |
| スコアラー結果も保存 | - | ✅ |
| シンプルな構成 | - | ✅ |
ユースケースに応じて適切な方法を選択し、GenAIアプリケーションの可観測性を確保しましょう。

