MLflow モデルのオンライン エンドポイントへのデプロイ
適用対象: Azure CLI ml 拡張機能 v2 (現行)
この記事では、リアルタイム推論のために MLflow モデルをオンライン エンドポイントにデプロイする方法について説明します。 MLflow モデルをオンライン エンドポイントにデプロイする場合、スコアリング スクリプトや環境を指定する必要はありません。この機能は、"コードなしのデプロイ" と呼ばれます。
コードなしのデプロイの場合、Azure Machine Learning は次のようになります。
conda.yaml
ファイルで提供されている Python パッケージを動的にインストールします。 そのため、依存関係はコンテナーの実行時にインストールされます。- 次の項目を含む MLflow 基本イメージ/キュレーション環境を指定します。
azureml-inference-server-http
mlflow-skinny
- 推論用のスコアリング スクリプト。
ヒント
パブリック ネットワーク アクセスのないワークスペース: エグレス接続なしで MLflow モデルをオンライン エンドポイントにデプロイする前に、モデルをパッケージ化する必要があります (プレビュー)。 モデル パッケージを使用することで、 MLflow モデルに必要な Python パッケージを動的にインストールするために必要とされる Azure Machine Learning が必要とするイ ンターネット接続を回避できます。
この例について
この例は、予測を実行するために、オンライン エンドポイントに MLflow モデルをデプロイする方法を示しています。 この例では、Diabetes データセットに基づく MLflow モデルを使います。 このデータセットには、年齢、性別、肥満度指数、平均血圧、および 442 人の糖尿病患者から得られた血清に関する 6 つの測定値という 10 のベースライン変数が含まれています。 また、関心のある反応、ベースラインから 1 年後の疾患進行の定量的尺度も含まれています。
このモデルのトレーニングには scikit-learn
リグレッサーが使われ、必要な前処理はすべてパイプラインとしてパッケージ化されているため、このモデルは生データから予測までを行うエンド ツー エンドのパイプラインになっています。
この記事の情報は、azureml-examples リポジトリに含まれているコード サンプルを基にしています。 Azure CLI を使っている場合、YAML やその他のファイルをコピー/貼り付けせずにコマンドをローカルで実行するには、リポジトリをクローンしてから、ディレクトリを cli
に変更します。 Azure Machine Learning SDK for Python を使っている場合は、ディレクトリを sdk/python/endpoints/online/mlflow
に変更します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Jupyter Notebook で作業を進める
Azure Machine Learning Python SDK を使う手順に従うには、クローンしたリポジトリで MLflow モデルをオンライン エンドポイントにデプロイするノートブックを開きます。
前提条件
この記事の手順に従う前に、次の前提条件が満たされていることをご確認ください。
Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning をお試しください。
Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、ユーザー アカウントに、Azure Machine Learning ワークスペースの所有者か共同作成者ロール、または
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
を許可するカスタム ロールを割り当てる必要があります。 ロールの詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。ワークスペースに MLflow モデルが登録されている必要があります。 この記事では、Diabetes データセット用にトレーニングされたモデルをワークスペースに登録します。
また、次のことも行う必要があります。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
- Azure CLI と Azure CLI の
ml
拡張機能をインストールします。 CLI のインストールの詳細については、「CLI (v2) のインストールと設定」を参照してください。
ワークスペースに接続する
まず、作業を行う Azure Machine Learning ワークスペースに接続します。
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
モデルを登録する
登録されたモデルのみをオンライン エンドポイントにデプロイできます。 この場合、リポジトリにモデルのローカル コピーが既に存在するため、ワークスペース内のレジストリにモデルを発行するだけで済みます。 デプロイ対象のモデルが既に登録されている場合は、この手順をスキップできます。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
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 CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
トレーニング ジョブの出力からモデルを作成するには、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
注意
パス $MODEL_PATH
は、モデルが実行で格納された場所です。
MLflow モデルをオンライン エンドポイントにデプロイする
モデルがデプロイされるエンドポイントを構成します。 次の例では、エンドポイントの名前と認証モードを構成します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
次のコマンドを実行して、エンドポイント名を設定します (
YOUR_ENDPOINT_NAME
を一意の名前に置き換えます)。export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
エンドポイントを構成します。
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
エンドポイントを作成します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
デプロイを構成します。 デプロイは、実際の推論を実行するモデルをホストするのに必要なリソースのセットです。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
sklearn-deployment.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
Note
scoring_script
とenvironment
の自動生成は、pyfunc
モデル フレーバーでのみサポートされています。 別のモデル フレーバーを使うには、MLflow モデル デプロイのカスタマイズに関するページを参照してください。デプロイを作成します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
お使いのエンドポイントにエグレス接続がない場合、フラグ
--with-package
を含めることでモデルのパッケージ化 (プレビュー) を使用します。az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
すべてのトラフィックをデプロイに割り当てます。 現時点では、エンドポイントには 1 つのデプロイがありますが、そのトラフィックはどれも割り当てられていません。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
作成時に
--all-traffic
フラグを使ったため、Azure CLI ではこの手順は必要ありません。 トラフィックを変更する必要がある場合は、コマンドaz ml online-endpoint update --traffic
を使用できます。 トラフィックを更新する方法の詳細については、「トラフィックを段階的に更新する」を参照してください。エンドポイント構成を更新します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
作成時に
--all-traffic
フラグを使ったため、Azure CLI ではこの手順は必要ありません。 トラフィックを変更する必要がある場合は、コマンドaz ml online-endpoint update --traffic
を使用できます。 トラフィックを更新する方法の詳細については、「トラフィックを段階的に更新する」を参照してください。
エンドポイントを呼び出す
デプロイの準備が完了したら、それを使って要求を処理できます。 デプロイをテストする方法の 1 つは、使っているデプロイ クライアントの組み込み呼び出し機能を使うことです。 次の JSON は、デプロイのサンプル要求です。
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]
}}
Note
この例では、MLflow サービスで使われる inputs
ではなく、input_data
が使われます。 これは、Azure Machine Learning では、エンドポイントの Swagger コントラクトを自動的に生成できるようにするために、別の入力形式が必要であるためです。 想定される入力形式の詳細については、Azure Machine Learning と MLflow 組み込みサーバーにデプロイされたモデルの違いに関する記事を参照してください。
次のようにエンドポイントに要求を送信します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
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 モデルが配置されているフォルダーを特定します。
a. Azure Machine Learning Studio に移動します。
b. [モデル] セクションに移動します。
c. デプロイしようとしているモデルを選び、その [成果物] タブに移動します。
d. 表示されたフォルダーをメモします。 このフォルダーはモデル登録時に指定したものです。
スコアリング スクリプトを作成します。 前に特定したフォルダー名
model
がinit()
関数にどのように含まれているかに注目してください。ヒント
次のスコアリング スクリプトは、MLflow モデルを使って推論を実行する方法の例として提供されています。 このスクリプトをニーズに合わせて調整したり、シナリオを反映するようにその一部を変更したりできます。
score.py
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 定義ファイルは次のとおりです:
conda.yml
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
Note
azureml-inference-server-http
パッケージが元の conda 依存関係ファイルに追加されました。この conda 依存関係ファイルを使って環境を作成します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
環境は、デプロイ構成でインラインで作成されます。
デプロイを作成します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
デプロイ構成ファイル 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.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
デプロイを作成します。
az ml online-deployment create -f 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] }}
次のようにエンドポイントに要求を送信します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
応答は次のテキストのようになります。
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
警告
MLflow 2.0 アドバイザリ: MLflow 1.X には、キー
predictions
がありません。
リソースをクリーンアップする
エンドポイントの使用が完了したら、関連付けられたリソースを削除します。
- Azure CLI
- Python (Azure Machine Learning SDK)
- Python (MLflow SDK)
-
[ スタジオ](#tab/azure-studio)
az ml online-endpoint delete --name $ENDPOINT_NAME --yes