公式ドキュメントがごちゃごちゃしていて、個人的にわかりづらかったので、まとめておきます。
公式ドキュメントどんなことが書いてあったか
古いバージョンの内容だったり、sklearnのモデルのデプロイの仕方、azure上でmlflowを用いて実験した際のデプロイの方法が書いてあります。
難しいのは、ばらばらの場所に説明が書いてあったり、古いバージョンでしか動かないコードがそのまま残っている点です。
この記事執筆時点でのバージョンは、
azureml-core==1.17.0
です。
pytorchモデルはすでに torchscript 化している前提で進めます。
下準備
パッケージ
pip install azureml-core
まだ入ってなければいれてください
以下、notebookの使用を想定
パラメータ
使うパラメータを定義しておきます(ご自身のパラメータを設定してください)。
WORKSPACE_NAME = "ws_name" WORKSPACE_LOCATION = "East US" SUBSCRIPTION_ID = "" RESOURCE_GROUP = "" MODEL_NAME = "model_name" MODEL_DESCRIPTION = """ model description """ ENVIRONMENT_NAME = "env_name" SERVICE_NAME = "torchscript-service" TORCHSCRIPT_PATH = "./trace_model.zip"
インポート
デプロイするだけならtorchはインポートしなくても大丈夫です。
from datetime import datetime import json from azureml.core import Model from azureml.core import Workspace from azureml.core import Environment from azureml.core.conda_dependencies import CondaDependencies from azureml.core.webservice import AciWebservice from azureml.core.model import InferenceConfig
azureml をごちゃごちゃ
workspaceの作成
Machine Learning ワークスペースが必要です。以下のコマンドではワークスペースがなければ作成され、あればそれが利用されます。必要ならブラウザに飛んで認証します。手動でやるときは忘れがちです。
ws = Workspace.create(name = WORKSPACE_NAME,
location=WORKSPACE_LOCATION,
resource_group=RESOURCE_GROUP,
subscription_id=SUBSCRIPTION_ID,
exist_ok=True
)
print(f"workspace name: {ws.name}")
モデルのregister
「登録」とは言いますが、実質的にはファイルかディレクトリをアップロードして名前を付けて紐づけているだけになります
your_model = Model.register( workspace=ws, model_path=TORCHSCRIPT_PATH, model_name=MODEL_NAME, model_framework=Model.Framework.CUSTOM, description=MODEL_DESCRIPTION )
環境
azure container imageにデプロイする際の、コンテナの環境を設定します。今度はtorchscriptをロードして実行するためにtorchが必要になります。といっても、必要である旨を教えてあげればいいです。
たとえば以下のようになります。
environment = Environment(ENVIRONMENT_NAME)
environment.python.conda_dependencies = CondaDependencies.create(pip_packages=[
'azureml-defaults',
'inference-schema[numpy-support]',
'numpy',
'torch'
])
score.pyを書く
ここまではnotebook上で実行してきましたが、container上でどういった処理を行うかという部分はpythonファイルに書いておく必要があります(ファイルと一緒にcontainerに送ります)。
処理といっても、リクエストを受け取ったあとにそれをどうパースしてモデルに入力して出力を得るかの部分だけで、わかりやすいです。また、それなりに自由度もあるので、扱いやすいです。ドキュメントさえ何とかしてくれればいいのに
要件としては、init()とrun(data)を実装する必要があります
import os
import json
import time
import torch
TORCH_SCRIPT_FILENAME = "./trace_model.zip" # *change here
def init():
global model
model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), TORCH_SCRIPT_FILENAME)
model = torch.jit.load(model_path)
def run(data):
try:
data = json.loads(data)
input = do_sth(data["data"])
output = model(input)
return {
"any": output,
}
except Exception as e:
print(e)
return e
initのAZUREML_MODEL_DIRが、アップロードしたファイル等が置かれているパスという認識です。
modelはglobalで定義します。後でrun内で使うためです
リクエストの"data"に送ったデータは入ります。
responseは好きに書けばいいでしょう。
デプロイ
deployの設定
notebookに戻ります。
aci_config = AciWebservice.deploy_configuration(cpu_cores=1, memory_gb=2)
inference_config = InferenceConfig(
entry_script='score.py',
environment=environment
)
service = Model.deploy(
workspace=ws,
name=SERVICE_NAME,
models=[your_model],
inference_config=inference_config,
deployment_config=aci_config,
overwrite=True
)
service.wait_for_deployment(show_output=True)
これで待てばデプロイされます。長くて6分くらいです。