v1 を使用して Azure Kubernetes Service クラスターにモデルをデプロイする

重要

この記事では、CLI と SDK v1 を使用してモデルをデプロイする方法について説明します。 v2 に推奨される方法については、「オンライン エンドポイントを使用して機械学習モデルをデプロイしてスコア付けする」を参照してください。

Azure Machine Learning を使って Azure Kubernetes Service (AKS) 上の Web サービスとしてモデルをデプロイする方法について説明します。 Azure Kubernetes Service は高スケールの運用デプロイに適してします。 次のいずれかの機能が必要な場合は、Azure Kubernetes Service を使用します。

  • 高速の応答時間
  • デプロイされたサービスの自動スケール
  • Logging
  • モデル データ収集
  • 認証
  • TLS 終了
  • GPU や Field Programmable Gate Array (FPGA) などのハードウェア アクセラレータ オプション

Azure Kubernetes Service にデプロイするときは、ご利用のワークスペースに接続されている AKS クラスターにデプロイします。 AKS クラスターのワークスペースへの接続に関する詳細については、「Azure Kubernetes Service クラスターを作成してアタッチする」を参照してください。

重要

Web サービスにデプロイする前にローカルでデバッグすることをお勧めします。 詳細については、「ローカル デバッグ」を参照してください。

Azure Machine Learning のローカルの Notebook へのデプロイに関する記事を参照することもできます

注意

Azure Machine Learning Endpoints (プレビュー) では、デプロイが改善され、シンプルになります。 エンドポイントは、リアルタイム シナリオとバッチ推論の両方をサポートします。 エンドポイントは、複数のコンピューティングの種類にわたってモデル デプロイを起動および管理するための統一インターフェイスを提供します。 「Azure Machine Learning エンドポイント (プレビュー) とは」を参照してください。

前提条件

デプロイ プロセスについて

"デプロイ" という用語は、Kubernetes と Azure Machine Learning の両方で使用されます。 これらの 2 つのコンテキストでは、"デプロイ"の意味が異なります。 Kubernetes では、Deployment は具体的なエンティティで、宣言型の YAML ファイルで指定されます。 Kubernetes の Deployment には、定義されたライフサイクルが定義されており、PodsReplicaSets などの他の Kubernetes エンティティと具体的な関係があります。 Kubernetes については、「What is Kubernetes?」 (Kubernetes とは) にあるドキュメントとビデオを参照してください。

Azure Machine Learning では、"デプロイ"は、「プロジェクト リソースを使用可能にする、およびクリーンアップする」というより一般的な意味で使用されます。 Azure Machine Learning でデプロイ部分が考慮される手順は、次のとおりです。

  1. プロジェクト フォルダー内のファイルの解凍。.amlignore または .gitignore で指定されたファイルは無視されます
  2. コンピューティング クラスターのスケール アップ (Kubernetes 関連)
  3. Dockerfile のビルドまたは計算ノードへのダウンロード (Kubernetes 関連)
    1. システムにより、次のハッシュが計算されます。
    2. システムでは、ワークスペース Azure Container Registry (ACR) の検索で、このハッシュがキーとして使用されます
    3. 見つからない場合、グローバル ACR で一致するものが検索されます
    4. 見つからない場合、新しいイメージがビルドされます (これは、キャッシュされ、ワークスペース ACR にプッシュされます)
  4. 計算ノード上の一時記憶域への圧縮されたプロジェクト ファイルのダウンロード
  5. プロジェクト ファイルの解凍
  6. python <entry script> <arguments> を実行する計算ノード
  7. ログ、モデル ファイル、./outputs に書き込まれたその他のファイルの、ワークスペースに関連付けられているストレージ アカウントへの保存
  8. 一時記憶域の削除など、コンピューティングのスケールダウン (Kubernetes 関連)

Azure ML ルーター

デプロイされたサービスへ受信推論要求をルーティングするフロントエンド コンポーネント (azureml-fe) は、必要に応じて自動的にスケーリングされます。 azureml-fe のスケーリングは、AKS クラスターの目的とサイズ (ノードの数) に基づいています。 クラスターの目的とノードは、AKS クラスターを作成またはアタッチするときに構成されます。 クラスターごとに 1 つの azureml-fe サービスがあり、複数のポッドで実行されている可能性があります。

重要

dev-test として構成されているクラスターを使用する場合、セルフスケーラーは無効になります。 FastProd/DenseProd クラスターの場合でも、セルフスケーラーは利用統計情報で必要と示されている場合にのみ有効になります。

注意

最大要求ペイロードは 100 MB です。

azureml-fe は、より多くのコアを使用するためのスケールアップ (垂直方向)、およびより多くのポッドを使用するためのスケールアウト (水平方向) の両方を行います。 スケールアップするかどうかを決定するときは、受信推論要求のルーティングにかかる時間が使用されます。 この時間がしきい値を超えると、スケールアップが発生します。 受信要求をルーティングする時間がしきい値を超え続けると、スケールアウトが発生します。

スケールダウンとスケールインを行うときは、CPU 使用率が使用されます。 CPU 使用率のしきい値に達した場合、フロントエンドでは、まずスケールダウンが行われます。 CPU 使用率がスケールインのしきい値にまで低下した場合は、スケールイン操作が行われます。 スケールアップとスケールアウトは、使用可能なクラスター リソースが十分にある場合にのみ発生します。

スケールアップまたはスケールダウンすると、CPU/メモリの変更を適用するために azureml-fe ポッドが再起動されます。 要求の推論は再起動の影響を受けません。

AKS 推論クラスターの接続要件を理解する

Azure Machine Learning で AKS クラスターを作成またはアタッチすると、次の 2 つのネットワーク モデルのいずれかで AKS クラスターがデプロイされます。

  • Kubenet ネットワーク - AKS クラスターのデプロイ時に、通常はネットワーク リソースが作成され、構成されます。
  • Azure Container Networking Interface (CNI) ネットワーク - AKS クラスターは、既存の仮想ネットワーク リソースと構成に接続されます。

Kubenet ネットワークでは、ネットワークが作成され、Azure Machine Learning service 用に適切に構成されます。 CNI ネットワークでは、接続要件を理解し、AKS 推論のための DNS 解決と送信接続を確認する必要があります。 たとえば、ファイアウォールを使用してネットワーク トラフィックをブロックしている場合があります。

次の図は、AKS 推論の接続要件を示しています。 黒い矢印は実際の通信を表し、青い矢印はドメイン名を表します。 これらのホストのエントリをファイアウォールまたはカスタム DNS サーバーに追加することが必要になる場合があります。

AKS 推論の接続要件

一般的な AKS 接続要件については、「Azure Kubernetes Service (AKS) でクラスター ノードに対するエグレス トラフィックを制御する」を参照してください。

ファイアウォールの背後にある Azure ML サービスにアクセスする方法については、「ファイアウォールの背後にある Azure ML にアクセスする方法」を参照してください。

全体的な DNS 解決の要件

既存の VNet 内の DNS 解決は、お客様の管理下にあります。 たとえば、ファイアウォールやカスタム DNS サーバーなどです。 次のホストに到達できる必要があります。

ホスト名 使用者
<cluster>.hcp.<region>.azmk8s.io AKS API サーバー
mcr.microsoft.com Microsoft Container Registry (MCR)
<ACR name>.azurecr.io Azure Container Registry (ACR)
<account>.table.core.windows.net Azure Storage アカウント (テーブル ストレージ)
<account>.blob.core.windows.net Azure Storage アカウント (BLOB ストレージ)
api.azureml.ms Azure Active Directory (Azure AD) 認証
ingest-vienna<region>.kusto.windows.net 利用統計情報をアップロードするための Kusto エンドポイント
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com エンドポイントのドメイン名 (Azure Machine Learning によって自動生成した場合)。 カスタム ドメイン名を使用した場合は、このエントリは必要ありません。

クラスターの作成からモデル デプロイまで、時系列順の接続要件

AKS の作成またはアタッチのプロセスでは、Azure ML ルーター (azureml-fe) が AKS クラスターにデプロイされます。 Azure ML ルーターをデプロイするために、AKS ノードで次の処理が可能である必要があります。

  • AKS API サーバーの DNS を解決する
  • Azure ML ルーターの docker イメージをダウンロードするために、MCR の DNS を解決する
  • 送信接続が必要な MCR からイメージをダウンロードする

azureml-fe はデプロイされるとすぐに開始しようとしますが、これには次の処理を行う必要があります。

  • AKS API サーバーの DNS を解決する
  • AKS API サーバーにそれ自体の他のインスタンスを検出するためにクエリを実行する (マルチポッド サービス)
  • それ自体の他のインスタンスに接続する

azureml-fe が開始されると、正常に機能するために次の接続が必要になります。

  • Azure Storage に接続して動的構成をダウンロードする
  • デプロイされたサービスが Azure AD 認証を使用している場合は、Azure AD 認証サーバー api.azureml.ms の DNS を解決して、そのサーバーと通信します。
  • デプロイされたモデルを検出するために AKS API サーバーにクエリを実行する
  • デプロイされたモデル POD と通信する

モデルのデプロイ時に、モデル デプロイが成功すると、AKS ノードでは次の操作が可能になります。

  • お客様の ACR の DNS を解決する
  • お客様の ACR からイメージをダウンロードする
  • モデルが格納されている Azure BLOB の DNS を解決する
  • Azure BLOB からモデルをダウンロードする

モデルがデプロイされ、サービスが開始されると、azureml-fe は AKS API を使用してモデルを自動的に検出して、要求をそこにルーティングできるようになります。 モデル POD と通信できる必要があります。

注意

デプロイされたモデルに接続が必要な場合 (外部データベースやその他の REST サービスへのクエリの実行や BLOB のダウンロードなど)、これらのサービスの DNS 解決と送信通信の両方を有効にする必要があります。

AKS にデプロイする

Azure Kubernetes Service にモデルをデプロイするには、必要なコンピューティング リソースを記述した デプロイ構成 を作成します。 たとえば、コアの数やメモリなどです。 また、モデルと Web サービスのホストに必要な環境を記述した 推論構成 も必要です。 推論構成の作成の詳細については、「Azure Machine Learning service を使用してモデルをデプロイする」を参照してください。

注意

デプロイされるモデルの数は、デプロイごとに 1,000 モデル (コンテナーごと) に制限されます。

適用対象:Python SDK azureml v1

from azureml.core.webservice import AksWebservice, Webservice
from azureml.core.model import Model
from azureml.core.compute import AksCompute

aks_target = AksCompute(ws,"myaks")
# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and AML components.
deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config, aks_target)
service.wait_for_deployment(show_output = True)
print(service.state)
print(service.get_logs())

この例で使われているクラス、メソッド、パラメーターの詳細については、次のリファレンス ドキュメントをご覧ください。

自動スケール

適用対象:Python SDK azureml v1

Azure ML モデル デプロイの自動スケールを処理するコンポーネントは、azureml-fe というスマート要求ルーターです。 すべての推論要求が通過するため、ここには、デプロイされたモデルを自動的にスケーリングするために必要なデータが保持されます。

重要

  • モデル デプロイでは、Kubernetes のポッドの水平オートスケーラー (HPA) を有効にしないでください。 有効にすると、2 つの自動スケール コンポーネントが互いに競合します。 azureml-fe は、Azure ML によってデプロイされたモデルを自動スケールするように設計されています。この設計では、HPA が CPU 使用率やカスタム メトリック構成などの汎用メトリックから、モデルの使用率を推測または概算する必要があります。

  • azureml-fe によって、AKS クラスターのノードの数はスケーリングされません。これは、予期しないコストの増加につながる可能性があるからです。 その代わりに、物理クラスターの境界内でモデルのレプリカの数をスケーリングします。 クラスター内のノードの数をスケーリングする必要がある場合は、手動でクラスターをスケーリングするか、AKS クラスター オートスケーラーを構成することができます。

自動スケールは、AKS Web サービスに autoscale_target_utilizationautoscale_min_replicas、および autoscale_max_replicas を設定することで制御できます。 自動スケールを有効にする方法を次の例に示します。

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                autoscale_target_utilization=30,
                                                autoscale_min_replicas=1,
                                                autoscale_max_replicas=4)

スケールアップ/スケールダウンの決定は、コンテナーの現在のレプリカの使用率に基づきます。 ビジー状態 (要求を処理中) のレプリカの数を現在のレプリカの総数で除算した数が、現在の使用率です。 この数が autoscale_target_utilization を超えると、さらにレプリカが作成されます。 これが下回ると、レプリカが減少します。 既定では、ターゲット使用率は 70% です。

レプリカの追加は、集中的かつ迅速に決定されます (約 1 秒)。 レプリカの削除は慎重に決定されます (約 1 分)。

必要なレプリカの数は、次のコードを使用して計算できます。

from math import ceil
# target requests per second
targetRps = 20
# time to process the request (in seconds)
reqTime = 10
# Maximum requests per container
maxReqPerContainer = 1
# target_utilization. 70% in this example
targetUtilization = .7

concurrentRequests = targetRps * reqTime / targetUtilization

# Number of container replicas
replicas = ceil(concurrentRequests / maxReqPerContainer)

autoscale_target_utilizationautoscale_max_replicasautoscale_min_replicas の設定に関する詳細については、AksWebservice モジュール リファレンスを参照してください。

Web サービス認証

Azure Kubernetes Service にデプロイする場合、キーベース の認証は既定で有効になります。 トークン ベース の認証を有効にすることもできます。 トークン ベースの認証では、クライアントが Azure Active Directory アカウントを使用して認証トークンを要求する必要があります。これは、展開されたサービスへの要求を行うために使用されます。

認証を 無効 にするには、デプロイ構成の作成時に auth_enabled=False パラメーターを設定します。 次の例では、SDK を使用して認証を無効にします。

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, auth_enabled=False)

クライアント アプリケーションからの認証の詳細については、「Web サービスとしてデプロイされた Azure Machine Learning モデルを使用する」を参照してください。

キーによる認証

キー認証が有効になっている場合は、get_keys メソッドを使用して、プライマリおよびセカンダリ認証キーを取得できます。

primary, secondary = service.get_keys()
print(primary)

重要

キーを再生成する必要がある場合は、service.regen_key を使用します

トークンによる認証

トークン認証を有効にするには、デプロイの作成時や更新時に token_auth_enabled=True パラメーターを設定します。 次の例では、SDK を使用してトークン認証を有効にします。

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, token_auth_enabled=True)

トークン認証が有効になっている場合は、get_token メソッドを使用して、JWT トークンとそのトークンの有効期限を取得できます。

token, refresh_by = service.get_token()
print(token)

重要

トークンの refresh_by 時刻の後に新しいトークンを要求する必要があります。

Azure Machine Learning ワークスペースは、ご利用の Azure Kubernetes Service クラスターと同じリージョンに作成することを強くお勧めします。 トークンを使用して認証するために、Web サービスは、Azure Machine Learning ワークスペースの作成先のリージョンに対して呼び出しを行います。 ワークスペースのリージョンが利用不可になった場合、ワークスペースとは異なるリージョンにクラスターがあったとしても、Web サービスのトークンがフェッチできなくなります。 その場合、ワークスペースのリージョンが利用可能な状態に戻るまで、事実上、トークン ベースの認証が利用できない状態となります。 また、クラスターのリージョンとワークスペースのリージョンとの間の距離が長くなるほど、トークンのフェッチにかかる時間も長くなります。

トークンを取得するには、Azure Machine Learning SDK または az ml service get-access-token コマンドを使用する必要があります。

脆弱性のスキャン

Microsoft Defender for Cloud では、統合されたセキュリティ管理と高度な脅威に対する保護がハイブリッド クラウド ワークロードに提供されます。 リソースのスキャンを Microsoft Defender for Cloud に許可し、その推奨事項に従う必要があります。 詳細については、Azure Kubernetes Service と Defender for Cloud の統合に関するページを参照してください。

次のステップ