使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

Azure 机器学习提供了多种提交 ML 训练作业的方法。 本文介绍如何使用以下方法提交作业:

  • 用于机器学习的 Azure CLI 扩展:ml 扩展,也称为 CLI v2。
  • 用于 Azure 机器学习的 Python SDK v2。
  • REST API:CLI 和 SDK 所基于的 API。

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 尝试试用版订阅
  • Azure 机器学习工作区。 如果没有,可以使用创建资源以开始使用一文中的步骤。

若要使用 SDK,请执行以下操作:

克隆示例存储库

本文中的代码片段基于 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 机器学习工作区句柄。 若要进行身份验证,请使用 默认的 Azure 身份验证。 有关如何配置凭据并连接到工作区的详细信息,请参阅 此示例

#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 机器学习计算群集是一种完全托管的计算资源,可用于运行训练作业。 在以下示例中,将创建名为 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}")

提交训练作业

若要运行此脚本,请使用command中位于command下的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.services["Studio"].endpoint

在前面的示例中,你配置了:

  • code - 运行命令的代码所在的路径。
  • command - 需要运行的命令。
  • environment - 运行训练脚本所需的环境。 在此示例中,使用名为 Azure 机器学习 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest的特选环境或现成环境。 你还可以通过指定基础 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}")

Important

Azure 机器学习训练和命令作业不支持使用自定义域名标签的Azure容器注册表(ACR)。 引用此类注册表的作业可能会在启动期间因镜像拉取或环境解析错误而失败。 若要避免此问题:

  • 对 ACR 使用默认登录服务器格式 (<registry-name>.azurecr.io)。
  • 创建注册表时,将 域名标签范围 设置为 “不安全”。

监视训练作业

等待训练作业完成,然后注册模型。 作业状态通过 StartingPreparing →→ 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}")

注册已训练的模型

以下示例介绍如何在 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.")

清理资源

如果不打算将计算群集用于更多训练作业,请将其删除以停止产生费用。 只要该群集存在,就会持续计费,即使没有任何运行中的节点。

ml_client.compute.begin_delete("cpu-cluster").wait()

解决常见问题

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 的详细信息,请参阅以下参考文档: