エージェントの可観測性と品質に関するFAQ
Q: Databricks のマネージド MLflow とオープンソース MLflow の違いは何ですか?
Databricks の Managed MLflow は、 オープンソースの MLflow と同じもの であり、トレーシング、評価、LLM ジャッジ、スコアラー、プロンプト レジストリ、人間のフィードバックはすべてオープンソースの APIs であるため、データとコードのポータビリティが維持されます。Databricks がお客様に代わって実行およびガバナンスを行い、その上にプラットフォーム機能を追加します。オープンソースプロジェクトを置き換えたり、フォークしたりするものではありません。
機能 | オープンソースの MLflow | Databricks のマネージド型 MLflow |
|---|---|---|
データモデル、APIs、および SDK | はい | はい — 同一であるため、データとコードのポータビリティが維持されます |
トレーシング、自動ログ記録、およびトレース UI | はい | はい |
評価: | はい | はい |
プロンプト レジストリ | はい | はい |
人間によるフィードバックとラベリング | はい | はい。さらに、ホスト型レビューアプリ — ワークスペースにアクセスできないレビュー担当者向けのチャットUIおよびエキスパート・ラベリングUI — も含まれます。 |
ホスティングとストレージ | セルフホスト:トラッキングサーバーをランし、バックエンドを選択します | フルマネージド。トレースとエクスペリメントはUnity Catalog Deltaテーブルに保存され、ガバナンスが適用され、SQLでクエリを実行でき、エクスペリメントごとの制限はありません |
ガバナンス、セキュリティ、および監査 | 独自のセットアップ | ワークスペースと Unity Catalog の権限、ユーザー代行認証、およびシステムテーブルの監査ログ |
AI アシスタントと自然言語分析 | AIアシスタント(ベータ) — 独自のモデルプロバイダーまたはコーディングエージェント(Claude Codeなど)を持ち込みます | モデルの設定不要で、Genie Code、AI/BIダッシュボード、および Databricks SQL をトレースに対してマネージドで利用できます — |
本番運用のモニタリング | ラン スコアラーを自分自身でアドホックに実行する | ライブトラフィックのサンプルを継続的にスコアリングするマネージドサービス |
CI/CD と MLOps | コア APIs とモデルレジストリ | 宣言型オートメーションバンドル、MLOps スタック、およびデプロイジョブ |
データは常にユーザーのものです。データモデルと APIs は完全にオープンソースであるため、MLflow データをどこにでもエクスポートして使用できます。詳細については、Managed MLflow 製品ページをご覧ください。
Q: トレーシングによって生じるレイテンシーのオーバーヘッドはどれくらいですか?
トレースは、パフォーマンスへの影響を最小限に抑えるために非同期的に書き込まれます。ただし、トレースでは、特にトレース・サイズが大きい場合に、遅延が最小限に抑えられます。MLflow では、アプリケーションをテストして、レイテンシの影響のトレースを理解してから、本番運用にデプロイすることをお勧めします。
次の表は、トレース サイズによる待機時間の影響の概算を示しています。
要求あたりのトレース サイズ | 応答速度の遅延 (ミリ秒) への影響 |
|---|---|
~10キロバイト | ~1ミリ秒 |
~1メガバイト | 50 ~ 100 ミリ秒 |
10MB | 150ミリ秒~ |
Q:MLflow Tracing のDatabricks のレート制限とクォータとは何ですか?
Databricksワークスペース内でMLflow Tracing使用する場合、サービスの安定性と公正な使用を確保するためにクォータとレート制限が適用されます。 リソース制限を参照してください。
Q: MLflow UI でトレースを開くことができません。どうしたらいいでしょう。
MLflow UI でトレースが表示されない理由は複数考えられます。
-
トレースがまだ完了していない : トレースがまだ収集されている場合、MLflow は UI にスパンを表示できません。すべてのスパンが「OK」または「ERROR」ステータスで適切に終了していることを確認します。
-
ブラウザーのキャッシュが古い : MLflow を新しいバージョンにアップグレードすると、ブラウザーのキャッシュに古いデータが含まれ、UI にトレースが正しく表示されない可能性があります。ブラウザのキャッシュをクリアし (Shift+F5)、ページを更新します。
Q:メトリクスをログに記録しましたが、「traces: 0」と表示されます。問題の発生理由は?
mlflow.log_metric()、mlflow.log_param()、および mlflow.start_run() は、 MLflowトレース とは異なる概念である MLflowラン を作成します。ランは、エクスペリメントの Runs tabに表示されます。トレースは [Traces] tab に表示されます。それらは独立しています。メトリクスを記録してもトレースは作成されず、トレースにランのコンテキストは必要ありません。
トレースを生成するには、自動トレースを使用します(例:mlflow.openai.autolog()、mlflow.langchain.autolog())または手動トレース(例:@mlflow.trace、mlflow.start_span())。これらのいずれかが呼び出され、計測されたコードが実行されるまで、「Traces」tabは空のままです。
呼び出した内容 | 表示場所 |
|---|---|
| ラン tab |
| 「Traces tab」 |
| 「Traces tab」 |
| 「Traces tab」 |
質問:トレースリストで、IDを指定して特定のトレースを見つけることができません。どうすればいいですか?
デフォルトでは、トレースリストには最新の1,000件のトレースが表示されます。古いトレースがこの期間外の場合、トレースIDが一致しても検索結果には表示されません。
古いトレースを検索するには、時間範囲フィルターを絞り込んで、結果の表示範囲を狭めます。追跡情報がその特定の期間における直近1,000件のエントリ内に含まれると、ID検索によって検出されます。拡張メント ID とトレース ID がわかっている場合は、直接ナビゲートすることもできます: <workspace-url>/ml/experiments/<experiment-id>/traces/<trace-id> 。
Unity Catalog にないエクスペリメントも、合計で100,000トレースに制限されます。スケーラブルでガバナンスが適用され、トレース制限のないSQLクエリ可能なストレージには、DatabricksはUnity Catalogにトレースを保存することを推奨しています。既存のエクスペリメントのトレースを移動するには、Unity Catalogのトレースに移行してください。
Q: モデルの実行が停止し、トレースが永遠に「進行中」になります。
モデルまたはエージェントが長時間実行される操作や無限ループに陥り、トレースが「進行中」状態のままになることがあります。
これを防ぐには、 MLFLOW_TRACE_TIMEOUT_SECONDS 環境変数を使用してトレースのタイムアウトを設定します。トレースがタイムアウトを超えた場合、MLflow は ERROR ステータスでトレースを自動的に停止し、バックエンドにエクスポートするため、スパンを分析して問題を特定できます。デフォルトでは、タイムアウトは設定されていません。
タイムアウトは MLflow トレースにのみ適用されます。メイン・プログラム、モデル、またはエージェントは、トレースが停止しても実行を続けます。
たとえば、次のコードでは、タイムアウトを 5 秒に設定し、MLflow が実行時間の長い操作を処理する方法をシミュレートします。
import mlflow
import os
import time
# Set the timeout to 5 seconds for demonstration purposes
os.environ["MLFLOW_TRACE_TIMEOUT_SECONDS"] = "5"
# Simulate a long-running operation
@mlflow.trace
def long_running():
for _ in range(10):
child()
@mlflow.trace
def child():
time.sleep(1)
long_running()
MLflow は、バックグラウンド スレッドでトレースの実行時間と有効期限を監視します。デフォルトでは、このチェックは毎秒実行され、リソースの消費はごくわずかです。間隔を調整する場合は、 MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS 環境変数を設定できます。
Q: マルチスレッドを実行すると、トレースが複数のトレースに分割されます。それらを 1 つのトレースに結合するにはどうすればよいですか?
MLflow Tracing Python ContextVar に依存するため、各スレッドはデフォルトで独自のトレース コンテキストを持ちますが、いくつかの追加ステップでマルチスレッド アプリケーション用の単一のトレースを生成することが可能です。 詳細については、マルチスレッドのセクションを参照してください。
Q: トレースを一時的に無効にするにはどうすればいいですか?
トレースを 無効に するために、 mlflow.tracing.disable API は MLflow 内からのトレース データの収集を停止し、ログを記録しません
トレースに関する MLflow Tracking サービスへのデータ。
トレース を有効にする ために (一時的に無効になっていた場合)、API はインストルメント化されたモデルのトレース機能を再度有効にします mlflow.tracing.enable
呼び出されます。
Q: トレース検索結果がmlflow.search_traces()に対して大きすぎます。大規模にトレースを検索するにはどうすればいいですか?
MLflow API は、 MlflowClient.search_traces()メソッドを通じてページ区切りを提供します。ただし、ページ区切りを必要としないユースケースでは、より多くの機能と便利なデフォルトを提供するため、 mlflow.search_traces()が推奨されます。
本番運用における大規模なトレース分析では、一般的に 本番運用モニタリング を使用して Unity Catalog の Delta テーブルにトレースをログ記録することが最適です。本番運用のトレーシングに関するガイダンスについては、トレーシングの概要 を参照してください。
Q:コードを変更せずにトレーシングを有効または無効にできますか?
はい。MLFLOW_TRACING_ENABLED環境変数を設定します。
# Disable tracing
export MLFLOW_TRACING_ENABLED=false
# Enable tracing (if previously disabled)
export MLFLOW_TRACING_ENABLED=true
これにより、コードを変更せずにランタイムでトレースの有効化と無効化を切り替えることができるため、テストや特定の環境でのトレースの選択的な無効化に便利です。
Q: MLflow Tracing は async および await コードで動作しますか?
はい。@mlflow.trace デコレーターは、非同期関数とシームレスに連携します。
import mlflow
@mlflow.trace
async def my_async_function(query: str):
result = await some_async_operation(query)
return result
# Call it
await my_async_function("hello")
Q: Jupyter ノートブックで直接トレースを表示できますか?
はい。MLflow 2.20 以降では、次の条件を満たすと、Jupyter ノートブック内でトレース UI が自動的にレンダリングされます。
- コードがトレースを生成します(オートログまたは
@mlflow.traceを使用)。 mlflow.search_traces()を呼び出して、トレースを DataFrame として表示します。
ノートブック UI には、Databricks ワークスペース UI と同様のトレースの詳細と探索ツールが表示されます。
Q: MLflow Tracing は他のオブザーバビリティツールと互換性がありますか?
はい。MLflow Tracing は OpenTelemetry (OTel) 標準に基づいて構築されているため、特定のベンダーに依存しません。OTLP (OpenTelemetry Protocol) エクスポートを使用して、トレースを他のオブザーバビリティシステム (Jaeger、Datadog、New Relic など) にエクスポートできます。構成の詳細については、OTel エクスポートを参照してください。
Q: トレースの最大サイズはいくつですか?
トレースのサイズが大きくなることがあり、レイテンシへの影響はサイズによって異なります。MLflow では、影響を把握するためにアプリケーションをテストすることをお勧めします。
要求あたりのトレース サイズ | レイテンシーの影響 |
|---|---|
~10キロバイト | 約1 ミリ秒 |
~1MB | 50–100 ミリ秒 |
~10 MB | 150+ ミリ秒 |
本番運用でトレースサイズを最適化するには、カスタムスパンプロセッサを使用して、エクスポート前に機密データをフィルタリングまたはマスクします。
Q: マルチスレッドを使用しているときに、トレースが複数のトレースに分割されるのはなぜですか?
トレース tab には、各スレッドが独自のトレースコンテキストを持つため、処理が1つのトレースではなく複数の個別のトレースとして表示されます。すべてを1つのトレースにまとめるには、コンテキストをワーカー スレッドに伝播します:
import contextvars
from concurrent.futures import ThreadPoolExecutor
import mlflow
@mlflow.trace
def main_task():
ctx = contextvars.copy_context()
with ThreadPoolExecutor() as executor:
# Pass the copied context to worker threads
executor.submit(ctx.run, worker_task)
def worker_task():
# This runs in the copied context, preserving the trace
print("I'm in the same trace as the parent")
main_task()
または、mlflow.tracing.set_destination()とcontext_local=Falseを使用して、アプリからのすべてのスパンを単一のエクスペリメントとトレースにLogsします。