使用 Azure ML Python SDK v2(预览版)训练模型

适用于:Python SDK azure-ai-ml v2(当前版本)

重要

SDK v2 目前以公共预览版提供。 该预览版在提供时没有附带服务级别协议,建议不要将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

本文介绍如何配置和提交 Azure 机器学习作业以训练模型。 代码片段说明了配置和提交训练作业的关键部分。 然后,使用其中一个示例笔记本查找完整的端到端工作示例。

先决条件

克隆示例存储库

若要运行训练示例,请首先克隆示例存储库,然后更改为 sdk 目录:

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

提示

使用 --depth 1 仅克隆最新提交到存储库的内容,从而减少完成操作所需的时间。

在本地计算机上开始

首先运行一个使用 lightgbm 训练模型的脚本。 此处提供了脚本文件。 该脚本需要三个输入

  • 输入数据:为运行使用来自 Web 位置的数据 - Web 位置。 在此示例中,为简明起见,我们将使用远程位置的文件,但你也可以使用本地文件。
  • 学习速率:使用学习速率 0.9
  • 提升:使用梯度提升 gdbt

按如下所示运行此脚本文件

cd jobs/single-step/lightgbm/iris

python src/main.py --iris-csv https://azuremlexamples.blob.core.chinacloudapi.cn/datasets/iris.csv  --learning-rate 0.9 --boosting gbdt

预期的输出如下:

2022/04/21 15:02:44 INFO mlflow.tracking.fluent: Autologging successfully enabled for lightgbm.
2022/04/21 15:02:44 INFO mlflow.tracking.fluent: Autologging successfully enabled for sklearn.
2022/04/21 15:02:45 INFO mlflow.utils.autologging_utils: Created MLflow autologging run with ID 'a1d5f652796e4d88961176166de52253', which will track hyperparameters, performance metrics, model artifacts, and lineage information for the current lightgbm workflow
lightgbm\engine.py:177: UserWarning: Found `num_iterations` in params. Will use it instead of argument
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000164 seconds.
You can set `force_col_wise=true` to remove the overhead.
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf

移到云中

本地运行正常工作后,请将此运行移到 Azure 机器学习工作区。 若要在 Azure ML 上运行此脚本,需要:

  • 要运行的工作区
  • 要在其上运行此脚本的计算
  • 计算中的环境,用于确保拥有所需的包来运行脚本

下面让我们处理这些步骤

1.连接到工作区

若要连接到工作区,需要提供标识符参数 - 订阅、资源组和工作区名称。 你将在 azure.ai.mlMLClient 中使用这些详细信息来获取所需 Azure 机器学习工作区的句柄。 若要进行身份验证,请使用默认 Azure 身份验证。 请查看此示例,了解有关如何配置凭据和连接到工作区的更多详细信息。

#import required libraries
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

#Enter details of your AzureML 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)

2. 创建计算

你将使用以下代码为作业创建名为 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)

3. 用于运行脚本的环境

若要在 cpu-cluster 上运行脚本,需要一个环境,其中包含运行该脚本所需的包和依赖项。 可对环境使用几个选项:

  • 在工作区中使用特选环境 - Azure ML 提供多个特选环境来满足各种需求。

  • 使用自定义环境 - Azure ML 允许通过以下方式创建你自己的环境

    • Docker 映像
    • 基础 Docker 映像,并使用 conda YAML 进一步自定义
    • Docker 生成上下文

    请查看此示例了解如何创建自定义环境。

你将使用 Azure ML 为 lightgm 提供的名为 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu 的特选环境

4. 提交作业以运行脚本

你将使用 command 来运行此脚本。 将该命令作为 job 提交到 Azure ML 来运行该命令。

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",
)
# 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 - 需要运行的命令
  • inputs - 命令的输入字典,采用名称值对的形式。 键是作业上下文中的输入名称,值是输入值。 在 command 中使用 ${{inputs.<input_name>}} 表达式引用输入。 若要将文件或文件夹用作输入,可以使用 Input 类。

有关更多详细信息,请参阅参考文档

使用超参数扫描改进模型

在 Azure 上运行作业后,让我们使用超参数优化来改进模型。 超参数优化是找到用于获得最佳性能的超参数配置的过程。 Azure 机器学习在 command 上提供了一个 sweep 函数来执行超参数优化。

若要执行扫描,需要提供所要扫描的输入。 这些输入可以包含离散值或连续值。 sweep 函数将使用指定输入值的不同组合多次运行 command。 每个输入是名称值对的字典。 键是超参数的名称,值是参数表达式。

让我们通过扫描脚本中的 learning_rateboosting 输入来改进模型。 在上一步骤中,你为这些参数使用了特定值,但现在你将使用某个范围内的值或所选的值。

# we will reuse the command_job created before. we call it as a function so that we can apply inputs
# we do not apply the 'iris_csv' input again -- we will just use what was already defined earlier
command_job_for_sweep = command_job(
    learning_rate=Uniform(min_value=0.01, max_value=0.9),
    boosting=Choice(values=["gbdt", "dart"]),
)

定义参数后,请运行扫描

# apply the sweep parameter to obtain the sweep_job
sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm="random",
    primary_metric="test-multi_logloss",
    goal="Minimize",
)

# define the limits for this sweep
sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=10, timeout=7200)
# submit the sweep
returned_sweep_job = ml_client.create_or_update(sweep_job)
# get a URL for the status of the job
returned_sweep_job.services["Studio"].endpoint

如上所示,sweep 函数允许用户配置以下关键方面:

  • sampling_algorithm - 要对 search_space 使用的超参数采样算法。 允许的值为 randomgridbayesian
  • objective - 扫描的目标
    • primary_metric - 每个试运行作业报告的主要指标的名称。 必须使用 mlflow.log_metric() 以相同的对应指标名称在用户的训练脚本中记录该指标。
    • goal - objective.primary_metric 的优化目标。 允许值为 maximizeminimize
  • compute - 要在其上执行作业的计算目标的名称。
  • limits - 扫描作业的限制

完成此作业后,可以在 Azure ML 门户中查看指标和作业详细信息。 作业详细信息页将会标识性能最佳的子运行。

扫描的最佳运行

分布式训练

Azure 机器学习支持 PyTorch、TensorFlow 和基于 MPI 的分布式训练。 让我们了解如何为前面创建的 command_job 配置分布命令

# Distribute using PyTorch
from azure.ai.ml import PyTorchDistribution
command_job.distribution = PyTorchDistribution(process_count_per_instance=4)

# Distribute using TensorFlow
from azure.ai.ml import TensorFlowDistribution
command_job.distribution = TensorFlowDistribution(parameter_server_count=1, worker_count=2)

# Distribute using MPI
from azure.ai.ml import MpiDistribution
job.distribution = MpiDistribution(process_count_per_instance=3)

后续步骤

尝试执行以下后续步骤,了解如何使用适用于 Python 的 Azure 机器学习 SDK (v2):

  • 通过 Azure ML Python SDK (v2) 使用管道