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

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

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

MLflow モデルとカスタム モデルのデプロイの比較

Azure Machine Learning でのカスタム モデル デプロイとは違い、MLflow モデルを Azure Machine Learning にデプロイする場合、スコアリング スクリプトやデプロイ用の環境を提供する必要はありません。 代わりに、Azure Machine Learning によってスコアリング スクリプトと環境が自動的に生成されます。 この機能は "コードなしのデプロイ" と呼ばれます。

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

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

ヒント

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

Python パッケージと依存関係

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

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

conda.yaml

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 依存関係のパッケージ バージョンがピン留めされます。 ただし、この自動パッケージ検出では、意図や要件が必ずしも反映されない場合があります。 このような場合は、カスタムの conda 依存関係定義を使用してモデルをログに記録することを検討してください。

シグネチャでモデルを使用する意味

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

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

次のファイルは、MLflow モデルに関連付けられた MLmodel ファイルを示しています。

MLmodel

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 モデルのシグネチャは省略可能ですが、データの互換性の問題を早期に検出する便利な方法として利用できるため、強くお勧めします。 シグネチャを使ってモデルのログを記録する方法の詳細については、「カスタムのシグネチャ、環境、またはサンプルを使ったモデルのログ記録」を参照してください。

Azure Machine Learning にデプロイされたモデルと、MLflow 組み込みサーバーにデプロイされたモデル

MLflow には、モデル開発者がモデルをローカルでテストするために使用できる組み込みのデプロイ ツールが含まれています。 たとえば、MLflow サーバー レジストリに登録されているモデルのローカル インスタンスを実行するには、mlflow models serve -m my_model を使用するか、MLflow CLI mlflow models predict を使用します。

バッチ エンドポイントを使用した推論とオンライン エンドポイントを使用した推論

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

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

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

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

入力形式

入力型 MLflow 組み込みサーバー Azure Machine Learning オンライン エンドポイント
分割方向の、JSON でシリアル化された pandas の DataFrame
レコードの方向の、JSON でシリアル化された pandas の DataFrame 非推奨
CSV でシリアル化された pandas の DataFrames バッチを使用1
JSON でシリアル化されたリスト (テンソル) とリストの辞書 (名前付きテンソル) としてのテンソル入力形式
TF Serving の API 形式のテンソル入力

1 バッチ推論を使用してファイルを処理することを検討してください。 詳細については、「バッチ デプロイで MLflow モデルをデプロイする」を参照してください。

入力構造

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

重要

MLflow 2.0 の勧告: ペイロードの構造が 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 モデルを Azure Machine Learning にデプロイする場合、推論の実行方法に関する決定は、DevOps エンジニア (モデルをデプロイしようとしている人) ではなく、モデルの開発者 (モデルを構築したユーザー) によって行われます。 各モデル フレームワークでは、特定の推論ルーチンが自動的に適用される場合があります。

任意の時点で、MLflow モデルの推論の実行方法を変更する必要がある場合は、次の 2 つのいずれかを実行できます。

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

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

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

ただし、場合によっては、モデルの実行前と実行後に、前処理または後処理が必要になる可能性があります。 また、返される内容 (確率とクラスなど) の変更が必要な場合もあります。 1 つのソリューションが、入力から出力に直接移行する機械学習パイプラインを実装することです。 たとえば、sklearn.pipeline.Pipelinepyspark.ml.Pipeline はパイプラインを実装する一般的な方法であり、パフォーマンスに関する考慮事項に推奨される場合があります。 もう 1 つの方法は、カスタム モデル フレーバーを使用して、モデルで推論を行う方法をカスタマイズすることです。

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

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

重要

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

デプロイ ツール

Azure Machine Learning には、MLflow モデルをオンライン エンドポイントとバッチ エンドポイントにデプロイする多くの方法を提供しています。 次のツールを使用してモデルをデプロイできます。

  • MLflow SDK
  • Azure Machine Learning CLI
  • Azure Machine Learning SDK for Python
  • Azure Machine Learning Studio

各ワークフローは、特にターゲットにできるコンピューティングの種類について機能が異なります。 次の表は、さまざまな機能を示しています。

シナリオ MLflow SDK Azure Machine Learning CLI/SDK Azure Machine Learning Studio
マネージド オンライン エンドポイントへのデプロイ 例を参照1 例を参照1 例を参照1
マネージド オンライン エンドポイントへのデプロイ (スコアリング スクリプトを使用) サポートされません3 例を参照してください 例を参照してください
バッチ エンドポイントへのデプロイ サポートされません3 例を参照してください 例を参照してください
バッチ エンドポイントへのデプロイ (スコアリング スクリプトを使用) サポートされません3 例を参照してください 例を参照してください
Web サービスへのデプロイ (ACI/AKS) レガシ サポート2 サポートされません2 サポートされません2
Web サービスへのデプロイ (ACI/AKS - スコアリング スクリプトを使用) サポートされません3 レガシ サポート2 レガシ サポート2

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

2 代わりにマネージド オンライン エンドポイントに切り替えることをお勧めします。

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

どのデプロイ ツールを使用しますか?

  • 次の "両方" の条件が適用される場合は、MLflow SDK を使用します。

    • MLflow に慣れているか、MLflow をネイティブにサポートするプラットフォーム (Azure Databricks など) を使用している。
    • MLflow から同じメソッドのセットを引き続き使用する必要がある。
  • 次の "いずれか" の条件が適用される場合は、Azure Machine Learning CLI v2 を使用します。

    • Azure Machine Learning CLI v2 の方をよく知っている。
    • 自動化パイプラインを使用してデプロイを自動化する必要がある。
    • git リポジトリにデプロイ構成を保持する必要がある。
  • MLflow でトレーニングしたモデルをすばやくデプロイしてテストする必要がある場合は、Azure Machine Learning スタジオの UI デプロイを使用します。