次の方法で共有


オンライン エンドポイントへの MLflow モデルの段階的なロールアウト

この記事では、サービスを中断することなく、MLflow モデルを段階的に更新してオンライン エンドポイントにデプロイする方法について説明します。 ブルーグリーン デプロイ (安全なロールアウト戦略とも呼ばれます) を使用して、新しいバージョンの Web サービスを運用環境に導入します。 この戦略により、完全にロールアウトする前に、新しいバージョンの Web サービスを少数のユーザーまたは要求にロールアウトできます。

この例の概要

オンライン エンドポイントには、エンドポイントデプロイという概念があります。 エンドポイントは、顧客がモデルを使用するために使用する API を表し、デプロイはその API の特定の実装を示します。 この区別により、ユーザーは API を実装から切り離し、コンシューマーに影響を与えることなく基礎となる実装を変更することができます。 この例では、このような概念を用いて、サービスの中断を招くことなくエンドポイントにデプロイされたモデルを更新します。

今回デプロイするモデルは、UCI Heart Disease Data Set をベースにしています。 このデータベースには 76 個の属性が含まれていますが、そのサブセットである 14 個を使っています。 このモデルは、患者の心臓病の存在を予測しようと試みるものです。 これは 0 (存在しない) から 1 (存在する) の整数値です。 トレーニングには XGBBoost 分類器が使われ、必要な前処理はすべて scikit-learn パイプラインとしてパッケージ化されているため、このモデルは生データから予測までを行うエンドツーエンドのパイプラインになっています。

この記事の情報は、azureml-examples リポジトリに含まれているコード サンプルを基にしています。 ファイルをコピーして貼り付けることなくコマンドをローカルで実行するには、リポジトリを複製し、ディレクトリを sdk/using-mlflow/deploy に変更します。

Jupyter ノートブックで経過をたどる

次のノートブックで、このサンプルの経過をたどることができます。 複製したリポジトリで、ノートブック mlflow_sdk_online_endpoints_progresive.ipynb を開きます。

前提条件

この記事の手順に従う前に、次の前提条件が満たされていることをご確認ください。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning をお試しください。
  • Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、ユーザー アカウントに、Azure Machine Learning ワークスペースの所有者か共同作成者ロール、または Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* を許可するカスタム ロールを割り当てる必要があります。 詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

さらに、次を行う必要があります。

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

まず、これから作業する Azure Machine Learning ワークスペースに接続しましょう。

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

レジストリにモデルを登録します。

モデルが Azure Machine Learning レジストリに登録されていることを確認します。 Azure Machine Learning では、未登録のモデルをデプロイすることはサポートされていません。 MLflow SDK を使用して新しいモデルを登録できます。

MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

オンライン エンドポイントの作成

オンライン エンドポイントは、オンライン (リアルタイム) の推論に使用されるエンドポイントです。 オンライン エンドポイントには、クライアントからデータを受信する準備が整い、リアルタイムで応答を返信できるデプロイが含まれています。

この機能を利用するには、同じエンドポイントの下に同じモデルの複数のバージョンをデプロイします。 ただし、最初のうちは、新しいデプロイにはトラフィックは流れません。 新しいモデルが正しく動作することが確認できたら、一方のデプロイからもう一方のデプロイにトラフィックを段階的に移動させる予定です。

  1. エンドポイントには名前が必要で、これは同じリージョンで一意である必要があります。 存在しないものを作成するようにしましょう。

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. エンドポイントを構成する

    endpoint.yml

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

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. エンドポイントの認証シークレットを取得します。

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

ブルー デプロイを作成する

エンドポイントは、まだ空です。 デプロイは含まれていません。 前に作業していたものと同じモデルをデプロイして、最初のモデルを作成してみましょう。 このデプロイを "default" と呼び、"ブルー デプロイ" を表します。

  1. 展開を構成する

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. 配置を作成する

    az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

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

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    ヒント

    create コマンドで フラグ --all-traffic を設定します。これにより、すべてのトラフィックが新しいデプロイに割り当てられます。

  3. すべてのトラフィックをデプロイに割り当てる

    現時点では、エンドポイントには 1 つのデプロイがありますが、そのトラフィックはどれも割り当てられていません。 これを割り当ててみましょう。

    作成中に --all-traffic を使用したため、Azure CLI ではこの手順は必要ありません。

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

    作成中に --all-traffic を使用したため、Azure CLI ではこの手順は必要ありません。

  5. デプロイをテストするためのサンプル入力を作成する

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. 展開をテスト

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

エンドポイントでグリーン デプロイを作成します。

開発チームによって作成された新しいバージョンのモデルがあり、運用する準備ができているとします。 まずこのモデルを実行してみて、確信が得られたらエンドポイントを更新してトラフィックをルーティングさせることができます。

  1. 新しいモデル バージョンを登録する

    MODEL_NAME='heart-classifier'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    

    新しいモデルのバージョン番号を取得しましょう。

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. 新しいデプロイの構成

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    デプロイには次のように名前を付けます。

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. 新しいデプロイを作成する

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

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

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. トラフィックを変更せずにデプロイをテストする

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    ヒント

    呼び出すデプロイの名前がどのように示されているかに注目してください。

トラフィックを段階的に更新する

新しいデプロイの確信が得られたら、トラフィックを更新して、その一部を新しいデプロイにルーティングします。 トラフィックはエンドポイント レベルで構成されます。

  1. トラフィックを構成します。

    この手順は、Azure CLI では必要ありません

  2. エンドポイントを更新する

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. トラフィック全体を新しいデプロイに切り替える場合は、すべてのトラフィックを更新します。

    この手順は、Azure CLI では必要ありません

  4. エンドポイントを更新する

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. 古いデプロイにトラフィックが流れることはないため、安全に削除できます。

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    ヒント

    この時点で、以前の "ブルー デプロイ" が削除され、新しい "グリーン デプロイ" が "ブルー デプロイ" の代わりに使用されていることに気づくはずです。

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

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

重要

エンドポイントを削除すると、そのエンドポイントの下にあるデプロイもすべて削除されます。

次の手順