Azure Machine LearningワークスペースをCLIv2で操作する 入門編2-推論エンドポイント立ち上げ

概要

本記事はAzure Machine LearningワークスペースをCLIv2を使って操作するチュートリアルの第2弾です。
使い方を習得すれば自動化パイプラインを自身で構築できるようになります。

やりたいこと

前回の記事でAzure Machine Learningのリソースを使って学習を実行ところまで進みました。 この段階では作成したモデルをローカル環境でしか使用することができません。公開する際には、推論エンドポイントをデプロイする必要があります。
本記事では引き続きCLIv2を使用し、Azure Machine Learningのマネージドな推論エンドポイントをデプロイする方法を紹介します。

準備

入門編1の記事をご参照ください。
こちらが完了している前提でエンドポイントのデプロイを進めていきます。

blog.jbs.co.jp

Azure CLI 拡張機能(CLIv2)による推論エンドポイントのデプロイ

学習済みモデルの登録

モデルのダウンロード

前回の手順で学習済みモデルがAzure Machine Learning上に保管されましたが、あくまでジョブとして管理されているためにモデルのバージョン管理なども行えておらず、容易に使用することができません。

モデルとして登録するため、まずは登録したジョブからモデルのみをダウンロードします。
ダウンロードに必要なjob_nameは前回「az ml job create」を実行した際の返り値のdisplay_name、またはワークスペースの実験画面から確認できます。

以下のコマンドを実行すると、カレントディレクトリに学習したファイルがダウンロードされます。

az ml job download --name $job_name

ローカル環境ファイルの登録

以下のコマンドでローカル環境のモデルファイルを登録します。

az ml model create --name titanic-model --version 1 --path ./artifacts/models

登録したモデルは、ワークスペースの画面から詳細を確認することができます。

エンドポイントの作成

エンドポイントの定義

まずは推論エンドポイントを立ち上げるための準備を行います。
キー認証方式でリソースを作成します。

managed_endpoint_create.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: titanic-sample-endpoint
auth_mode: key

yamlファイルを送信してマネージドエンドポイントを作成します。

az ml online-endpoint create --file managed_endpoint_create.yml

この時点でリソースが作成されるものの、まだ空の状態です。
次の項目で使用するコンピューティングリソースや動作の中身を決定します。

エンドポイントの環境構築

エンドポイントの中身を作成します。
まずは推論APIの動作を定義する、スコアリングスクリプトを作成します。

score.py

import os
import json
import logging
from mlflow.pyfunc import load_model

def init():
    global model
    logging.info("AZUREML_MODEL_DIR: " + os.environ["AZUREML_MODEL_DIR"])
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "models")
    model = load_model(model_path)  
    logging.info("Init complete")

def run(mini_batch):
    logging.info(f"run method start: {__file__}, run({mini_batch})")

    input = json.loads(mini_batch)["data"]
    logging.info(f"input: {input}")
    predictions = model.predict(input)
    logging.info('Predictions:' + str(predictions))
    logging.info("Request processed")

    return predictions.tolist() 
    

エンドポイントのデプロイを定義するために必要な情報をyamlで定義します。
pythonの環境は前回の記事で学習用環境として作成したtraining-env.ymlをそのまま使用します。
モデルは上記で登録した「titanic-model」を使用するように設定します。

managed_endpoint_deployment.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: titanic-endpoint
endpoint_name: titanic-sample-endpoint
model: azureml:titanic-model@latest
code_configuration:
  code: ./scripts
  scoring_script: score.py
environment: 
  conda_file: ./environments/training-env.yml
  image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04
instance_type: Standard_DS2_v2
instance_count: 1

定義した情報でデプロイを実行します。

az ml online-deployment create --file managed_endpoint_deployment.yml \
  --all-traffic

成功するとエンドポイントの画面が右のように変化し、詳細情報が表示されます。

Webサービスのテスト

デプロイしたWebサービスが正常に動作するかを確認します。 まずはエンドポイントのURLを把握します。 ワークスペース画面からも確認できますが、以下のコマンドでも詳細を確認できます。

az ml online-endpoint show \
  --name $endpoint_name \
  --query scoring_uri

エンドポイントをキー認証で定義したため、アクセスに必要なキーを取得します。
以下のコマンドでプライマリキーとセカンダリキーを取得できます。

az ml online-endpoint get-credentials \
  --name $endpoint_name

デプロイしたエンドポイントのテストを行います。
URLとAPIキーを入力してリクエストを送信して結果を確認してください。

import requests
import json

SERVING_URI = ""
API_KEY = ""

#Pclass, Sex, Age, Fare
input = [[1, 0, 20, 10.5], [1, 1, 20, 10.5]]

# Invoke web service !
headers = {
    'Content-Type':'application/json',
    'Authorization':('Bearer '+ API_KEY)
} 

values = json.dumps(input)
input_data = "{\"data\": " + values + "}"
print(input_data)
http_res = requests.post(
    SERVING_URI,
    input_data,
    headers = headers)
print('Predicted : ', http_res.text)

実際に送信してみた結果を示します。
今回対象としたタイタニック号データの生存状況(Survived)には性別が大きく関わっていることで知られていますが、今回のモデルも結果が変化していることが分かります。

エンドポイントが不要になった場合は、以下のコマンドで削除できます。

az ml online-endpoint delete \
 --name $endpoint_name \
 --yes

おわりに

CLIv2を使用して推論エンドポイントのデプロイまでを行う方法を紹介しました。
今回までで学習から推論までの一連の流れを実装したため、次回からは応用編として自動化基盤の作り方を紹介します。

本記事の続きはこちらをご覧ください。

blog.jbs.co.jp

執筆担当者プロフィール
西野 佑基

西野 佑基(日本ビジネスシステムズ株式会社)

機械学習系ソリューション開発、業務Webアプリ開発、開発環境自動化などを担当。

担当記事一覧