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

重要

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

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

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

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

重要

建議您先在本機進行偵錯,再部署至 Web 服務。 如需詳細資訊,請參閱 使用本機模型部署進行疑難解答。

您也可以參閱 在 GitHub 上部署至本機筆記本

注意

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

必要條件

瞭解部署程式

Kubernetes 和 Azure 機器學習 都使用部署一詞部署 在這兩個內容中有不同的意義。 在 Kubernetes 中,部署是具有宣告式 YAML 檔案指定的具體實體。 Kubernetes 部署具有定義的生命週期和與其他 Kubernetes 實體的具體關聯性,例如 PodsReplicaSets。 您可以從位於什麼是 Kubernetes?的文件和影片了解 Kubernetes。

在 Azure 機器學習 中,部署在更一般意義上的可用和清除項目資源。 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. 將記錄、模型檔案和其他寫入 ./output 的檔案儲存至與工作區相關聯的記憶體帳戶
  8. 相應減少計算,包括移除暫存記憶體(與 Kubernetes 相關)

Azure Machine Learning 路由器

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

重要

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

注意

要求承載上限為 100 MB。

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

進行縮減和縮小時,會使用 CPU 使用量。 如果符合 CPU 使用量閾值,則前端會先相應減少。 如果 CPU 使用量下降到縮小閾值,就會發生縮小作業。 只有在有足夠的叢集資源可用時,才會相應增加和相應放大。

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

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

當 Azure 機器學習 建立或連結 AKS 叢集時,AKS 叢集會使用下列兩個網路模型的其中一個來部署:

  • Kubenet 網路:網路資源通常會建立並設定為部署 AKS 叢集。
  • Azure 容器網路介面 (CNI) 網路功能:AKS 叢集已連線到現有的虛擬網路資源和組態。

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

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

Diagram that shows connectivity requirements for AKS inferencing.

如需一般 AKS 連線需求,請參閱使用 AKS 中的 Azure 防火牆 限制網路流量。

如需在防火牆後方存取 Azure Machine Learning 服務,請參閱設定輸入和輸出網路流量

整體 DNS 解析需求

現有虛擬網路內的 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 Microsoft Entra 驗證
ingest-vienna<region>.kusto.windows.net 用於上傳遙測的 Kusto 端點
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com 如果您使用 Azure 機器學習 自動產生端點功能變數名稱。 如果您使用自訂網域名稱,則不需要此項目。

依時間順序 連線 性需求

在 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 儲存體,以下載動態設定
  • 解析 Microsoft Entra 驗證伺服器的 DNS api.azureml.ms ,並在部署的服務使用 Microsoft Entra 驗證時與其通訊。
  • 查詢 AKS API 伺服器以探索部署的模型
  • 與已部署的模型 Pod 通訊

在模型部署期間,針對成功的模型部署,AKS 節點應該能夠:

  • 解析客戶的 ACR DNS
  • 從客戶的 ACR 下載映像
  • 解析儲存模型所在 Azure Blob 的 DNS
  • 從 Azure Blob 下載模型

部署模型並啟動服務之後,azureml-fe 會自動使用 AKS API 探索模型,並準備好將要求路由傳送至該模型。 它必須能夠與模型 Pod 通訊。

注意

如果已部署的模型需要任何連線能力(例如查詢外部資料庫或其他 REST 服務,或下載 BLOB),則應該啟用這些服務的 DNS 解析和輸出通訊。

部署到 AKS

若要將模型部署至 AKS,請建立 描述所需計算資源的部署組態 。 例如,核心和記憶體的數目。 您也需要推斷設定,其中描述裝載模型和 Web 服務所需的環境。 如需建立推斷設定的詳細資訊,請參閱部署模型的方式和位置

注意

要部署的模型數目限制為每個部署 (每個容器) 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 Machine Learning 模型部署處理自動調整的元件是 azureml-fe,也就是智慧型要求路由器。 由於所有推斷要求都會經過,因此其具有自動調整已部署模型所需的數據。

重要

  • 請勿針對模型部署啟用 Kubernetes Horizontal Pod 自動調整程式 (HPA)。 這樣做會導致兩個自動調整元件彼此競爭。 Azureml-fe 的設計可自動調整 Azure ML 部署的模型,其中的 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 時,預設會啟用金鑰型驗證。 您也可以啟用權杖型驗證。 權杖型驗證要求用戶端使用 Microsoft Entra 帳戶來要求驗證權杖,其會用來對已部署的服務提出要求。

若要停用驗證,請在建立部署設定時設定 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 強烈建議您在與 AKS 叢集相同的區域中建立 Azure 機器學習 工作區。 若要使用令牌進行驗證,Web 服務會呼叫 Azure 機器學習 工作區建立所在的區域。 如果您的工作區區域無法使用,即使您的叢集位於與工作區不同的區域,您也無法擷取 Web 服務的令牌。 這實際上會導致令牌型驗證無法使用,直到您的工作區區域再次可用為止。 此外,叢集區域與工作區區域之間的距離越大,擷取令牌所需的時間越長。

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

弱點掃描

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