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

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

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

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

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

ヒント

パブリック ネットワーク アクセスのないワークスペース: エグレス接続なしで 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 と Azure CLI の ml 拡張機能をインストールします。 CLI のインストールの詳細については、「CLI (v2) のインストールと設定」を参照してください。

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

まず、作業を行う Azure Machine Learning ワークスペースに接続します。

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

モデルを登録する

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

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

注意

パス $MODEL_PATH は、モデルが実行で格納された場所です。

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

  1. モデルがデプロイされるエンドポイントを構成します。 次の例では、エンドポイントの名前と認証モードを構成します。

    次のコマンドを実行して、エンドポイント名を設定します (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
    
  2. エンドポイントを作成します。

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

    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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Note

    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
    

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

    az ml online-deployment create --with-package --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 つは、使っているデプロイ クライアントの組み込み呼び出し機能を使うことです。 次の 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 組み込みサーバーにデプロイされたモデルの違いに関する記事を参照してください。

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

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 モデルをデプロイするには:

  1. MLflow モデルが配置されているフォルダーを特定します。

    a. Azure Machine Learning Studio に移動します。

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

    c. デプロイしようとしているモデルを選び、その [成果物] タブに移動します。

    d. 表示されたフォルダーをメモします。 このフォルダーはモデル登録時に指定したものです。

    モデル成果物が配置されているフォルダーを示すスクリーンショット。

  2. スコアリング スクリプトを作成します。 前に特定したフォルダー名 modelinit() 関数にどのように含まれているかに注目してください。

    ヒント

    次のスコアリング スクリプトは、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 以降でのみサポートされていることに注意してください。

  3. スコアリング スクリプトを実行できる環境を作成します。 モデルは 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 依存関係ファイルを使って環境を作成します。

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

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

    デプロイ構成ファイル 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
    
  5. デプロイが完了すると、要求を処理できるようになります。 デプロイをテストする方法の 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": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    警告

    MLflow 2.0 アドバイザリ: MLflow 1.X には、キー predictions がありません。

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

エンドポイントの使用が完了したら、関連付けられたリソースを削除します。

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