Azure Machine Learningを使って作った学習モデルと推論用プログラムをOnline EndpointとしてREST API化し、Power Apps・Power Automateから呼び出せるようにする仕事をしていた。
そんな時に表題に関わる罠に嵌まったので経緯と対策を紹介しておく。
ひとつのエンドポイントに複数のデプロイしたモデルを共存させたかった
Azure ML Studioの場合、まず最初にエンドポイントを建ててその中にモデルと推論用プログラムをデプロイする二段構えの処理が必要である。
更にひとつのエンドポイントの中に複数のデプロイ先を用意して共存させることも仕様上可能である。
現業務でも顧客の要望に応じて、いつでも旧モデルに戻せるようこの仕様を活かした運用をしている。
ここで、Azure ML Studioのエンドポイント詳細画面を抜粋した画像を添付する。
上図の右側、展開の概要のところにライブトラフィックの割り当て、左上にはトラフィックの更新とあり、一見するとこの値を弄ってやれば、エンドポイントを呼び出す側にデプロイ先を意識させる必要が無く、Azure ML内だけでどのモデルをどういった割合で選択できるかのように見える。
が、実際はそのような方法でトラフィックの割り当てを弄っても上手く流れてくれないことが分かった。
ホントはデプロイ先も指定しないといけないのかよ
エンドポイントへのデプロイが成功すると、使用タブに「こうやって使うといいよ」というサンプルコードが生成される。
本件に関連する部分を抜粋し以下に記載する。
#=========# 省略 #=========#
url = 'https://{エンドポイントの名前}.japaneast.inference.ml.azure.com/score'
# Replace this with the primary/secondary key or AMLToken for the endpoint
api_key = '{認証用のキーが入る}'
if not api_key:
raise Exception("A key should be provided to invoke the endpoint")
# The azureml-model-deployment header will force the request to go to a specific deployment.
# Remove this header to have the request observe the endpoint traffic rules
headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key), 'azureml-model-deployment': '{デプロイ先の名前}' }
req = urllib.request.Request(url, body, headers)
#=========# 省略 #=========#
header変数を定義する箇所に注目してほしい。
'azureml-model-deployment': '{デプロイ先の名前}'
とあるので、APIを呼び出すときに実際にはデプロイ先も指定する必要がある。
この仕様を失念しており、APIの利用先へ「使用するモデルを変更する際はエンジニア側でトラフィック先を変更するだけでOKです」と伝えてしまったことで混乱を来す結果となった。
対策
「30%はモデルAで残りの70%はモデルBにデータを流す」としたい場合は当てはまらないものの、今回のようにどちらかだけ使いたいとなった場合はエンドポイント呼び出し側でもデプロイ先の指定をする必要がありそうだ。
もっと賢くAPIを呼び出す方法はあるはずで、その方法を使えばライブトラフィックも使えそうだが調査不足のためここで一旦お開きとする。