將機器學習模型部署至 Azure

適用於:Azure CLI ml 延伸模組 第 1 版Python SDK azureml v1

了解如何將您的機器學習或深度學習模型部署為 Azure 雲端中的 Web 服務。

注意

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

部署模型的工作流程

無論部署模型的位置為何,工作流程都十分類似:

  1. 註冊模型。
  2. 準備輸入腳本。
  3. 準備推斷設定。
  4. 在本機部署模型,以確保一切運作正常。
  5. 選擇計算目標。
  6. 將模型部署至雲端。
  7. 測試所產生的 Web 服務。

如需機器學習部署工作流程中相關概念的詳細資訊,請參閱使用 Azure Machine Learning 來管理、部署及監視模型

必要條件

適用於:Azure CLI ml 延伸模組 v1

重要

本文中的 Azure CLI 命令使用 azure-cli-ml 或 v1 (Azure Machine Learning 的擴充功能)。 v1 擴充功能的支援將於 2025 年 9 月 30 日終止。 您將能安裝並使用 v1 擴充功能,直到該日期為止。

建議您在 2025 年 9 月 30 日之前轉換至 ml 或 v2 擴充功能。 如需有關 v2 擴充功能的詳細資訊,請參閱 Azure ML CLI 擴充功能和 Python SDK v2

  • Azure Machine Learning 工作區。 如需詳細資訊,請參閱建立工作區資源
  • 模型。 本文中的範例會使用預先定型的模型。
  • 可以執行 Docker 的機器,例如計算執行個體

連線到您的工作區

適用於:Azure CLI ml 延伸模組 v1

若要查看您有權存取的工作區,請使用下列命令:

az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>

註冊模型

已部署機器學習服務的一般情況,就是您需要下列元件:

  • 代表您要部署的特定模型的資源 (例如:pytorch 模型檔案)。
  • 您將在服務中執行的程式碼,該程式碼會在給定的輸入上執行模型。

Azure Machine Learning 可讓您將部署區分成兩個不同的元件,而得以保留相同的程式碼,僅更新模型。 我們將您個別上傳模型與程式碼的機制定義為「註冊模型」

當您註冊模型時,我們會將模型上傳至雲端 (位於您工作區的預設儲存體帳戶中),然後將其掛接到 Web 服務執行所在的同一計算。

下列範例示範如何註冊模型。

重要

您應該只使用您建立或從信任來源取得的模型。 您應該將序列化模型視為程式碼,因為已探索到許多常用格式的安全性弱點。 此外,模型可能會刻意以惡意意圖訓練,以提供偏差或不正確的輸出。

適用於:Azure CLI ml 延伸模組 v1

下列命令會下載模型,然後向您的 Azure Machine Learning 工作區註冊該模型:

wget https://aka.ms/bidaf-9-model -O model.onnx --show-progress
az ml model register -n bidaf_onnx \
    -p ./model.onnx \
    -g <resource-group> \
    -w <workspace-name>

-p 設定為您想要註冊的資料夾或檔案路徑。

如需 az ml model register 的詳細資訊,請參閱參考文件

從 Azure Machine Learning 定型作業註冊模型

如果需要註冊先前透過 Azure Machine Learning 定型作業建立的模型,您可以指定實驗、回合,以及此模型的路徑:

az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna

--asset-path 參數指的是模型的雲端位置。 在此範例中,會使用單一檔案的路徑。 若要在模型註冊中包含多個檔案,請將 --asset-path 設定為包含檔案的資料夾路徑。

如需 az ml model register 的詳細資訊,請參閱參考文件

注意

您也可以透過工作區 UI 入口網站,從本機檔案註冊模型。

目前,有兩個選項可在 UI 中上傳本機模型檔案:

  • 從本機檔案,這會註冊 v2 模型。
  • 從本機檔案 (根據架構),這會註冊 v1 模型。

請注意,只有透過從本機檔案 (根據架構) 入口所註冊的模型 (稱為 v1 模型) 才能使用 SDKv1/CLIv1 部署為 webservices。

定義虛擬輸入腳本

輸入指令碼會接收提交給已部署 Web 服務的資料,並將其傳遞給模型。 然後,其會將模型的回應傳回給用戶端。 腳本是您模型特有的。 輸入腳本必須了解模型預期並傳回的資料。

您需要在輸入腳本中完成的兩個事項如下:

  1. 載入您的模型 (使用稱為 init() 的函數)
  2. 在輸入資料上執行模型 (使用稱為 run() 的函數)

針對您的初始部署,請使用會列印其所收到資料的虛擬輸入腳本。

import json


def init():
    print("This is init")


def run(data):
    test = json.loads(data)
    print(f"received data {test}")
    return f"test is {test}"

將此檔案儲存為目錄 (稱為 source_dir) 內的 echo_score.py 這個虛擬腳本會傳回您傳送給其的資料,因此其不會使用此模型。 但是,其有助於測試評分指令碼是否執行中。

定義推斷設定

推斷設定會描述要在初始化 Web 服務時使用的 Docker 容器和檔案。 當您部署 Web 服務時,來源目錄 (包括子目錄) 內的所有檔案都會壓縮並上傳至雲端。

下列推斷設定會指定機器學習部署將會使用 ./source_dir 目錄中的檔案 echo_score.py,來處理傳入要求,而且其會使用 Docker 映像,搭配 project_environment 環境中指定的 Python 套件。

建立專案環境時,您可以使用任何 Azure Machine Learning 推斷策展環境,作為基礎 Docker 映像。 我們會將必要的相依性安裝在最上方,並將產生的 Docker 映像儲存到與您工作區相關聯的存放庫中。

注意

Azure Machine Learning 推斷來源目錄上傳不會遵守 .gitignore.amlignore

適用於:Azure CLI ml 延伸模組 v1

最小推斷設定可以撰寫成:

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "1"
    }
}

以名稱 dummyinferenceconfig.json 儲存檔案。

請參閱這篇文章,以取得更詳盡的推斷設定討論。

定義部署設定

部署設定會指定 Web 服務為了執行所需的記憶體和核心數量。 其也會提供基礎 Web 服務的設定詳細資料。 例如,部署設定可讓您指定您的服務需要 2 GB 的記憶體、2個 CPU 核心、1個 GPU 核心,以及您想要啟用自動調整。

部署設定可用的選項會根據您所選擇的計算目標而有所不同。 在本機部署中,您只需要指定要提供 Web 服務的連接埠。

適用於:Azure CLI ml 延伸模組 v1

deploymentconfig.json 文件中的項目會對應至 LocalWebservice.deploy_configuration 的參數。 下表描述 JSON 文件中的實體之間的對應以及方法的參數:

JSON 實體 方法參數 描述
computeType NA 計算目標。 若為本機目標,該值必須為 local
port port 本機連接埠上公開服務的 HTTP 端點。

此 JSON 是與 CLI 搭配使用的範例部署設定:

{
    "computeType": "local",
    "port": 32267
}

將此 JSON 儲存為稱為 deploymentconfig.json 的檔案。

如需詳細資訊,請參閱部署結構描述

部署您的機器學習服務模型

您現在可以開始部署您的模型。

適用於:Azure CLI ml 延伸模組 v1

bidaf_onnx:1 取代為您的模型名稱及其版本號碼。

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic dummyinferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

呼叫您的模型

讓我們檢查您的回應模型是否已成功部署。 您應該能夠執行簡單的活躍度要求,以及評分要求:

適用於:Azure CLI ml 延伸模組 v1

curl -v http://localhost:32267
curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

定義輸入腳本

現在是時候實際載入您的模型。 首先,修改您的輸入腳本:

import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk


def init():
    nltk.download("punkt")
    global sess
    sess = onnxruntime.InferenceSession(
        os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
    )


def run(request):
    print(request)
    text = json.loads(request)
    qw, qc = preprocess(text["query"])
    cw, cc = preprocess(text["context"])

    # Run inference
    test = sess.run(
        None,
        {"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
    )
    start = np.asscalar(test[0])
    end = np.asscalar(test[1])
    ans = [w for w in cw[start : end + 1].reshape(-1)]
    print(ans)
    return ans


def preprocess(word):
    tokens = word_tokenize(word)

    # split into lower-case word tokens, in numpy array with shape of (seq, 1)
    words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)

    # split words into chars, in numpy array with shape of (seq, 1, 1, 16)
    chars = [[c for c in t][:16] for t in tokens]
    chars = [cs + [""] * (16 - len(cs)) for cs in chars]
    chars = np.asarray(chars).reshape(-1, 1, 1, 16)
    return words, chars

將此檔案儲存為 score.py,而不是 source_dir

請注意,使用 AZUREML_MODEL_DIR 環境變數來找出您註冊的模型。 現在您已新增一些 pip 套件。

適用於:Azure CLI ml 延伸模組 v1

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults",
                            "nltk",
                            "numpy",
                            "onnxruntime"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "2"
    }
}

將此檔案儲存為 inferenceconfig.json

再次部署並呼叫您的服務

請重新部署您的服務:

適用於:Azure CLI ml 延伸模組 v1

bidaf_onnx:1 取代為您的模型名稱及其版本號碼。

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

然後確定您可以將 Post 要求傳送至服務:

適用於:Azure CLI ml 延伸模組 v1

curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

選擇計算目標

用來裝載模型的計算目標會影響已部署端點的成本和可用性。 使用此資料表選擇適當的計算目標。

計算目標 用於 GPU 支援 描述
本機 Web 服務 測試/偵錯   用於有限的測試和疑難排解。 硬體加速取決於本機系統中的程式庫使用情況。
Azure Machine Learning Kubernetes 即時推斷 Yes 在雲端中執行推斷工作負載。
Azure 容器執行個體 即時推斷

建議僅用於開發/測試目的。
  用於需要少於 48 GB RAM 的低規模 CPU 型工作負載。 您無須管理叢集。

僅適用於大小小於 1 GB 的模型。

在設計工具中支援。

注意

選擇叢集 SKU 時,請先進行擴大再擴增。從擁有模型所需 RAM 的 150% 的電腦開始,分析結果並找出具有所需效能的電腦。 了解這點之後,請增加電腦數目,以符合您的同時推斷需求。

注意

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

部署至雲端

一旦確認了您的服務在本機運作並選擇了遠端計算目標,您就可以開始部署至雲端。

變更您的部署設定,以對應至您所選擇的計算目標,在此案例中為 Azure 容器執行個體:

適用於:Azure CLI ml 延伸模組 v1

部署設定可用的選項會根據您所選擇的計算目標而有所不同。

{
    "computeType": "aci",
    "containerResourceRequirements":
    {
        "cpu": 0.5,
        "memoryInGB": 1.0
    },
    "authEnabled": true,
    "sslEnabled": false,
    "appInsightsEnabled": false
}

將此檔案儲存為 re-deploymentconfig.json

如需詳細資訊,請參閱此參考

請重新部署您的服務:

適用於:Azure CLI ml 延伸模組 v1

bidaf_onnx:1 取代為您的模型名稱及其版本號碼。

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc re-deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

若要檢視服務記錄,請使用下列命令:

az ml service get-logs -n myservice \
    -g <resource-group> \
    -w <workspace-name>

呼叫您的遠端 Web 服務

當您在遠端部署時,可能已啟用金鑰驗證。 以下範例說明如何使用 Python 取得您的服務金鑰,以提出推斷要求。

import requests
import json
from azureml.core import Webservice

service = Webservice(workspace=ws, name="myservice")
scoring_uri = service.scoring_uri

# If the service is authenticated, set the key or token
key, _ = service.get_keys()

# Set the appropriate headers
headers = {"Content-Type": "application/json"}
headers["Authorization"] = f"Bearer {key}"

# Make the request and display the response and logs
data = {
    "query": "What color is the fox",
    "context": "The quick brown fox jumped over the lazy dog.",
}
data = json.dumps(data)
resp = requests.post(scoring_uri, data=data, headers=headers)
print(resp.text)
print(service.get_logs())

如需更多其他語言的範例用戶端,請參閱有關要取用 Web 服務的用戶端應用程式一文。

如何在工作室中設定電子郵件

若要開始在作業、線上端點或批次端點完成,或是發生問題 (失敗、已取消) 時接收電子郵件,請使用下列步驟:

  1. 在 Azure ML 工作室中,選取齒輪圖示來移至設定。
  2. 選取 [電子郵件通知] 索引標籤。
  3. 切換以啟用或停用特定事件的電子郵件通知。

Screenshot of Azure ML studio's settings on the email notifications tab.

了解服務狀態

在模型部署期間,您可能會在其完全部署時看到服務狀態變更。

下表描述不同的服務狀態:

Web 服務狀態 描述 最終狀態?
正在轉換 服務正在進行部署。 No
Unhealthy 服務已部署,但目前無法連線。 No
無法排程 由於缺少資源,目前無法部署服務。 No
失敗 由於錯誤或損毀,服務無法部署。 Yes
Healthy 服務狀況良好且端點可用。 Yes

提示

部署時,會建置計算目標的 Docker 映像,並從 Azure Container Registry (ACR) 載入這些映像。 根據預設,Azure Machine Learning 會建立使用基本服務層級的 ACR。 將工作區的 ACR 變更為標準或進階層,可能會減少建置映像並將其載入至計算目標所需的時間。 如需詳細資訊,請參閱 Azure Container Registry 服務層級

注意

如果您要將模型部署到 Azure Kubernetes Service (AKS),建議您為該叢集啟用 Azure 監視器。 這可協助您了解整體叢集的健康情況和資源使用量。 您也可能會發現下列資源很有用:

如果您嘗試將模型部署到狀況不良或多載的叢集,則應該會遇到問題。 如果您在對 AKS 叢集問題進行疑難排解時需要協助,請連絡 AKS 支援人員。

刪除資源

適用於:Azure CLI ml 延伸模組 v1

# Get the current model id
import os

stream = os.popen(
    'az ml model list --model-name=bidaf_onnx --latest --query "[0].id" -o tsv'
)
MODEL_ID = stream.read()[0:-1]
MODEL_ID
az ml service delete -n myservice
az ml service delete -n myaciservice
az ml model delete --model-id=<MODEL_ID>

若要刪除已部署的 Web 服務,請使用 az ml service delete <name of webservice>

若要從您的工作區中刪除已註冊的模型,請使用 az ml model delete <model id>

深入閱讀刪除 Web 服務刪除模型

下一步