使用第 1 版將模型部署至 Azure Kubernetes Service 叢集

重要

本文說明如何使用 CLI 和 SDK 第 1 版來部署模型。 如需第 2 版的建議方法,請參閱使用線上端點來部署和評分機器學習模型

了解如何使用 Azure Machine Learning 在 Azure Kubernetes Service (AKS) 上將模型部署為 Web 服務。 Azure Kubernetes Service 適合用於大規模生產部署。 如果您需要下列其中一或多個功能,請使用 Azure Kubernetes Service:

  • 快速回應時間
  • 已部署服務的自動調整
  • Logging
  • 模型資料收集
  • 驗證
  • TLS 終止
  • 硬體加速選項,例如 GPU 和可現場程式化閘道陣列 (FPGA)

在部署至 Azure Kubernetes Service 時,您會部署至與工作區連線的 AKS 叢集。 如需將 AKS 叢集連線至工作區的相關資訊,請參閱建立和連結 Azure Kubernetes Service 叢集

重要

建議您先在本機進行偵錯,再部署至 Web 服務。 如需詳細資訊,請參閱本機偵錯

您也可以參考 Azure Machine Learning - 部署至本機筆記本

注意

Azure Machine Learning 端點 (v2) 提供改良、更簡單的部署體驗。 端點同時支援即時和 Batch 推斷案例。 端點會提供整合介面,以叫用和管理跨計算類型的模型部署。 請參閱 什麼是 Azure Machine Learning 端點?

必要條件

了解部署流程

Kubernetes 和 Azure Machine Learning 中都會使用「部署」一詞。 在這兩個內容中,「部署」具有不同的意義。 在 Kubernetes 中,Deployment 是使用宣告式 YAML 檔案指定的具象實體。 Kubernetes Deployment 具有已定義的生命週期和與其他 Kubernetes 實體 (例如 PodsReplicaSets) 的具象關聯性。 您可以從位於什麼是 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 Machine Learning 路由器

將傳入推斷要求路由至部署的服務的前端元件 (azureml-fe) 會視需要自動調整。 azureml-fe 的調整是根據 AKS 叢集用途和大小 (節點數目)。 建立或連結 AKS 叢集時,會設定叢集目的和節點。 每個叢集都有一個 azureml-fe 服務,可能在多個 Pod 上執行。

重要

使用設定為開發/測試的叢集時,自我調整程式將會是已停用。 即使是 FastProd/DenseProd 叢集,Self-Scaler 也僅在遙測顯示需要時才會啟用。

注意

最大要求承載為 100 MB。

Azureml-fe 會擴大 (垂直) 以使用更多核心,及擴增 (水平) 以使用更多的 Pod。 進行擴大的決策時,會使用路由傳入推斷要求所耗費的時間。 如果此時間超過閾值,就會發生擴大。 如果路由傳入要求的時間持續超過閾值,則會發生擴增。

進行縮減和縮小時,會使用 CPU 使用量。 如果達到 CPU 使用量閾值,前端將會先縮減。 如果 CPU 使用量下降到縮小閾值,就會發生縮小作業。 只有當有足夠的可用叢集資源時,才會進行擴充和擴增。

相應增加或相應減少時,將會重新啟動 azureml-fe Pod 以套用 CPU/記憶體變更。 推斷要求不會受到重新啟動的影響。

了解 AKS 推斷叢集的連線需求

Azure Machine Learning 建立或連結 AKS 叢集時,會使用下列兩種網路模型的其中一種來部署 AKS 叢集:

  • Kubenet 網路 - 在部署 AKS 叢集時通常會建立並設定網路資源。
  • Azure 容器網路介面 (CNI) 網路 - AKS 叢集會連線至現有的虛擬網路資源和設定。

針對 Kubenet 網路功能,會為 Azure Machine Learning 服務建立並正確設定網路。 針對 CNI 網路功能,您需要了解連線需求,並確保 AKS 推斷的 DNS 解析和輸出連線。 例如,您可能使用防火牆來封鎖網路流量。

下圖顯示 AKS 推斷的連線需求。 黑色箭號代表實際的通訊,而藍色箭號代表網域名稱。 您可能需要將這些主機的項目新增至您的防火牆或自訂 DNS 伺服器。

AKS 推斷的連線需求

如需一般 AKS 連線需求,請參閱控制 Azure Kubernetes Service 中叢集節點的輸出流量

如需在防火牆後方存取 Azure Machine Learning 服務,請參閱 如何存取防火牆後方的 azureml

整體 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 儲存體帳戶 (資料表儲存體)
<account>.blob.core.windows.net Azure 儲存體帳戶 (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 Machine Learning 路由器 (azureml-fe) 部署至 AKS 叢集。 為了部署 Azure Machine Learning 路由器,AKS 節點應該能夠:

  • 解析 AKS API 伺服器的 DNS
  • 解析 MCR 的 DNS,以下載 Azure Machine Learning 路由器的 Docker 映射
  • 從 MCR 下載映像,其中需要輸出連線

部署 azureml-fe 之後,它會隨即嘗試啟動,而這需要:

  • 解析 AKS API 伺服器的 DNS
  • 查詢 AKS API 伺服器以探索其本身的其他執行個體 (這是多 Pod 服務)
  • 連線至其本身的其他執行個體

一旦啟動 azureml-fe,需要下列項目,連線才能正常運作:

  • 連線 Azure 儲存體,以下載動態設定
  • 解析 Azure AD 驗證伺服器 api.azureml.ms 的 DNS,並在部署的服務使用 Azure AD 驗證時與其通訊。
  • 查詢 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 服務所需的環境。 如需建立推斷設定的詳細資訊,請參閱部署模型的方式和位置

注意

要部署的模型數目限制為每個部署 (每個容器) 1,000 個模型。

適用於:Python SDK azureml 第 1 版

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 第 1 版

處理 Azure Machine Learning 模型部署自動調整的元件是 azureml-fe,這是智慧型要求路由器。 因為所有推斷要求都會通過它,所以它具有自動調整已部署模型的必要資料。

重要

  • 請勿為模型部署啟用 Kubernetes 水平 Pod 自動調整程式 (HPA)。 這麼做會導致兩個自動調整元件互相競爭。 Azureml-fe 的設計目的是要自動調整 Azure Machine Learning 所部署的模型,其中 HPA 必須猜測或近似來自 CPU 使用量或自訂計量設定等一般計量的模型使用率。

  • Azureml-fe 無法調整 AKS 叢集中的節點數目,因為這可能會導致非預期的成本增加。 相反地,它會在實體叢集界限內調整模型的複本數目。 如果您需要調整叢集內的節點數目,您可以手動調整叢集或設定 AKS 叢集自動調整程式

您可以藉由設定 autoscale_target_utilizationautoscale_min_replicasautoscale_max_replicas 來控制 AKS Web 服務的自動調整。 下列範例示範如何啟用自動調整:

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 時間過了之後,您必須要求新的權杖。

Microsoft 強烈建議在與 Azure Kubernetes Service 叢集相同的區域中建立 Azure Machine Learning 工作區。 若要使用權杖進行驗證,Web 服務會呼叫 Azure Machine Learning 工作區的建立區域。 如果您的工作區區域無法使用,即使您的叢集與您的工作區位於不同的區域,您也將無法提取 Web 服務的權杖。 這實際上會導致權杖型驗證無法使用,直到您的工作區區域再次可供使用為止。 此外,叢集區域和工作區區域之間的距離愈大,擷取權杖所需的時間就越長。

若要取得權杖,您必須使用 Azure Machine Learning SDK 或 az ml service get-access-token 命令。

弱點掃描

適用於雲端的 Microsoft Defender 提供跨混合式雲端工作負載的整合式安全性管理與進階威脅保護。 您應允許適用於雲端的 Microsoft Defender 掃描您的資源,並遵循其建議。 如需詳細資訊,請參閱 Azure Kubernetes Services 與適用於雲端的 Defender 整合

後續步驟