MLflow モデルをデプロイするためのガイドライン

適用対象: Azure CLI ml 拡張機能 v2 (現行)

この記事では、Azure Machine Learning に MLflow モデルをデプロイしてリアルタイム推論とバッチ推論の両方を行う方法と、デプロイの管理に使用できるさまざまなツールについて説明します。

コードなしのデプロイ

MLflow モデルを Azure Machine Learning にデプロイする際、カスタム モデルのデプロイとは異なり、スコアリング スクリプトや環境を用意する必要はありません。 スコアリング スクリプトと環境は、Azure Machine Learning で自動的に生成されます。 この機能は "コードなしのデプロイ" と呼ばれます。

コードなしのデプロイの場合、Azure Machine Learning では次のことが行われます。

  • MLflow モデルで示されているすべてのパッケージの依存関係が確実に満たされるようにする。
  • 次の項目を含む MLflow 基本イメージまたはキュレーション環境を指定する。
    • Azure Machine Learning で推論を実行するために必要なパッケージ (mlflow-skinny など)。
    • 推論を実行するスコアリング スクリプト。

ヒント

パブリック ネットワーク アクセスのないワークスペース: エグレス接続なしで MLflow モデルをオンライン エンドポイントにデプロイする前に、モデルをパッケージ化する必要があります (プレビュー)。 モデル パッケージを使用することで、 MLflow モデルに必要な Python パッケージを動的にインストールするために必要とされる Azure Machine Learning が必要とするイ ンターネット接続を回避できます。

パッケージと依存関係

Azure Machine Learning では、MLflow モデルで推論を実行する環境が自動的に生成されます。 環境を構築するために、MLflow モデルで指定されている conda 依存関係が Azure Machine Learning によって読み取られ、推論サーバーの実行に必要なすべてのパッケージが追加されます。 これらの追加パッケージは、デプロイの種類によって異なります。

次の conda.yaml ファイルの例は、MLflow モデルで指定された conda 依存関係を示しています。

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

重要

MLflow では、モデルをログ記録する際にパッケージが自動的に検出され、モデルの conda 依存関係にパッケージのバージョンを固定します。 このパッケージの自動検出では、ユーザーの意図や要件が反映されない場合があります。 代わりに、カスタムのシグネチャ、環境、サンプルを使用してモデルのログ記録を行うことができます。

シグネチャを持つモデル

MLflow モデルには、予想される入力とその型を示すシグネチャを含めることができます。 このようなモデルがオンラインまたはバッチ エンドポイントにデプロイされると、Azure Machine Learning では、データ入力の数と種類がシグネチャに準拠していることが確認されます。 入力データを予想どおりに解析できない場合、モデルの呼び出しは失敗します。

MLflow モデルのシグネチャを調べるには、MLmodel ファイルを開きます。 MLflow におけるシグネチャの機能に関する詳細については、「MLflow のシグネチャ」を参照してください。

次の MLmodel ファイルの例では、signature が強調表示されています。

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

ヒント

MLflow モデルのシグネチャはデータ互換性の問題を検出する便利な方法として利用できるため、使用することをお勧めします。 シグネチャを使ってモデルのログを記録する方法の詳細については、「カスタムのシグネチャ、環境、またはサンプルを使ったモデルのログ記録」を参照してください。

MLflow 組み込みサーバーへのデプロイと Azure Machine Learning 推論サーバーへのデプロイ

モデル開発者は、MLflow の組み込みのデプロイ ツールを使用して、モデルをローカルでテストできます。 たとえば、MLflow サーバー レジストリに登録されているモデルのローカル インスタンスを実行するには、mlflow models serve か、MLflow CLI mlflow models predict を使用します。 MLflow 組み込みデプロイ ツールの詳細については、MLflow ドキュメントの組み込みデプロイ ツールに関するセクションを参照してください。

Azure Machine Learning では、オンライン エンドポイントとバッチ エンドポイントの両方へのモデルのデプロイもサポートされています。 これらのエンドポイントでは、さまざまな機能を持つ可能性がある、さまざまな推論テクノロジが実行されます。

  • Azure Machine Learning オンライン エンドポイントは MLflow 組み込みサーバーと似ており、推論のモデルを実行するためのスケーラブルで同期された軽量な方法を提供します。

  • Azure Machine Learning バッチ エンドポイントでは、大量のデータにスケールアップできる実行時間の長い推論プロセスに対して非同期推論を実行することができます。 MLflow サーバーにはこの機能はありませんが、Spark ジョブを使用して同様の機能を実現できます。 バッチ エンドポイントと MLflow モデルの詳細については、「バッチ デプロイで MLflow モデルをデプロイする」を参照してください。

入力形式

次の表は、MLflow 組み込みサーバーと Azure Machine Learning オンライン エンドポイントでサポートされる入力型を示しています。

入力型 MLflow 組み込みサーバー Azure Machine Learning オンライン エンドポイント
分割方向の、JSON でシリアル化された pandas の DataFrame
レコードの方向の、JSON でシリアル化された pandas の DataFrame 非推奨
CSV でシリアル化された pandas の DataFrames バッチ推論を使用。 詳細については、「バッチ デプロイで MLflow モデルをデプロイする」を参照してください。
JSON でシリアル化されたリスト (テンソル) とリストの辞書 (名前付きテンソル) としての TensorFlow 入力
TensorFlow Serving API を使用した TensorFlow 入力

次のセクションでは、Azure Machine Learning オンライン エンドポイントにデプロイされる MLflow モデルについて説明します。

入力構造

入力型に関係なく、Azure Machine Learning では、辞書キー input_data 内の JSON ペイロードで入力を指定する必要があります。 このキーはコマンド mlflow models serve を使用してモデルを提供する場合は必要ないため、Azure Machine Learning オンライン エンドポイントと MLflow 組み込みサーバーに対して、ペイロードを同じ意味で使用することはできません。

重要

MLflow 2.0 でペイロード構造が変更されました。

次のペイロードの例は、MLflow 組み込みサーバーにデプロイされたモデルと Azure Machine Learning 推論サーバーにデプロイされたモデルの違いを示しています。

分割方向の、JSON でシリアル化された pandas の DataFrame

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

テンソル入力

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

名前付きテンソル入力

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

MLflow モデルの推論のカスタマイズ

スコアリング スクリプトを使用すると、カスタム モデルの推論を実行する方法をカスタマイズできます。 ただし、MLflow モデルのデプロイでは、推論の実行方法に関する決定は、デプロイ エンジニアではなくモデルの作成者が行います。 各モデル フレームワークでは、特定の推論ルーチンが自動的に適用される場合があります。

MLflow モデルの推論の実行方法を変更する必要がある場合は、次のいずれかの操作を実行してください。

  • トレーニング ルーチンでモデルのログ記録の方法を変更する
  • デプロイ時にスコアリング スクリプトを使用して推論をカスタマイズする

トレーニング中のモデルのログ記録方法を変更する

mlflow.autolog または mlflow.<flavor>.log_modelを使用してモデルをログに記録する場合、モデルに使用されるフレーバーによって、推論の実行方法と返される結果が決まります。 MLflow では、predict() 機能で結果が生成される方法に関して、特定の動作は適用されません。

場合によっては、モデルの実行の前と後に、前処理または後処理を行いたい場合があります。 または、返される内容 (確率ではなくクラスを返すなど) の変更が必要な場合もあります。 1 つのソリューションが、入力から出力に直接移行する機械学習パイプラインを実装することです。

たとえば、sklearn.pipeline.Pipelinepyspark.ml.Pipeline はパイプラインを実装する一般的な方法であり、パフォーマンスの理由から推奨される場合があります。 カスタム モデルをログ記録することで、モデルの推論方法をカスタマイズすることもできます。

スコアリング スクリプトを使用して推論をカスタマイズする

MLflow モデルではスコアリング スクリプトは必須ではありませんが、必要であれば、MLflow モデルの推論実行をカスタマイズするために指定することもできます。 推論をカスタマイズする方法については、オンライン エンドポイントの場合は「MLflow モデル デプロイのカスタマイズ」を、バッチ エンドポイントの場合は「スコアリング スクリプトを使用してモデル デプロイをカスタマイズする」を参照してください。

重要

MLflow モデル デプロイのスコアリング スクリプトを指定することを選ぶ場合は、そのデプロイに対する環境も用意する必要があります。

デプロイ ツール

Azure Machine Learning では、MLflow モデルをオンライン エンドポイントとバッチ エンドポイントにデプロイする以下のツールを提供しています。

各ツールにはそれぞれ異なる機能があり、特にどの種類のコンピューティングをターゲットにできるかという点が異なります。 次の表は、さまざまな MLflow デプロイ シナリオのサポート可否を示しています。

シナリオ MLflow SDK Azure Machine Learning CLI/SDK またはスタジオ
マネージド オンライン エンドポイントへのデプロイ1 サポート対象。 「オンライン エンドポイントへの MLflow モデルの段階的なロールアウト」を参照してください サポート対象。 「MLflow モデルのオンライン エンドポイントへのデプロイ」を参照してください
スコアリング スクリプトを使用したマネージド オンライン エンドポイントへのデプロイ サポート対象外3 サポート対象。 「MLflow モデル デプロイのカスタマイズ」を参照してください
バッチ エンドポイントへのデプロイ サポートされません3 サポート対象。 「バッチ デプロイで MLflow モデルを使用する」を参照してください
スコアリング スクリプトを使用したバッチ エンドポイントへのデプロイ サポート対象外3 サポート対象。 「スコアリング スクリプトを使用してモデル デプロイをカスタマイズする
Azure Container Instances や Azure Kubernetes Service (AKS) などの Web サービスにデプロイする レガシ サポート2 サポートされません2
スコアリング スクリプトを使用して Container Instances や AKS などの Web サービスにデプロイする サポートされません3 レガシ サポート2

1 プライベート リンクが有効になっているワークスペース内にあるオンライン エンドポイントへのデプロイでは、デプロイ (プレビュー) 前にモデルをパッケージ化する必要があります。

2 可能な場合はマネージド オンライン エンドポイントに切り替えます。

3 オープンソースの MLflow にはスコアリング スクリプトの概念がなく、バッチ実行はサポートされていません。

デプロイ ツールを選択する

以下に該当する場合は、MLflow SDK を使用します。

  • MLflow を使い慣れており、同じメソッドを引き続き使用したいと考えている、および
  • MLflow をネイティブにサポートする Azure Databricks のようなプラットフォームを使用している。

以下に該当する場合は、Azure Machine Learning CLI v2 または SDK for Python を使用します。

  • これらを使い慣れている、あるいは
  • パイプラインを使用してデプロイを自動化したい場合、あるいは
  • デプロイ構成を Git リポジトリで保持したい場合。

MLflow でトレーニングしたモデルをすばやくデプロイしてテストする必要がある場合は、Azure Machine Learning スタジオ UI を使用します。