Azure Machine Learningでのモデルデプロイまとめ

# はじめに
Azure Machine Learning (AzureML)は、機械学習のシナリオをend-to-endでサポートするプラットフォームです。AzureMLでは機械学習モデルのデプロイ先として様々なターゲットを利用することができます。[ドキュメント](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-endpoints)に様々な情報が掲載されているのですが、最初見た時によく分からなかったので、全体感を自分なりにまとめました。

:::note
推論の種類とそれに対応するAzureMLマネージドなエンドポイントの分類イメージです。

── 推論
    ├── リアルタイム (オンライン)推論
    │   └── `マネージドオンラインエンドポイント`
    │   └── `Kubernetesオンラインエンドポイント`
    │   └── `ローカルエンドポイント`
    ├── バッチ推論
    │   └── `バッチエンドポイント`
:::


# オンラインエンドポイント
低レイテンシなリアルタイム (オンライン)推論を行う場合に利用する推論環境で、マネージドオンラインエンドポイント、Kubernetesオンラインエンドポイントにより構成されています。またDev/Test用のローカルエンドポイントもこちらに加えることができます。

一つのエンドポイントに複数のデプロイを構成でき、それぞれのモデル・デプロイに流れるトラフィックを一定比率で分割したり、トラフィックをミラーリングして別のデプロイに受け渡したりすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/bc6ca82d-7c46-be0e-8dc6-dca22b556c1a.png)

コンセプト：[エンドポイントとは何ですか。 - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-endpoints#what-are-online-endpoints)

マネージドオンラインエンドポイントとKubernetesオンラインエンドポイントはオンラインエンドポイントの一種として、ほぼ同じ手順で構成ができるようになっています。そのためか、MLモデルをデプロイする手順を解説しているドキュメントも統一されています。

デプロイ手順：[Deploy machine learning models to online endpoints - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-online-endpoints?tabs=azure-cli)

MLflowモデルやTritonモデルを対象とする場合、スコアリングスクリプトを書かずにデプロイ可能です。

## マネージドオンラインエンドポイント
AzureMLマネージドな計算環境にデプロイする方法です。VMのアップデート等インフラ管理は行う必要がなく、自動スケーリングや計算リソースのモニタリング等々を簡単に行うことができます。マネージドインフラであり、ホスト OS イメージの自動更新、システム障害が発生した場合のノードの自動回復を行ってくれます。

ミラートラフィック機能を使ったシャドウテストも対応しています。エンドポイントの段階でトラフィックを複製して新しいモデルデプロイメントに送ります。そうすることで、クライアント側アプリケーションに影響を与えずに新しいモデルデプロイメントのエラー、レイテンシー等々のテストを行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/fa5cb442-0bbd-a309-2724-459fe3b49770.png)

ミラートラフィック：[オンライン エンドポイントの安全なロールアウト - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-safely-rollout-online-endpoints?tabs=azure-cli#test-the-deployment-with-mirrored-traffic-preview)

分かりやすい解説記事もありました：
[Azure Machine Learning でオンラインエンドポイントの Mirror Traffic 機能を使ってみる - Qiita](https://qiita.com/aical/items/53d94d1b2be5d56d4dc3)

## Kubernetesオンラインエンドポイント
オンプレ/クラウドのKubernetesクラスターへデプロイする方法です。KubernetesクラスターのAzure Arc接続を行うことで、オンプレやAWS/GCP含めたパブリッククラウドで実行されているKubernetesクラスターへそのままモデルをデプロイできるようになります。AzureだったらAzure Kubernetes Service (AKS)も対象です。私の知る限り、AWS SageMakerやGCP Vertex AIには、学習したモデルをそのままKubernetesクラスターへデプロイする機能が見当たらなあったので、Kubernetes環境が既にある場合は有力な選択肢だと思います。同一のKubernetesクラスターでモデルの学習と推論を行うように構成できるのもポイントかと思います。

[AzureML での Kubernetes コンピューティング先の概要 - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-attach-kubernetes-anywhere)

両エンドポイントの違いはこちらのセクションにまとめられています。
[マネージド オンライン エンドポイントと Kubernetes オンライン エンドポイント](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-endpoints#managed-online-endpoints-vs-kubernetes-online-endpoints)

## ローカルエンドポイント
学習済みモデルをオンラインエンドポイントにデプロイする前に、ローカルのDocker環境にデプロイしてモデルをテストすることができます。デプロイ構成のYAML等は同一で、デプロイする際に `--local` (CLIv2の場合)というオプションを付けるだけでローカルにデプロイできるので、非常に簡単にモデルのテストができます。dev/test用として存在しています。

手順：[Deploy machine learning models to online endpoints - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-online-endpoints?tabs=azure-cli#deploy-and-debug-locally-by-using-local-endpoints)

VSCode連携：[VS Code を使用してオンライン エンドポイントをローカルでデバッグする (プレビュー) - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-debug-managed-online-endpoints-visual-studio-code?tabs=cli)

# バッチエンドポイント
一定期間に大量のデータに対してバッチ推論を行うために使用されるエンドポイントです。複数のファイルに分散された大量のデータに対して並列処理で推論を実行することができます。

計算リソースはコンピューティングクラスターを指定する形になります。こちらもMLFlowモデルをデプロイする場合は、スコアリングスクリプトと実行環境の指定は不要です。

コンセプト：[バッチ エンドポイントとは](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-endpoints#what-are-batch-endpoints)
手順：[バッチ エンドポイントを使用したバッチ スコアリング - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-use-batch-endpoint?tabs=azure-cli)

# 他 (AzureML 推論 HTTP サーバー)
AzureMLマネージドな推論サービスで、推論サーバーとして使用されている[AzureML 推論 HTTP サーバー](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-inference-server-http)は[Pythonパッケージとして公開](https://pypi.org/project/azureml-inference-server-http/)されています。この推論サーバーを使ってローカルや自分達独自の計算リソースでモデルをデプロイして使っていくこともできます。

詳しくはこちらの記事をご覧ください。
めっちゃ分かりやすい記事：
[Azure Machine Learning Inference HTTP Serverを使って推論スクリプトをローカルで実行する](https://zenn.dev/shohei_aio/articles/5042c0b2f42176)
ドキュメント：
[Azure Machine Learning 推論 HTTP サーバー](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-inference-server-http)

# まとめ
Azure Machine Learningではモデルのデプロイ先としてオンプレ・Azure/AWC/GCPのクラウドを含めた幅広い選択肢が提供されています。再掲になりますが、参考になったドキュメントを掲載しておきます。

エンドポイントのコンセプトについてもっと知りたい場合：
[エンドポイントとは何ですか。 - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-endpoints)

オンラインエンドポイントへのモデルデプロイを一通り試したい場合：
[Deploy machine learning models to online endpoints - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-online-endpoints?tabs=azure-cli)

AzureMLを使ったモデル学習～デプロイの流れをPythonで一通り試したい場合。1-day チュートリアル：
[チュートリアル: 1 日でわかる Azure ML - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/machine-learning/tutorial-azure-ml-in-a-day)

質問・ご不明点があったらコメント欄にお願いします。