ワークスペースとプラットフォーム間で MLflow モデルを管理する

運用環境の機械学習には、優れたモデルのトレーニング以上のものが必要です。 モデルを開発から検証から運用環境に移行するには、信頼性の高いワークフローが必要です。 Microsoft Fabricでのワークスペース間のログ記録では、次の 2 つの主要なシナリオが可能になります。

  • エンドツーエンドの MLOps ワークフローを構築します。 開発ワークスペースでトレーニングと実験を行い、テスト ワークスペースで検証し、標準 MLflow API を使用して運用サービス ワークスペースにデプロイします。 この環境の分離により、チームは品質ゲートを適用し、実験から運用環境まで明確な監査証跡を維持できます。

  • 既存の機械学習資産を Fabric に作成します。 Azure Databricks、Azure Machine Learning、ローカル環境、または MLflow をサポートするその他のプラットフォームでモデルを既にトレーニングしている場合は、それらの実験とモデルをFabric ワークスペースに直接記録できます。 トレーニング パイプラインを再構築することなく、機械学習成果物を 1 か所に簡単に統合できます。

ワークスペース間のログ記録は、synapseml-mlflow パッケージを介して機能し、Fabric互換性のある MLflow 追跡プラグインを提供します。 ターゲット ワークスペースで認証し、追跡 URI を設定し、標準の MLflow コマンドを使用します。

ワークスペース間のログ記録では、 コード優先エクスペリエンスに重点を置いています。 ワークスペース間シナリオの UI 統合は、今後のリリースで対処される予定です。

前提条件

Fabricノートブックのシナリオでは、コードを実行する前に、新しいノートブックを作成し、lakehouse をアタッチします。

ヒント

ワークスペース間のログ記録は、 送信アクセス保護 が有効になっているワークスペースでサポートされています。 別のワークスペースへのワークスペース間のログ記録には、マネージド プライベート エンドポイントが必要です。 同じワークスペース内および外部からのログ記録Fabricは、追加の構成なしで機能します。

MLflow プラグインをインストールする

synapseml-mlflow パッケージでは、Fabric MLflow 追跡プラグインを提供することで、ワークスペース間のログ記録が可能になります。 環境に基づいてインストール コマンドを選択します。

Important

MLflow 3 は現在サポートされていません。 mlflow-skinnyをバージョン 2.22.2 以前にピン留めする必要があります。

Fabric ノートブックの場合は、次のコマンドを使用して、オンライン ノートブックの依存関係を含むパッケージをインストールします。

%pip install -U "synapseml-mlflow[online-notebook]" "mlflow-skinny<=2.22.2"

インストール後、残りのコードを実行する前にカーネルを再起動します。

MLflow オブジェクトを別のFabric ワークスペースに記録する

このシナリオでは、1 つのFabric ワークスペース (ソース) でノートブックを実行し、実験とモデルを別のFabric ワークスペース (ターゲット) に記録します。

ターゲット ワークスペースを設定する

MLFLOW_TRACKING_URI環境変数を設定して、ターゲット ワークスペースをポイントします。

import os

target_workspace_id = "<your-target-workspace-id>"
target_uri = f"sds://api.fabric.microsoft.com/v1/workspaces/{target_workspace_id}/mlflow"
os.environ["MLFLOW_TRACKING_URI"] = target_uri

実験とモデルをログに記録する

実験を作成し、パラメーター、メトリック、モデルを使用して実行をログに記録します。

import mlflow
import mlflow.sklearn
import numpy as np
from sklearn.linear_model import LogisticRegression
from mlflow.models.signature import infer_signature

# Create or set the experiment in the target workspace
EXP_NAME = "my-cross-workspace-experiment"
MODEL_NAME = "my-cross-workspace-model"
mlflow.set_experiment(EXP_NAME)

with mlflow.start_run() as run:
    lr = LogisticRegression()
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr.fit(X, y)

    score = lr.score(X, y)
    signature = infer_signature(X, y)

    mlflow.log_params({
        "objective": "classification",
        "learning_rate": 0.05,
    })
    mlflow.log_metric("score", score)

    mlflow.sklearn.log_model(lr, "model", signature=signature)

    mlflow.register_model(
        f"runs:/{run.info.run_id}/model",
        MODEL_NAME
    )

実行が完了すると、実験と登録されたモデルがターゲット ワークスペースに表示されます。

Fabric ワークスペース間で MLflow オブジェクトを移動する

このシナリオでは、まずソース ワークスペースにオブジェクトをログに記録し、次に成果物をダウンロードして、ターゲット ワークスペースに再度ログを記録します。 この方法は、トレーニング済みのモデルを開発ワークスペースから運用ワークスペースに昇格させる必要がある場合に便利です。

手順 1: ソース ワークスペース内のオブジェクトをログに記録する

import mlflow
import mlflow.sklearn
import numpy as np
from sklearn.linear_model import LogisticRegression
from mlflow.models.signature import infer_signature

# Log to the current (source) workspace
EXP_NAME = "source-experiment"
mlflow.set_experiment(EXP_NAME)

with mlflow.start_run() as run:
    lr = LogisticRegression()
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr.fit(X, y)

    signature = infer_signature(X, y)
    mlflow.sklearn.log_model(lr, "model", signature=signature)

    source_run_id = run.info.run_id

手順 2: ソース実行から成果物をダウンロードする

import mlflow.artifacts

# Download the model artifacts locally
local_artifact_path = mlflow.artifacts.download_artifacts(
    run_id=source_run_id,
    artifact_path="model"
)

手順 3: 成果物をターゲット ワークスペースに再ログする

import os

target_workspace_id = "<your-target-workspace-id>"
target_uri = f"sds://api.fabric.microsoft.com/v1/workspaces/{target_workspace_id}/mlflow"
os.environ["MLFLOW_TRACKING_URI"] = target_uri

TARGET_EXP_NAME = "promoted-experiment"
TARGET_MODEL_NAME = "promoted-model"
mlflow.set_experiment(TARGET_EXP_NAME)

with mlflow.start_run() as run:
    mlflow.log_artifacts(local_artifact_path, "model")
    mlflow.register_model(
        f"runs:/{run.info.run_id}/model",
        TARGET_MODEL_NAME
    )

Fabricの外部から MLflow オブジェクトをログに記録する

MLflow の実験とモデルは、モデルを構築する任意の環境からFabric ワークスペースにログに記録できます。

  • ローカル コンピューター。 VS Code、Jupyter Notebook、またはローカル Python環境。
  • Azure Databricks。 Azure Databricksのノートブックとジョブ。
  • Azure Machine Learning。 Azure Machine Learning のコンピューティング インスタンスおよびパイプライン。
  • その他のプラットフォーム。 Pythonと MLflow をサポートするすべての環境。

手順 1: パッケージをインストールする

環境に synapseml-mlflow パッケージをインストールします。

pip install -U "synapseml-mlflow" "mlflow-skinny<=2.22.2"

手順 2: Fabricで認証する

環境に基づいて認証方法を選択します。

VS Code や Jupyter などのブラウザー アクセスを使用するローカル開発環境では、この方法を使用します。

from fabric.analytics.environment.credentials import SetFabricAnalyticsDefaultTokenCredentialsGlobally
from azure.identity import DefaultAzureCredential

SetFabricAnalyticsDefaultTokenCredentialsGlobally(
    credential=DefaultAzureCredential(exclude_interactive_browser_credential=False)
)

手順 3: ターゲット ワークスペースとログ MLflow オブジェクトを設定する

認証後、標準の MLflow API を使用して、ターゲット Fabric ワークスペースとログの実験とモデルを指す追跡 URI を設定します。

import os
import mlflow
import mlflow.sklearn
import numpy as np
from sklearn.linear_model import LogisticRegression
from mlflow.models.signature import infer_signature

target_workspace_id = "<your-target-workspace-id>"
target_uri = f"sds://api.fabric.microsoft.com/v1/workspaces/{target_workspace_id}/mlflow"
os.environ["MLFLOW_TRACKING_URI"] = target_uri

EXP_NAME = "external-experiment"
MODEL_NAME = "external-model"
mlflow.set_experiment(EXP_NAME)

with mlflow.start_run() as run:
    lr = LogisticRegression()
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr.fit(X, y)

    signature = infer_signature(X, y)
    mlflow.log_metric("score", lr.score(X, y))
    mlflow.sklearn.log_model(lr, "model", signature=signature)

    mlflow.register_model(
        f"runs:/{run.info.run_id}/model",
        MODEL_NAME
    )

ワークスペース間ログ記録の利用を送信アクセス保護を利用して行う

ワークスペース で送信アクセス保護 が有効になっている場合、ワークスペース間のログ記録には、ソース ワークスペースからターゲット ワークスペースへの ワークスペース間で管理されるプライベート エンドポイント が必要です。

同じワークスペース内のログ記録と、外部Fabric (ローカル コンピューター、Azure Databricks、Azure Machine Learning) からのログ記録は、追加の構成なしで機能します。

サポートされているシナリオと必要な構成の詳細については、「Fabric Data Science のWorkspace 送信アクセス保護を参照してください。

OAP 対応ワークスペースにパッケージをインストールする

標準の %pip install コマンドでは、送信インターネット アクセスが必要です。これは、送信アクセス保護 (OAP) が有効になっているワークスペースでブロックされます。 synapseml-mlflow パッケージをインストールするには、最初に OAP 以外の環境からダウンロードしてから、lakehouse にアップロードします。

  1. インターネットにアクセスできるコンピューターから synapseml-mlflow パッケージをダウンロードします。

    pip download synapseml-mlflow[online-notebook]
    
  2. ダウンロードしたファイルを OAP 対応ワークスペースの lakehouse にアップロードします。 すべての .whl ファイルを lakehouse の [ファイル ] セクションにアップロードします (例: /lakehouse/default/Files)。

  3. Fabric ノートブックの lakehouse パスからインストールします。

    %pip install --no-index --find-links=/lakehouse/default/Files "synapseml-mlflow[online-notebook]>2.0.0" "mlflow-skinny<=2.22.2" --pre
    
  4. マネージド プライベート エンドポイントを使用するように追跡 URI を設定します。 現在のワークスペースで OAP が有効になっている場合は、ソース ワークスペースからターゲット ワークスペースへのクロスワークスペース マネージド プライベート エンドポイント を構成する必要があります。 次に、プライベート エンドポイントを介して追跡 URI をルーティングします。

    import os
    from fabric.analytics.environment.context import FabricContext, InternalContext
    
    context = FabricContext(workspace_id=target_workspace_id, internal_context=InternalContext(is_wspl_enabled=True))
    print(context.pbi_shared_host)
    # You need to set up and use this private endpoint if your current workspace has OAP enabled
    
    os.environ["MLFLOW_TRACKING_URI"] = f"sds://{context.pbi_shared_host}/v1/workspaces/{target_workspace_id}/mlflow"
    

既知の制限

  • 書き込みアクセス許可が必要です。 ターゲット ワークスペースに対する書き込みアクセス許可が必要です。
  • ワークスペース間の系列はサポートされていません。 これらのオブジェクトが異なるワークスペースからログに記録されている場合、ノートブック、実験、モデル間のリレーションシップを表示することはできません。
  • ソース ノートブックはターゲット ワークスペースに表示されません。 ソース ノートブックはターゲット ワークスペースに表示されません。 成果物の詳細とリスト ページでは、ソース ノートブックへのリンクは空です。
  • 項目スナップショットはサポートされていません。 別のワークスペースに記録された機械学習の実験またはモデルは、ソース実行ノートブック項目のスナップショットには表示されません。
  • 大規模な言語モデルはサポートされていません。 ワークスペース間のログ記録では、大規模な言語モデル (LLM) はサポートされていません。