Fabric Data Science における MLflow 3

Microsoft Fabricでは、オープン ソースの機械学習追跡プラットフォームであるバージョン 3.1 までの MLflow がサポートされています。 このサポートにより、次の機能を使用して、Fabricで機械学習と生成 AI ワークロードを追跡および検査できます。

  • MLflow 3 で導入された LoggedModel は、各モデルをソース実行、コード、構成、パラメーター、メトリック、およびデータセットにリンクする最上位のエンティティとして導入されました。
  • 大規模言語モデル (LLM) および生成 AI アプリケーションからのプロンプト、応答、ツール呼び出し、待機時間、トークンの使用状況をキャプチャするトレース

この記事では、MLflow 3 の変更点、Fabricの新機能の使用方法、および MLflow 2.x から移行する方法について説明します。

[Runs]、[Models]、[Traces] の各タブと、[Save logged model] および [Compare logged models] カードを表示した、Fabric の MLflow 3 実験のアニメーション GIF。

前提条件

  • 最新の機械学習追跡エクスペリエンスにアップグレードされたワークスペース。 適格性とアップグレードを確認するには、「 機械学習追跡システムのアップグレード」を参照してください

  • mlflow バージョン 3.0 以降。 Fabricノートブックには既定で MLflow 2.x が付属しているため、ノートブックで次のコマンドを実行して MLflow 3 にアップグレードする必要があります。

    %pip install "synapseml-mlflow[online-notebook]>=2.0.3" "mlflow-skinny==3.1.0" "opentelemetry-api<=1.40.0"
    

    同じコマンドにより、ワークスペース間および外部Fabricシナリオ用のアップグレードされた synapseml-mlflow パッケージもインストールされます。

MLflow 3 の変更点

Area MLflow 2.x MLflow 3
モデル ログ API log_model(model, artifact_path="model") log_model(model, name="my_model", params={...}) (レガシ artifact_path は引き続き機能します)
モデル表現 実行に添付されたアーティファクト ランにリンクされた第一級の LoggedModel エンティティ
実験用UI 単一実験画面 ML 実験AI 実験 の種類に加えて、[ ログに記録されたモデル ] セクションと [ トレース ] タブ
生成 AI の可観測性 該当なし プロンプト、応答、ツール呼び出し、待機時間、トークンのトレース

MLflow 3 は、MLflow 2.x ワークフローと下位互換性があります。 mlflow>=2を使用する既存の実験、実行、ノートブックは、変更なしで引き続き動作します。

実験の種類を選択する

実験を作成すると、リボンに実験の種類のスイッチが含まれます。

  • ML 実験 — 実行、パラメーター、メトリック、および LoggedModels の従来の追跡サーフェイス。 この種類は、従来の機械学習ワークフローに使用します。
  • AI 実験 — 生成 AI ワークロード用に調整されたトレース優先サーフェス。 [ トレース ] タブは前面と中央にあり、実行詳細ビューではプロンプト、ツール呼び出し、トークンの使用状況が強調されます。

MLflow 3 より前に作成された既存の実験は、既定で ML 実験 の種類になります。 リボンからいつでも型を切り替えることができます。

機械学習実験と AI 実験の種類を切り替える実験リボンドロップダウンのスクリーンショット。

ノートブック テンプレートから開始する

2 つのノートブック テンプレートがリリースに付属しており、ワンクリックで実行できます。 まだ実行されていない実験を開くと、空の実験ページに 2 つのスターター カードが表示されます。

  • 新しいモデル テンプレートparams=get_logged_model()、および LoggedModel とデータセットの両方に関連付けられたメトリックを含む、新しい LoggedModel API を紹介する ElasticNet のエンドツーエンドの例です。
  • 新しいトレース テンプレート - @mlflow.trace デコレーター、Fabric資格情報を使用した OpenAI 自動ログ記録、LangChain エージェント、OpenAI Agents SDK について説明します。

カードを選択して、適切な MLflow プラグインのバージョンと認証で構成済みのノートブックを開きます。

空の実験ページのスクリーンショット。[新しいモデル] テンプレートと [新しいトレース テンプレート] スターター カードが強調表示されています。

LoggedModel を使用してモデルをログに記録する

MLflow 3 では、 log_model() を呼び出すたびに、ソース実行、そのパラメーター、メトリック、およびトレーニング対象のデータセットにリンク された LoggedModel エンティティが作成されます。 次の例では、Iris データセットで ElasticNet モデルをトレーニングし、それを LoggedModel としてログに記録し、評価メトリックをその LoggedModel とデータセットにリンクします。

import pandas as pd
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

import mlflow
import mlflow.sklearn
from mlflow.entities import Dataset

mlflow.set_experiment("mlflow3-logged-model-demo")

def compute_metrics(actual, predicted):
    rmse = mean_squared_error(actual, predicted)
    mae = mean_absolute_error(actual, predicted)
    r2 = r2_score(actual, predicted)
    return rmse, mae, r2

iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df["quality"] = (iris.target == 2).astype(int)
train_df, test_df = train_test_split(iris_df, test_size=0.2, random_state=42)

with mlflow.start_run() as training_run:
    # Wrap the training data as an MLflow Dataset so metrics can be linked to it.
    train_dataset: Dataset = mlflow.data.from_pandas(train_df, name="train")
    train_x = train_dataset.df.drop(["quality"], axis=1)
    train_y = train_dataset.df[["quality"]]

    lr = ElasticNet(alpha=0.5, l1_ratio=0.5, random_state=42)
    lr.fit(train_x, train_y)

    # Log the model. `params=` attaches hyperparameters directly to the LoggedModel.
    model_info = mlflow.sklearn.log_model(
        sk_model=lr,
        name="elasticnet",
        params={"alpha": 0.5, "l1_ratio": 0.5},
        input_example=train_x,
    )

    # Retrieve the LoggedModel to inspect its identifier and parameters.
    logged_model = mlflow.get_logged_model(model_info.model_id)
    print(logged_model.model_id, logged_model.params)

    # Compute metrics and link them to both the LoggedModel and the training dataset.
    predictions = lr.predict(train_x)
    rmse, mae, r2 = compute_metrics(train_y, predictions)
    mlflow.log_metrics(
        metrics={"rmse": rmse, "r2": r2, "mae": mae},
        model_id=logged_model.model_id,
        dataset=train_dataset,
    )

実行が完了すると、モデルは LoggedModel として 2 つの場所に表示されます。

  • 実験ページ の [ログに記録されたモデル ] セクション。
  • 実行の詳細ページの [ ログに記録されたモデル ] タブ。

リンクされた LoggedModel を示す [モデルとトレース] セクションが強調表示されている実行詳細ページのスクリーンショット。

LoggedModel を検査する

一覧から LoggedModel を選択して詳細ページを開きます。 詳細ページには、次の情報が表示されます。

  • モデルに対してキャプチャされたパラメーターメトリック
  • モデルを生成した実行に移動するソース実行リンク。
  • トレーニング中に使用されるデータセット
  • Environment (Python バージョン、依存関係、署名)。

ログに記録されたモデルの一覧が強調表示されている実験ページの [モデル] タブのスクリーンショット。

LoggedModels を比較

[ ログモデル ] セクションで、複数の LoggedModel を選択し、組み込みの折れ線グラフ、散布図、および平行座標を使用して比較します。 LogedModels は、メトリック、パラメーター、タグ、またはメタデータで検索、フィルター処理、並べ替え、グループ化することもできます。

複数のログに記録されたモデルが選択されている [モデル] タブのスクリーンショット。RMSE、bagging_fraction、bagging_freqの折れ線グラフが表示されているメトリック比較パネル。

LoggedModel を登録する

LoggedModel を Fabric ML モデル項目に昇格するには、その詳細ページを開き、Register model を選択します。 新しい ML モデルとして、または既存のモデルの新しいバージョンとして登録できます。 登録後、LoggedModel の詳細ページに登録済みのモデル 項目へのリンクが表示されます。

生成 AI トレースをキャプチャする

トレースは、LLM または生成 AI アプリケーションの実行をスパンの階層としてキャプチャします。 各トレースには、入力、出力、待機時間、トークンの使用状況、およびツールまたは関数の呼び出しが表示されます。 最適なトレース優先エクスペリエンスには、 AI 実験 の種類を使用します。

@mlflow.trace デコレーターを使用して関数をトレースする

任意の関数に @mlflow.trace を追加して、入力、出力、期間を記録します。 mlflow.update_current_trace()を使用して、関数内からタグをアタッチします。

import mlflow
import time

mlflow.set_experiment("mlflow3-trace-demo")

@mlflow.trace
def process_user(user_id, action):
    mlflow.update_current_trace(tags={
        "user_id": user_id,
        "action": action,
        "environment": "production",
    })
    time.sleep(1)
    return f"Processed action {action} for user {user_id}"

with mlflow.start_run(run_name="function_call"):
    process_user(user_id=123, action="login")

デコレータが適用された関数同士が呼び出されると、MLflow はスパンを自動的にネストするため、トレースの詳細ページで呼び出しツリー全体を可視化できます。

OpenAI チャット補完の自動ログ記録

OpenAI クライアントへのすべての呼び出しがデコレーターを追加せずに自動的にトレースされるように、OpenAI 自動ログを有効にします。 次の例では、AzureOpenAIとFabricマネージド資格情報を使用します。

import mlflow
from openai import AzureOpenAI
from synapse.ml.fabric.credentials import get_openai_httpx_sync_client

mlflow.openai.autolog()

client = AzureOpenAI(
    api_version="2025-04-01-preview",
    http_client=get_openai_httpx_sync_client(),
)

with mlflow.start_run(run_name="simple_openai_chat") as run:
    response = client.chat.completions.create(
        model="gpt-4.1",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "What are the main components of MLflow?"},
        ],
        temperature=0.7,
    )
    print(response.choices[0].message.content)
    print(f"Trace ID: {mlflow.get_last_active_trace_id()}")

エージェント フレームワークの場合、MLflow は LangChain (mlflow.langchain.autolog()) と OpenAI Agents SDK の自動ログ記録も提供します。 新しいトレース テンプレートには、複数ターン のツール呼び出し会話など、両方の実行可能な完全な例が含まれています。

トレースを表示する

トレースを表示するには:

  1. 生成 AI の実行を含む実験を開きます。
  2. [ トレース ] タブを選択します。
  3. トレースを選択して、 トレースの詳細 ビューを開きます。

入力と出力を含む実行の詳細、プロパティ、トレースの詳細を示す開かれたトレースのスクリーンショット。

トレース詳細ビューには、次の情報が表示されます。

  • 要求の階層的な内訳を含む スパン ツリー
  • 各スパンの入力、出力、および属性
  • LLM スパン (システム、ユーザー、アシスタント) のプロンプトと応答のペア
  • 待機時間、トークン使用量、モデル メタデータ (名前、バージョン、パラメーター)。
  • ツール呼び出しと関数呼び出し、およびそれらの入力、出力、ドキュメント ID。
  • 失敗したトレース。例外の種類、メッセージ、スタック トレースを含みます。

トレースの一覧には、トレース ID、入力、出力、期間、開始時刻、状態 (完了、失敗、または実行中) が表示されます。 トレースは、ユーザー、状態、または開始時刻でフィルター処理できます。

トレース ID、入力、出力、期間、開始時刻、および状態を示す、開いているトレース一覧のスクリーンショット。

実行によって生成されたトレースは、実行の詳細ページの [ トレース ] タブにも表示されます。

MLflow 2.x からの移行

MLflow 3 は段階的に採用できます。

  • 既存のノートブックは 引き続き変更されずに実行されます。 artifact_pathのレガシ log_model() パラメーターは引き続き動作し、LoggedModel を生成します。
  • 新しいノートブックでは、 わかりやすくするために name パラメーターを使用する必要があります。
  • ワークスペース間のシナリオでは、 アップグレードされた synapseml-mlflow パッケージが使用されます。 mlflow-skinnyを 2.22.2 にピン留めする必要がなくなりました。 インストール手順については、 ワークスペースとプラットフォーム間での MLflow モデルの管理に関するページを参照してください。

まだサポートされていないもの

生成 AI 評価 (mlflow.genai.evaluate()) は、Fabricではまだ有効になっていません。 これは将来のリリースに向けて計画されています。