適用於:
Azure CLI ml extension v2 (current)
Python SDK azure-ai-ml v2 (current)
Azure Machine Learning 提供多種方式提交機器學習訓練工作。 在本文中,您將學習如何透過以下方法提交職缺:
- Azure CLI 機器學習擴充功能:
ml 擴充,亦稱為 CLI v2。
- Python SDK v2 for Azure Machine Learning.
- REST API:CLI 和 SDK 所建立的 API。
先決條件
要使用 REST API 資訊,您需要具備以下條件:
工作區中的服務主體。 管理 REST 請求使用 服務主體認證 。
服務主體 認證令牌。 請依照「 取得服務主體認證權杖 」中的步驟取得此權杖。
curl 工具。 curl 程式可在 Windows 子系統 Linux 版 或任何 UNIX 發行版中取得。
提示
在 PowerShell 中, curl 是 的別名 Invoke-WebRequest。 指令 curl -d "key=val" -X POST uri 變為 Invoke-WebRequest -Body "key=val" -Method POST -Uri uri。
雖然可以從 PowerShell 呼叫 REST API,但本文的範例假設你使用 Bash。
JQ 工具用於處理 JSON。 使用此工具從 REST API 呼叫回傳的 JSON 文件中提取值。
複製範例庫
本文中的程式碼片段基於 Azure Machine Learning 範例 GitHub 儲存庫。 要將該儲存庫複製到你的開發環境,請使用以下指令:
git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
提示
使用 --depth 1 僅複製存放庫的最新認可,如此可縮短完成作業的時間。
本文剩下的指令假設你是從 azureml-examples 目錄執行。
範例工作
本文範例使用鳶尾花資料集來訓練 MLFlow 模型。
雲端訓練
當你在雲端訓練時,必須連接到你的 Azure Machine Learning 工作空間,並選擇一個運算資源來執行訓練工作。
連線到工作區
提示
請使用以下分頁選擇你想用來訓練模型的方法。 選擇分頁會自動將本文中所有分頁切換到同一個分頁。你隨時可以選擇其他分頁。
要連接工作區,你需要識別碼參數——訂閱、資源群組和工作區名稱。 使用 MLClient 命名空間中的 azure.ai.ml 中的這些詳細資訊,以獲取所需的 Azure Machine Learning 工作區的句柄。 要驗證,請使用 default Azure authentication。 欲了解更多如何設定憑證及連接工作區的資訊,請參閱此 example。
#import required libraries
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
#Enter details of your Azure Machine Learning workspace
subscription_id = '<SUBSCRIPTION_ID>'
resource_group = '<RESOURCE_GROUP>'
workspace = '<AZUREML_WORKSPACE_NAME>'
#connect to the workspace
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group, workspace)
請列印工作區名稱以驗證連結:
print(ml_client.workspace_name)
使用 Azure CLI 時,你需要識別碼參數——訂閱、資源群組和工作區名稱。 雖然你可以為每個指令指定這些參數,但你也可以設定所有指令都使用的預設值。 請使用以下指令設定預設值。 將 <subscription ID>、<Azure Machine Learning workspace name> 和 <resource group> 替換成你的配置值:
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
本文中的 REST API 範例使用 $SUBSCRIPTION_ID、 $RESOURCE_GROUP、 $LOCATION和 $WORKSPACE 佔位符。 請用你自己的值替換佔位符,如下:
-
$SUBSCRIPTION_ID:你的Azure訂閱ID。
-
$RESOURCE_GROUP:包含你工作區的Azure資源群組。
-
$LOCATION:工作區所在的Azure區域。
-
$WORKSPACE:你Azure Machine Learning工作區的名稱。
-
$COMPUTE_NAME:你Azure Machine Learning計算叢集的名稱。
管理 REST 請求需要服務 主體認證憑證。 你可以用以下指令取得一個標記。 該令牌儲存在環境變數中 $TOKEN :
TOKEN=$(az account get-access-token --query accessToken -o tsv)
服務提供者使用 api-version 該參數來確保相容性。 這個 api-version 引數因服務而異。
本文使用Azure Resource Manager端點(management.azure.com)。 將 API_VERSION 設為目前的 Azure Machine Learning Resource Manager 版本:
API_VERSION="2025-09-01"
如果你使用 Azure Machine Learning 的資料平面 API,他們可以使用不同版本。 例如,Azure AI 資產資料平面參考使用2024-04-01-preview。 欲了解更多資訊,請參閱 REST 作業群組 Azure Machine Learning (Resource Manager) 及 Azure AI 資產(資料平面)。
使用 REST API 訓練時,必須將資料和訓練腳本上傳到工作區可存取的儲存帳號。 以下範例會取得你工作區的儲存資訊,並將其儲存成變數,方便你日後使用:
# Get values for storage account
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
--header "Authorization: Bearer $TOKEN")
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
建立一個訓練用的運算資源
Azure Machine Learning 運算叢集是一個完全管理的運算資源,可以用來執行訓練工作。 在以下範例中,你會建立一個名為 cpu-cluster的運算叢集。
from azure.ai.ml.entities import AmlCompute
# specify aml compute name.
cpu_compute_target = "cpu-cluster"
try:
ml_client.compute.get(cpu_compute_target)
except Exception:
print("Creating a new cpu compute target...")
compute = AmlCompute(
name=cpu_compute_target, size="STANDARD_D2_V2", min_instances=0, max_instances=4
)
ml_client.compute.begin_create_or_update(compute).result()
確認計算叢集是否存在:
cpu_cluster = ml_client.compute.get("cpu-cluster")
print(f"Compute '{cpu_cluster.name}' provisioning state: {cpu_cluster.provisioning_state}")
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 4
curl -X PUT \
"https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME?api-version=$API_VERSION" \
-H "Authorization:Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "'$LOCATION'",
"properties": {
"computeType": "AmlCompute",
"properties": {
"vmSize": "Standard_D2_V2",
"vmPriority": "Dedicated",
"scaleSettings": {
"maxNodeCount": 4,
"minNodeCount": 0,
"nodeIdleTimeBeforeScaleDown": "PT30M"
}
}
}
}'
提示
雖然操作會在幾秒後回傳回應,但這個回應僅表示建立請求已被接受。 叢集建立可能需要好幾分鐘。
提交訓練作業
執行此腳本時,使用一個 command,執行位於 ./sdk/python/jobs/single-step/lightgbm/iris/src/ 下的 main.py Python 腳本。 你把指令以 job 提交給 Azure Machine Learning。
註
若要使用 無伺服器運算,請在這段程式碼中刪除 compute="cpu-cluster" 。
from azure.ai.ml import command, Input
# define the command
command_job = command(
code="./src",
command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
inputs={
"iris_csv": Input(
type="uri_file",
path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
),
"learning_rate": 0.9,
"boosting": "gbdt",
},
compute="cpu-cluster",
)
在同一場 Python 會議中提交職缺:
# submit the command
returned_job = ml_client.jobs.create_or_update(command_job)
# get a URL for the status of the job
returned_job.studio_url
在前面的例子中,你設定了:
-
code - 執行指令程式碼所在的路徑。
-
command - 需要執行的指令。
-
environment - 執行訓練腳本所需的環境。 在此範例中,使用由Azure Machine Learning提供的精選或現成環境,稱為 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest。 你也可以透過指定一個基礎 docker 映像檔,並在其上設定一個 conda yaml,來使用自訂環境。
-
inputs - 使用名稱值對作為指令的輸入字典。 鍵是工作上下文中輸入的名稱,而值則是輸入值。 使用command表達式參考${{inputs.<input_name>}}中的輸入。 若要使用檔案或資料夾作為輸入,請使用該 Input 類別。 欲了解更多資訊,請參閱 SDK 與 CLI v2 表達式。
欲了解更多資訊,請參閱 參考文件。
當你提交工作時,服務會回傳一個 Azure Machine Learning 工作室 中工作狀態的 URL。 使用工作室介面查看工作進度。 你也可以用來 returned_job.status 查詢該職缺的當前狀態。
print(f"Studio URL: {returned_job.studio_url}")
az ml job create此範例中的指令需要一個 YAML 工作定義檔案。 本範例中使用的檔案包含以下內容:
註
若要使用 無伺服器運算,請在這段程式碼中刪除 compute: azureml:cpu-cluster" 。
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
python main.py
--iris-csv ${{inputs.iris_csv}}
inputs:
iris_csv:
type: uri_file
path: https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
environment: azureml:AzureML-lightgbm-3.3@latest
compute: azureml:cpu-cluster
display_name: lightgbm-iris-example
experiment_name: lightgbm-iris-example
description: Train a LightGBM model on the Iris dataset.
在前一個 YAML中,你設定了:
-
code - 執行指令程式碼所在的路徑。
-
command - 需要執行的指令。
-
inputs - 使用名稱值對作為指令的輸入字典。 鍵是工作上下文中輸入的名稱,而值則是輸入值。 輸入會在command中使用${{inputs.<input_name>}}表達式來引用。 欲了解更多資訊,請參閱 SDK 與 CLI v2 表達式。
-
environment - 執行訓練腳本所需的環境。 在此範例中,使用由Azure Machine Learning提供的精選或現成環境,稱為 AzureML-lightgbm-3.3@latest。 你也可以透過指定一個基礎 docker 映像檔,並在其上設定一個 conda yaml,來使用自訂環境。
要提交工作,請使用以下指令。 訓練任務的執行識別碼(名稱)儲存在變數中 $run_id :
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
使用儲存的執行 ID 來回傳關於工作的資訊。
--web 參數會開啟 Azure Machine Learning 工作室 網頁介面,讓你可以深入挖掘工作細節:
az ml job show -n $run_id --web
當你提交工作時,你需要將訓練腳本和資料上傳到你的 Azure Machine Learning 工作區能存取的雲端儲存位置。
請使用以下 Azure CLI 指令上傳訓練腳本。 該指令指定包含訓練所需檔案的 目錄 ,而非單一檔案。 如果你想用 REST 上傳資料,請參考 Put Blob 參考:
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/lightgbm/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
建立訓練資料的版本參考。 在此範例中,資料已在雲端,且位於 https://azuremlexamples.blob.core.windows.net/datasets/iris.csv。 欲了解更多關於資料引用的資訊,請參閱Azure Machine Learning 中的 Data。
DATA_VERSION=$RANDOM
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/data/iris-data/versions/$DATA_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Iris dataset\",
\"dataType\": \"uri_file\",
\"dataUri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
}"
註冊一個版本化的訓練腳本引用,以便在作業中使用。 在這個例子中,腳本的位置是你在第一步上傳到的預設儲存帳號和容器。 傳回並儲存版本化訓練程式碼的 ID 於 $TRAIN_CODE 變數中:
TRAIN_CODE=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/train-lightgbm/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Train code\",
\"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/testjob\"
}
}" | jq -r '.id')
建立叢集用來執行訓練腳本的環境。 在此範例中,使用由Azure Machine Learning提供的精選或現成環境,稱為 AzureML-lightgbm-3.3。
Azure Resource Manager 不支援環境 ID 的 @latest 捷徑。 以下指令列出環境版本,並選擇最近修改的版本 ID,該 ID 會儲存在變數中 $ENVIRONMENT 。
ENVIRONMENT_NAME="AzureML-lightgbm-3.3"
ENVIRONMENT=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/$ENVIRONMENT_NAME/versions?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" | jq -r '.value | sort_by(.systemData.lastModifiedAt) | last | .id')
最後,提交任務。 以下範例說明如何提交工作、參考訓練代碼 ID、環境 ID、輸入資料的 URL 以及計算叢集的 ID。 工作輸出位置儲存在變 $JOB_OUTPUT 數中:
提示
工作名稱必須是唯一的。 在此範例中, uuidgen 用來產生名稱的唯一值。
註
若要使用 無伺服器運算,請刪除此程式碼中的該行 \"computeId\": 。
run_id=$(uuidgen)
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/jobs/$run_id?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"jobType\": \"Command\",
\"codeId\": \"$TRAIN_CODE\",
\"command\": \"python main.py --iris-csv \$AZURE_ML_INPUT_iris\",
\"environmentId\": \"$ENVIRONMENT\",
\"inputs\": {
\"iris\": {
\"jobInputType\": \"uri_file\",
\"uri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
},
\"experimentName\": \"lightgbm-iris\",
\"computeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME\"
}
}"
重要
Azure Machine Learning 的訓練與指令工作不支援使用自訂網域名稱標籤的 Azure 容器登錄檔(ACR)。 參考此類登錄檔的工作可能在啟動時因映像拉取或環境解析錯誤而失敗。 為了避免這個問題:
- 針對您的 ACR,使用預設登入伺服器格式 (
<registry-name>.azurecr.io)。
- 建立登錄檔時,將 網域名稱標籤範圍 設為 不安全。
監控訓練作業
請等訓練工作完成後再註冊模型。 工作狀態會依 Starting → Preparing → Running → Completed轉換。
用 ml_client.jobs.stream() 來即時監控工作輸出:
ml_client.jobs.stream(returned_job.name)
或者,也可以用程式化方式查看職缺狀態:
returned_job = ml_client.jobs.get(returned_job.name)
print(f"Job status: {returned_job.status}")
使用 az ml job show 搭配 --query status 命令來檢查作業狀態:
az ml job show -n $run_id --query status -o tsv
若要持續顯示作業日誌直到完成:
az ml job stream -n $run_id
透過 GET 請求查詢工作狀態:
curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/jobs/$run_id?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" | jq -r '.properties.status'
註冊訓練好的模型
以下範例示範如何在您的 Azure Machine Learning 工作空間中註冊模型。
提示
訓練作業回傳一個 name 屬性。 將這個名稱作為通往模型路徑的一部分。
from azure.ai.ml.entities import Model
from azure.ai.ml.constants import AssetTypes
run_model = Model(
path="azureml://jobs/{}/outputs/artifacts/paths/model/".format(returned_job.name),
name="run-model-example",
description="Model created from run.",
type=AssetTypes.MLFLOW_MODEL
)
ml_client.models.create_or_update(run_model)
確認該型號有註冊:
registered_model = ml_client.models.get("run-model-example", version="1")
print(f"Model '{registered_model.name}' version {registered_model.version} registered successfully.")
提示
將變數中儲存 $run_id 的名稱作為模型路徑的一部分。
az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
提示
將變數中儲存 $run_id 的名稱作為模型路徑的一部分。
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"modelType\": \"mlflow_model\",
\"modelUri\":\"runs:/$run_id/model\"
}
}"
清理資源
如果你不打算用運算叢集做更多訓練工作,刪除它以避免產生費用。 只要叢集存在,就會持續計費,即使沒有任何節點在執行。
ml_client.compute.begin_delete("cpu-cluster").wait()
az ml compute delete -n cpu-cluster --yes
curl --location --request DELETE "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN"
解決常見錯誤
| 錯誤 |
原因 |
Resolution |
ImportError: No module named 'azure.identity' |
遺失包裹azure-identity |
pip install azure-identity執行 |
DefaultAzureCredential failed |
未登入 Azure |
先執行 az login ,或設定環境變數以進行 服務主體認證 |
ComputeNotFound |
叢集名稱不符或叢集刪除 |
確認叢集名稱並檢查配置狀態 |
EnvironmentNotFound |
已淘汰或無法使用的精選環境 |
列出可用 ml_client.environments.list() 環境,並使用目前版本 |
QuotaExceeded |
虛擬機容量的 vCPU 配額不足 |
請求增加配額 或使用較小的虛擬機容量 |
關於環境特定問題,請參見 「排除環境映像建置問題」。
下一步
既然你已經有訓練好模型,請學習 如何用線上端點部署它。
更多範例請參見 Azure Machine Learning 範例 GitHub 資料庫。
欲了解更多關於本文中使用的 Azure CLI 指令、Python SDK 類別或 REST API 的資訊,請參閱以下參考文件: