适用于:
Azure CLI ml 扩展 v2(当前)
Python SDK azure-ai-ml v2(当前)
Azure 机器学习提供了多种提交 ML 训练作业的方法。 本文介绍如何使用以下方法提交作业:
- 用于机器学习的Azure CLI扩展:
ml 扩展,也称为 CLI v2。
- Python SDK v2 for Azure 机器学习。
- REST API:CLI 和 SDK 所基于的 API。
先决条件
若要使用 REST API 信息,需要以下项:
工作区中的 服务主体 。 对管理 REST 请求使用 服务主体身份验证 。
服务主体 身份验证令牌。 按照 检索服务主体身份验证令牌 中的步骤获取此令牌。
curl 实用工具。 curl 程序在 适用于 Linux 的 Windows 子系统 或任何 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。
用于处理 JSON 的 jq 实用工具。 使用此实用工具从 REST API 调用返回的 JSON 文档中提取值。
克隆示例存储库
本文中的代码片段基于 Azure 机器学习 示例GitHub存储库中的示例。 若要将存储库克隆到开发环境,请使用以下命令:
git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
提示
使用 --depth 1 仅克隆存储库中的最新提交,从而减少操作完成所需的时间。
本文中的剩余命令假定你正在从 azureml-examples 目录中运行。
示例作业
本文中的示例使用鸢尾花数据集来训练 MLFlow 模型。
在云中训练
在云中训练时,必须连接到Azure 机器学习工作区,并选择一个计算资源来运行训练作业。
连接到工作区
提示
使用以下选项卡选择要用于训练模型的方法。 选择选项卡会自动将本文中的所有选项卡切换到同一选项卡。可以随时选择另一个选项卡。
若要连接到工作区,需要标识符参数 - 订阅、资源组和工作区名称。 使用 MLClient 命名空间中 azure.ai.ml 的这些详细信息获取所需 Azure 机器学习工作区的句柄。 若要进行身份验证,请使用 default Azure 身份验证。 有关如何配置凭据并连接到工作区的详细信息,请参阅此 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 机器学习 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 机器学习工作区的名称。
-
$COMPUTE_NAME:Azure 机器学习计算群集的名称。
管理 REST 请求需要 服务主体身份验证令牌。 可以使用以下命令检索令牌。 令牌存储在环境变量中 $TOKEN :
TOKEN=$(az account get-access-token --query accessToken -o tsv)
服务提供商使用 api-version 参数来确保兼容性。 参数 api-version 因服务而异。
本文使用 Azure 资源管理器终结点(management.azure.com)。 将 API_VERSION 设置为当前Azure 机器学习 资源管理器版本:
API_VERSION="2025-09-01"
如果您使用 Azure 机器学习数据路径 API,它们可能会使用不同的版本。 例如,Azure AI 资产数据平面引用使用 2024-04-01-preview。 有关详细信息,请参阅适用于 Azure 机器学习 (资源管理器) 和 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 机器学习计算群集是一种完全托管的计算资源,可用于运行训练作业。 在以下示例中,将创建名为 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 机器学习。
注意
若要使用 无服务器计算,请在此 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 - 运行训练脚本所需的环境。 在此示例中,使用由名为 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest 的Azure 机器学习提供的特选环境或现成环境。 你还可以通过指定基本 docker 映像并为其指定 conda yaml 来使用自定义环境。
-
inputs - 采用名称-值对形式的命令输入字典。 键是作业上下文中输入的名称,值为输入值。 在command中使用${{inputs.<input_name>}}表达式引用输入。 若要将文件或文件夹用作输入,请使用类 Input 。 有关详细信息,请参阅 SDK 和 CLI v2 表达式。
有关详细信息,请参阅 参考文档。
提交作业时,服务会返回Azure 机器学习工作室中作业状态的 URL。 使用工作室 UI 查看作业进度。 您还可以使用 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 - 运行训练脚本所需的环境。 在此示例中,使用由名为 AzureML-lightgbm-3.3@latest 的Azure 机器学习提供的特选环境或现成环境。 你还可以通过指定基本 docker 映像并为其指定 conda yaml 来使用自定义环境。
若要提交作业,请使用以下命令。 训练作业的运行 ID(名称)存储在变量中 $run_id :
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
使用存储的运行 ID 返回有关作业的信息。
--web 参数将打开Azure 机器学习工作室 Web UI,可在其中深入了解作业的详细信息:
az ml job show -n $run_id --web
提交作业时,需要将训练脚本和数据上传到Azure 机器学习工作区可以访问的云存储位置。
使用以下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 机器学习 中的 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\"
}
}"
注册对训练脚本的版本化参考,用于作业。 在此示例中,脚本位置是步骤 1 中上传到的默认存储帐户和容器。 返回版本化训练代码的 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')
创建群集用于运行训练脚本的环境。 在此示例中,使用由名为 AzureML-lightgbm-3.3 的Azure 机器学习提供的特选环境或现成环境。
Azure 资源管理器不支持环境 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 机器学习训练和命令作业不支持使用自定义域名标签的Azure容器注册表(ACR)。 引用此类注册表的作业可能会在启动期间因镜像拉取或环境解析错误而失败。 若要避免此问题:
- 对 ACR 使用默认登录服务器格式 (
<registry-name>.azurecr.io)。
- 创建注册表时,将 域名标签范围 设置为 “不安全”。
监控训练任务
等待训练作业完成,然后注册模型。 作业状态通过 Starting → Preparing →→ RunningCompleted转换。
使用 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 机器学习工作区中注册模型。
提示
训练作业返回一个 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"
解决常见问题
| Error |
原因 |
解决方案 |
ImportError: No module named 'azure.identity' |
缺少 azure-identity 包 |
pip install azure-identity运行 |
DefaultAzureCredential failed |
未登录到Azure |
首先运行az login,或设置用于服务主体身份验证的环境变量 |
ComputeNotFound |
群集名称不匹配或群集已删除 |
验证群集名称并检查预配状态 |
EnvironmentNotFound |
精选环境已弃用或不可用 |
使用 ml_client.environments.list() 列出可用环境,并使用当前版本 |
QuotaExceeded |
VM 大小的 vCPU 配额不足 |
请求增加配额 或使用较小的 VM 大小 |
有关环境特定问题,请参阅排查环境镜像构建问题。
后续步骤
现在已训练模型, 请了解如何使用联机终结点部署模型。
有关更多示例,请参阅 Azure 机器学习 示例 GitHub存储库。
有关本文中使用的Azure CLI命令、Python SDK 类或 REST API 的详细信息,请参阅以下参考文档: