次の方法で共有


MLflow モデルのオンライン エンドポイントへのデプロイ

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

この記事では、リアルタイム推論のために MLflow モデルを オンライン エンドポイント にデプロイする方法について説明します。 MLflow モデルをオンライン エンドポイントにデプロイする場合、スコアリング スクリプトや環境を指定する必要はありません。この機能は、"コードなしのデプロイ" と呼ばれます。

コードなしのデプロイの場合、Azure Machine Learning は次のようになります。

  • conda.yaml ファイルに一覧表示する Python パッケージを動的にインストールします。 その結果、依存関係はコンテナーの実行時にインストールされます。
  • 次の項目を含む MLflow 基本イメージ (キュレーションされた環境) を提供します。

ヒント

パブリック ネットワーク アクセスのないワークスペースでは、エグレス接続なしで MLflow モデルをオンライン エンドポイントにデプロイする前に、モデルをパッケージ化する必要があります。 モデル のパッケージ化機能はプレビュー段階です。 モデルをパッケージ化すると、インターネット接続の必要性を回避できます。それ以外の場合、Azure Machine Learning では MLflow モデルに必要な Python パッケージを動的にインストールする必要があります。

前提条件

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • 次の Azure ロールベースのアクセス制御 (Azure RBAC) ロールの少なくとも 1 つを持つユーザー アカウント。

    • Azure Machine Learning ワークスペースの所有者ロール
    • Azure Machine Learning ワークスペースの共同作成者ロール
    • Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*アクセス許可を持つカスタム ロール

    詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

  • Azure Machine Learning へのアクセス:

    Azure CLI と Azure CLI の ml 拡張機能をインストールします。 インストール手順については、「 CLI (v2) のインストールと設定」を参照してください。

この例について

この記事の例では、MLflow モデルをオンライン エンドポイントにデプロイして予測を実行する方法を示します。 この例では、Diabetes データセットに基づく MLflow モデルを使います。 このデータセットには、年齢、性別、体重指数、平均血圧、および442人の糖尿病患者から得られた6つの血清測定という10のベースライン変数が含まれています。 また、関心のある応答も含まれています。これは、ベースライン データの日付から 1 年後の疾患進行の定量的測定です。

モデルは、 scikit-learn リグレッサーを使用してトレーニングされました。 必要なすべての前処理はパイプラインとしてパッケージ化されるため、このモデルは生データから予測に変換されるエンドツーエンドのパイプラインです。

この記事の情報は、 azureml-examples リポジトリのコード サンプルに基づいています。 リポジトリを複製する場合は、YAML ファイルやその他のファイルをコピーまたは貼り付けなくても、この記事のコマンドをローカルで実行できます。 次のコマンドを使用してリポジトリを複製し、コーディング言語のフォルダーに移動します。

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Jupyter Notebook で作業を進める

この記事の手順に従うには、サンプル リポジトリの オンライン エンドポイントノートブックに MLflow モデルをデプロイ するを参照してください。

ワークスペースに接続する

Azure Machine Learning ワークスペースに接続します。

az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> ___location=<___location>

モデルを登録する

登録されたモデルのみをオンライン エンドポイントにデプロイできます。 この記事の手順では、 Diabetes データセット用にトレーニングされたモデルを使用します。 この場合、複製されたリポジトリにモデルのローカル コピーが既に存在するため、ワークスペース内のレジストリにモデルを発行するだけで済みます。 デプロイするモデルが既に登録されている場合は、この手順をスキップできます。

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

モデルが実行内でログに記録された場合はどうしますか?

モデルが実行内でログに記録された場合は、直接登録できます。

モデルを登録するには、そのストレージの場所を知っている必要があります。

  • MLflow autolog 機能を使用する場合、モデルへのパスはモデルの種類とフレームワークによって異なります。 ジョブの出力を調べて、モデル フォルダーの名前を識別します。 このフォルダーには、MLModel という名前のファイルが含まれています。
  • log_model メソッドを使用してモデルを手動でログに記録する場合は、そのメソッドの引数としてモデルへのパスを渡します。 たとえば、 mlflow.sklearn.log_model(my_model, "classifier") を使用してモデルをログに記録する場合、 classifier はモデルが格納されているパスです。

Azure Machine Learning CLI v2 を使用して、トレーニング ジョブの出力からモデルを作成できます。 次のコードでは、ID $RUN_ID を持つジョブの成果物を使用して、 $MODEL_NAMEという名前のモデルを登録します。 $MODEL_PATH は、ジョブがモデルの格納に使用するパスです。

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

MLflow モデルをオンライン エンドポイントにデプロイする

  1. 次のコードを使用して、モデルをデプロイするエンドポイントの名前と認証モードを構成します。

    次のコマンドを実行して、エンドポイント名を設定します。 最初に、 YOUR_ENDPOINT_NAME を一意の名前に置き換えます。

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    エンドポイントを構成するには、次の行を含む create-endpoint.yaml という名前の YAML ファイルを作成します。

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. エンドポイントを作成します。

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. デプロイを構成します。 デプロイは、実際の推論を実行するモデルをホストするのに必要なリソースのセットです。

    次の行を含む sklearn-deployment.yaml という名前の YAML ファイルを作成します。

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    注意

    scoring_scriptenvironmentの自動生成は、PyFunc モデルフレーバーでのみサポートされます。 別のモデル フレーバーを使用するには、「 MLflow モデルデプロイのカスタマイズ」を参照してください。

  4. デプロイを作成します。

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    

    お使いのエンドポイントにエグレス接続がない場合、フラグ --package-model を含めることでモデルのパッケージ化 (プレビュー) を使用します。

    az ml online-deployment create --package-model --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. すべてのトラフィックをデプロイに割り当てます。 現時点では、エンドポイントには 1 つのデプロイがありますが、そのトラフィックはどれも割り当てられていません。

    作成時に --all-traffic フラグを使用する場合、Azure CLI ではこの手順は必要ありません。 トラフィックを変更する必要がある場合は、 az ml online-endpoint update --traffic コマンドを使用できます。 トラフィックを更新する方法の詳細については、「トラフィックを 段階的に更新する」を参照してください。

  6. エンドポイント構成を更新します。

    作成時に --all-traffic フラグを使用する場合、Azure CLI ではこの手順は必要ありません。 トラフィックを変更する必要がある場合は、 az ml online-endpoint update --traffic コマンドを使用できます。 トラフィックを更新する方法の詳細については、「トラフィックを 段階的に更新する」を参照してください。

エンドポイントを呼び出す

デプロイの準備ができたら、それを使用して要求を処理できます。 デプロイをテストする 1 つの方法は、デプロイ クライアントで組み込みの呼び出し機能を使用することです。 サンプル リポジトリでは、sample-request-sklearn.json ファイルに次の JSON コードが含まれています。 デプロイのサンプル要求ファイルとして使用できます。

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

注意

このファイルでは、MLflow サービスで使用されるinput_dataではなく、inputs キーが使用されます。 Azure Machine Learning では、エンドポイントの Swagger コントラクトを自動的に生成できるようにするために、異なる入力形式が必要です。 予想される入力形式の詳細については、「 MLflow 組み込みサーバーでのデプロイと Azure Machine Learning 推論サーバーでのデプロイ」を参照してください。

エンドポイントに要求を送信します。

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

応答は次のテキストのようになります。

[ 
  11633.100167144921,
  8522.117402884991
]

重要

MLflow のコードなしのデプロイでは、 ローカル エンドポイントを使用したテスト は現在サポートされていません。

MLflow モデル デプロイのカスタマイズ

オンライン エンドポイントへの MLflow モデルのデプロイ定義でスコアリング スクリプトを指定する必要はありません。 ただし、推論プロセスをカスタマイズする場合は、スコアリング スクリプトを指定できます。

通常は、次の場合に MLflow モデルのデプロイをカスタマイズします。

  • モデルには PyFunc フレーバーがありません。
  • モデルの実行方法をカスタマイズする必要があります。 たとえば、特定のフレーバーを使用してモデルを読み込むには、 mlflow.<flavor>.load_model() を使用する必要があります。
  • モデルではこの処理が行われないため、スコアリング ルーチンで前処理または後処理を行う必要があります。
  • モデルの出力を表形式データでうまく表現できません。 たとえば、出力はイメージを表すテンソルです。

重要

MLflow モデルのデプロイにスコアリング スクリプトを指定する場合は、デプロイを実行する環境も指定する必要があります。

カスタム スコアリング スクリプトをデプロイする

カスタム スコアリング スクリプトを使用する MLflow モデルをデプロイするには、次のセクションの手順を実行します。

モデル フォルダーを特定する

次の手順を実行して、MLflow モデルを含むフォルダーを特定します。

  1. [Azure Machine Learning Studio] に移動します。

  2. [モデル] セクションに移動します。

  3. デプロイするモデルを選択し、[ 成果物 ] タブに移動します。

  4. 表示されているフォルダーを書き留めます。 モデルを登録するときは、このフォルダーを指定します。

    モデル成果物を含むフォルダーを示すスクリーンショット。

スコアリング スクリプトを作成する

次のスコアリング スクリプト score.py は、MLflow モデルで推論を実行する方法の例を示しています。 このスクリプトをニーズに合わせて調整したり、シナリオを反映するようにその一部を変更したりできます。 以前に識別したフォルダー名 ( model) が init() 関数に含まれていることに注意してください。

import logging
import os
import json
import mlflow
from io import StringIO
from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json


def init():
    global model
    global input_schema
    # "model" is the path of the mlflow artifacts when the model was registered. For automl
    # models, this is generally "mlflow-model".
    model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
    model = mlflow.pyfunc.load_model(model_path)
    input_schema = model.metadata.get_input_schema()


def run(raw_data):
    json_data = json.loads(raw_data)
    if "input_data" not in json_data.keys():
        raise Exception("Request must contain a top level key named 'input_data'")

    serving_input = json.dumps(json_data["input_data"])
    data = infer_and_parse_json_input(serving_input, input_schema)
    predictions = model.predict(data)

    result = StringIO()
    predictions_to_json(predictions, result)
    return result.getvalue()

警告

MLflow 2.0 アドバイザリ: スコアリング スクリプトの例は、MLflow 1.X および MLflow 2.X で動作します。 ただし、これらのバージョンで想定される入力形式と出力形式は異なる場合があります。 環境定義を調べて、使用する MLflow のバージョンを確認します。 MLflow 2.0 は Python 3.8 以降のバージョンでのみサポートされています。

環境を作成する

次の手順では、スコアリング スクリプトを実行できる環境を作成します。 モデルは MLflow モデルであるため、conda 要件もモデル パッケージで指定されます。 MLflow モデルに含まれるファイルの詳細については、「 MLmodel 形式」を参照してください。 ファイルの conda 依存関係を使用して環境を構築します。 ただし、Azure Machine Learning でのオンライン デプロイに必要な azureml-inference-server-http パッケージも含める必要があります。

次の行を含む conda.yaml という名前の conda 定義ファイルを作成できます。

channels:
- conda-forge
dependencies:
- python=3.9
- pip
- pip:
  - mlflow
  - scikit-learn==1.2.2
  - cloudpickle==2.2.1
  - psutil==5.9.4
  - pandas==2.0.0
  - azureml-inference-server-http
name: mlflow-env

注意

この conda ファイルの dependencies セクションには、 azureml-inference-server-http パッケージが含まれています。

環境を作成するには、次の conda 依存関係ファイルを使用します。

環境は、デプロイ構成でインラインで作成されます。

展開を構築する

endpoints/online/ncd フォルダーに、次の行を含む展開構成ファイルdeployment.yml作成します。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: sklearn-diabetes-custom
endpoint_name: my-endpoint
model: azureml:sklearn-diabetes@latest
environment: 
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
    conda_file: sklearn-diabetes/environment/conda.yaml
code_configuration:
    code: sklearn-diabetes/src
    scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1

デプロイを作成します。

az ml online-deployment create -f endpoints/online/ncd/deployment.yml

要求を処理する

デプロイが完了すると、要求を処理する準備が整います。 デプロイをテストする方法の 1 つは、 invoke メソッドを次のファイルのようなサンプル要求ファイルと共に使用することです。sample-request-sklearn.json。

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

エンドポイントに要求を送信します。

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

応答は次のテキストのようになります。

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

警告

MLflow 2.0 アドバイザリ: MLflow 1.X では、応答に predictions キーが含まれません。

リソースをクリーンアップする

エンドポイントが不要になった場合は、関連付けられているリソースを削除します。

az ml online-endpoint delete --name $ENDPOINT_NAME --yes