共用方式為


針對用於即時推斷的新部署執行安全推出

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

在本文中,您將瞭解如何在生產環境中部署新版本的機器學習模型,而不會造成任何中斷。 您可以使用藍綠部署策略,也稱為安全推出策略,將新版本的Web服務引入生產環境。 當您使用此策略時,您可以將新版本的 Web 服務推出到一小部分的使用者或要求,然後再完全推出。

本文假設您使用在線端點,或用於在線(即時)推斷的端點。 線上端點有兩種類型:受控線上端點Kubernetes 線上端點。 如需端點類型與端點類型差異的詳細資訊,請參閱 受控在線端點與 Kubernetes 在線端點

本文使用受控在線端點進行部署。 但也包含說明如何使用 Kubernetes 端點而非受控在線端點的附註。

在本文中,您將瞭解如何:

  • 使用名為 blue 的部署定義在線端點,以提供模型的第一個版本。
  • blue調整部署規模,使其可以處理更多要求。
  • 將稱為 green 部署的第二個模型版本部署到端點,但不會傳送即時流量給部署。
  • 以隔離的方式測試green部署。
  • 鏡像 green 部署的即時流量百分比以驗證它。
  • 將少量即時流量百分比傳送至 green 部署。
  • 將所有即時流量傳送至 green 部署。
  • 刪除未使用的 blue 部署。

先決條件

  • Azure CLIml Azure CLI 的擴充功能,已安裝並設定。 如需詳細資訊,請參閱 安裝和設定 CLI (v2)

  • Bash 殼層或相容的殼層,例如 Linux 系統上的殼層或 Windows 子系統 Linux 版 (部分內容可能是機器或 AI 翻譯)。 本文中的 Azure CLI 範例假設您使用這種類型的終端機。

  • Azure Machine Learning 工作區。 如需建立工作區的指示,請參閱 設定

  • 至少具有下列其中一個 Azure 角色型存取控制 (Azure RBAC) 角色的用戶帳戶:

    • Azure Machine Learning 工作區的擁有者角色
    • Azure Machine Learning 工作區的參與者角色
    • 具有 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 許可權的自定義角色

    如需詳細資訊,請參閱 管理 Azure Machine Learning 工作區

  • Docker 引擎選擇性地安裝並在本機執行。 強烈建議使用此必要條件。 您需要它才能在本機部署模型,而且有助於偵錯。

準備您的系統

設定環境變數

您可以設定預設值以搭配 Azure CLI 使用。 若要避免多次傳入訂用帳戶、工作區和資源群組的值,請執行下列程序代碼:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<Azure-Machine-Learning-workspace-name> group=<resource-group-name>

複製範例存放庫

如要遵循本文,請先複製範例存放庫 (azureml-examples)。 然後移至存放庫的 cli/ 目錄:

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli

秘訣

使用 --depth 1 僅將最新的提交複製至存放庫,以減少完成作業所需的時間。

本教學課程中的命令位於 cli 目錄中的 deploy-safe-rollout-online-endpoints.sh 檔案中,而 YAML 組態檔位於 endpoints/online/managed/sample/ 子目錄中。

附註

Kubernetes 在線端點的 YAML 組態檔位於 endpoints/online/kubernetes/ 子目錄中。

定義端點和部署

線上端點用於線上 (即時) 推斷。 線上端點包含準備從用戶端接收資料的部署,且會即時傳送回應。

定義端點

下表列出定義端點時應指定的索引鍵屬性。

屬性 必要或選用 描述
名稱 為必填項目 端點的名稱。 它在其 Azure 區域中必須是唯一的。 如需命名規則的詳細資訊,請參閱 Azure Machine Learning 在線端點和批次端點
驗證模式 可選 端點的驗證方法。 您可以選擇金鑰型驗證、 key和 Azure Machine Learning 令牌型驗證。 aml_token 金鑰不會過期,但權杖會過期。 如需關於身分驗證的詳細資訊,請參閱 為在線端點進行用戶端驗證
描述 可選 端點的描述。
Tags 可選 端點的標籤字典。
交通流量 可選 跨部署對流量進行路由之方式的規則。 您可以將流量表示為索引鍵/值組的字典,其中索引鍵代表部署名稱,而值則代表該部署的流量百分比。 您只能在建立端點下的部署之後設定流量。 您也可以在建立部署之後更新線上端點的流量。 如需如何使用鏡像流量的詳細資訊,請參閱 將少量即時流量配置給新的部署
鏡像流量 可選 要鏡像至部署的即時流量百分比。 如需如何使用鏡像流量的詳細資訊,請參閱 使用鏡像流量測試部署

若要查看您可以在建立端點時指定之屬性的完整清單,請參閱 CLI (v2) 在線端點 YAML 架構。 如需適用於 Python 的 Azure Machine Learning SDK 第 2 版,請參閱 ManagedOnlineEndpoint 類別

定義部署

部署是裝載執行實際推斷之模型所需的一組資源。 下表說明定義部署時應指定的索引鍵屬性。

屬性 必要或選用 描述
名稱 為必填項目 部署的名稱。
端點名稱 為必填項目 要在其下建立部署的端點名稱。
模型 可選 要用於部署的模型。 此值可以是工作區中現有已建立版本模型的參考,也可以是內嵌模型規格。 在本文中的範例中,模型 scikit-learn 會進行回歸。
程式碼路徑 可選 本機開發環境上資料夾的路徑,其中包含用於評分模型的所有 Python 原始程式碼。 您可以使用巢狀目錄和套件。
評分指令碼 可選 會在指定的輸入要求上執行模型的 Python 程式碼。 此值可以是原始碼資料夾中評分檔案的相對路徑。
評分指令碼會接收提交給已部署 Web 服務的資料,並將資料傳遞給模型。 然後,此指令碼會執行模型,並將其回應傳回給用戶端。 評分指令碼是模型專用的,其必須了解模型預期的輸入資料和傳回的輸出資料。
本文的範例使用 score.py 檔案。 此 Python 程式碼必須具有 init 函式與 run 函式。 建立或更新模型之後會呼叫 函 init 式。 例如,您可以使用它來快取記憶體中的模型。 每次引動端點時會呼叫 run 函式,以執行實際評分和預測。
環境 為必填項目 用來裝載模型和程式碼的環境。 此值可以是工作區中現有已建立版本環境的參考,也可以是內嵌環境規格。 環境可以是具有 Conda 相依性的 Docker 映像、Dockerfile,或是已註冊的環境。
執行個體類型 為必填項目 要用於部署的虛擬機大小。 如需支援的大小清單,請參閱 受控在線端點 SKU 清單
執行個體計數 為必填項目 要用於部署的執行個體數目。 您會根據預期的工作負載來設定值。 為了達到高可用性,我們建議您使用至少三個實例。 Azure Machine Learning 會保留額外的 20% 來執行升級。 如需詳細資訊,請參閱 Azure Machine Learning 在線端點和批次端點

若要查看您可以在建立部署時指定之屬性的完整清單,請參閱 CLI (v2) 受控在線部署 YAML 架構。 如需 Python SDK 第 2 版,請參閱 ManagedOnlineDeployment 類別

建立線上端點

您必須先設定端點名稱,然後加以設定。 在本文中,您會使用 endpoints/online/managed/sample/endpoint.yml 檔案來設定端點。 該檔案包含下列幾行:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

下表描述端點 YAML 格式所使用的金鑰。 若要查看如何指定這些屬性,請參閱 CLI (v2) 在線端點 YAML 架構。 如需與受控在線端點相關的限制資訊,請參閱 Azure Machine Learning 在線端點和批次端點

Key 描述
$schema (選擇性) YAML 結構描述。 若要查看 YAML 檔案中的所有可用選項,您可以在瀏覽器中檢視上述程式代碼區塊中的架構。
name 端點的名稱。
auth_mode 驗證模式。 使用 key 進行金鑰式驗證。 使用 aml_token 進行 Azure Machine Learning 權杖型驗證。 若要取得最新的權杖,請使用 az ml online-endpoint get-credentials 命令。

若要建立線上端點:

  1. 執行下列 Unix 命令來設定端點名稱。 以唯一名稱取代 YOUR_ENDPOINT_NAME

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    重要事項

    端點名稱在 Azure 區域內必須是唯一的。 例如,在 Azure westus2 區域中,只能有一個名稱為 my-endpoint 的端點。

  2. 執行下列程序代碼,在雲端中建立端點。 此程式代碼會使用endpoint.yml檔案來設定端點:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

建立藍色部署

您可以使用 endpoints/online/managed/sample/blue-deployment.yml 檔案來設定名為 blue部署的主要層面。 該檔案包含下列幾行:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

若要使用 blue-deployment.yml 檔案來建立端點的 blue 部署,請執行下列命令:

az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic

重要事項

--all-traffic命令中的az ml online-deployment create標誌會將 100% 的端點流量分配給新建立的blue部署。

在blue-deployment.yaml 檔案中,行 path 會指定要上傳檔案的位置。 Azure Machine Learning CLI 會使用此資訊來上傳檔案並註冊模型和環境。 作為生產環境的最佳做法,您應該註冊模型和環境,並在 YAML 程式代碼中個別指定已註冊的名稱和版本。 使用模型格式 model: azureml:<model-name>:<model-version> ,例如 model: azureml:my-model:1。 在環境中,請使用格式environment: azureml:<environment-name>:<environment-version>,例如environment: azureml:my-env:1

註冊時,您可將 modelenvironment 的 YAML 定義擷取至個別的 YAML 檔案,並使用 az ml model createaz ml environment create 命令。 若要深入瞭解這些指令,請執行 az ml model create -haz ml environment create -h

如需將模型註冊為資產的詳細資訊,請參閱 使用 Azure CLI 或 Python SDK 註冊模型。 如需建立環境的詳細資訊,請參閱 建立自定義環境

確認您現有的部署

確認現有部署的其中一個方法是叫用您的端點,使其可以針對指定的輸入要求為您的模型評分。 當您透過 Azure CLI 或 Python SDK 叫用端點時,您可以選擇指定要接收連入流量的部署名稱。

附註

不同於 Azure CLI 或 Python SDK,Azure Machine Learning Studio 會要求您在叫用端點時指定部署。

使用部署名稱叫用端點

當您叫用端點時,您可以指定您要接收流量的部署名稱。 在此情況下,Azure Machine Learning 會將端點流量直接路由傳送至指定的部署,並傳回其輸出。 您可以使用 --deployment-nameAzure Machine Learning CLI v2 的選項,或 deployment_namePython SDK v2 的選項來指定部署。

叫用端點而不指定部署

如果您在未指定要接收流量的部署的情況下叫用端點,Azure Machine Learning 會依據流量控制設定,將該端點的流量傳送至端點中的各個部署。

流量控制設定會將指定百分比的傳入流量配置到端點中的每個部署。 例如,如果您的流量規則指定端點中的特定部署應該收到 40% 的時間傳入流量,Azure Machine Learning 會將 40% 的端點流量路由傳送至該部署。

若要檢視現有端點和部署的狀態,請執行下列命令:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

輸出會列出$ENDPOINT_NAME端點和blue部署的相關資訊。

使用範例數據測試端點

您可以使用 invoke 命令叫用端點。 下列命令會使用 sample-request.json JSON 檔案來傳送範例要求:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

縮放現有部署以處理更多流量

在使用 線上端點部署和評分機器學習模型中所述的部署中,您會在部署 YAML 檔案中將 值設定 instance_count1 。 您可以使用 update 命令來擴展。

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

附註

在上一個命令中,選項 --set 會覆蓋部署配置。 或者,您可以更新 YAML 檔案,並使用 update 選項將其作為輸入傳遞給 --file 命令。

部署新的模型,但不傳送流量

建立名為 green 的新部署:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

因為您未明確分配任何流量至 green 部署,因此分配到它的流量為零。 您可以使用下列命令來確認事實:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

測試新的部署

即使 green 部署流量已設定為 0%,您仍然可以直接使用 --deployment 選項叫用。

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

如果您想要使用 REST 用戶端直接叫用部署,而不透過流量規則,請設定下列 HTTP 標頭:azureml-model-deployment: <deployment-name>。 下列程式代碼使用 Client for URL (cURL) 直接叫用部署。 您可以在 Unix 或 Windows 子系統 Linux 版 (WSL) 環境中執行程式代碼。 如需擷取 $ENDPOINT_KEY 值的指示,請參閱 取得數據平面作業的密鑰或令牌

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

使用鏡像流量測試部署

測試 green 部署後,您可以將即時流量百分比鏡像到端點,方法是複製該流量百分比並將它發送至 green 部署。 流量鏡像也稱為鏡像處理,不會影響傳回給客戶端的結果,100% 的請求仍會流向 blue 部署。 流量的鏡像百分比會複製並提交至 green 部署,讓您可以收集計量和記錄,而不會影響您的用戶端。

當您想在不影響用戶端的情況下驗證新的部署時,鏡像非常有用。 例如,您可以使用鏡像來檢查延遲是否在可接受的範圍內,或檢查是否有 HTTP 錯誤。 使用流量鏡像或陰影來測試新的部署也稱為陰影測試。 接收鏡像流量的部署,在此案例中,green 部署也可以稱為影子部署

鏡像有下列限制:

  • Azure Machine Learning CLI 2.4.0 版及更新後的版本,以及 Python SDK 1.0.0 版及更新後的版本皆支援「鏡像」功能。 如果您使用舊版的 Azure Machine Learning CLI 或 Python SDK 來更新端點,您會遺失鏡像流量設定。
  • 鏡像目前不支援 Kubernetes 線上端點。
  • 您只能針對端點中的單一部署進行流量鏡像。
  • 您最多可以鏡像的流量百分比是 50%。 此上限會限制 端點頻寬配額的影響,其預設值為 5 MBps。 如果您超過配置的配額,您的端點帶寬會受到節流。 如需監視頻寬節流的相關信息,請參閱 頻寬節流

另請注意下列行為:

  • 您可以設定部署只接收即時流量或鏡像流量,而不是兩者。
  • 當您叫用端點時,可以指定其任何部署的名稱,甚至是陰影部署,以傳回預測。
  • 當您叫用端點並指定要接收連入流量的部署名稱時,Azure Machine Learning 不會將流量複製到影子部署。 Azure Machine Learning 只會在您未指定部署的情況下,將傳送至端點的流量對鏡像部署進行流量鏡像。

如果您將 green 部署設定為接收 10% 的鏡像流量,用戶端仍會收到僅來自部署的 blue 預測。

顯示流量流經端點的圖表。所有流量都會流向藍色部署,10% 會鏡像到綠色部署。

使用下列命令來鏡像 10% 的流量,並將其傳送至 green 部署:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

您可以多次呼叫端點來測試鏡像流量,而不需要指定部署來接收傳入流量。

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

您可以藉由檢查部署中的記錄,確認指定百分比的流量已傳送至 green 部署。

az ml online-deployment get-logs --name green --endpoint $ENDPOINT_NAME

測試之後,您可以將鏡像流量設定為零,以停用鏡像:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

將較低百分比的即時流量配置到新的部署

測試 green 部署之後,請分配少量流量給它。

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

秘訣

總流量百分比必須是 0%,才能停用流量,或 100% 來啟用流量。

您的 green 部署現在會收到 10% 的所有即時流量。 客戶會收到來自 bluegreen 部署的預測。

顯示流量流經端點的圖表。藍色部署會接收 90% 的流量,而綠色部署則為 10%。

將所有流量傳送給新的部署

當您對 green 部署完全滿意時,請將所有流量轉移至該部署。

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

移除舊的部署

使用下列步驟,從受控線上端點刪除個別部署。 刪除個別部署不會影響受控在線端點中的其他部署:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

刪除端點和部署

若您不打算使用端點和部署,則應將其刪除。 當您刪除端點時,也會刪除其所有基礎部署。

az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait