教程:在 Azure 机器学习中训练模型

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

了解数据科学家如何使用 Azure 机器学习来训练模型。 在此示例中,我们使用关联的信用卡数据集来演示如何使用 Azure 机器学习解决分类问题。 目标是预测客户是否有信用卡付款违约的高可能性。

训练脚本处理数据准备,然后训练并注册模型。 本教程将指导你完成提交基于云的训练作业(命令作业)的步骤。 若要详细了解如何将数据加载到 Azure,请参阅教程:在 Azure 机器学习中上传、访问和探索数据。 步骤如下:

  • 获得到 Azure 机器学习工作区的句柄
  • 创建计算资源和作业环境
  • 创建训练脚本
  • 创建并运行命令作业以在计算资源上运行训练脚本,该计算资源配置了适当的作业环境和数据源
  • 查看训练脚本的输出
  • 将新训练的模型部署为终结点
  • 调用 Azure 机器学习终结点进行推理

先决条件

  1. 若要使用 Azure 机器学习,你首先需要一个工作区。 如果没有工作区,请完成创建开始使用所需的资源以创建工作区并详细了解如何使用它。

  2. 登录到工作室,选择工作区(如果尚未打开)。

  3. 在工作区中打开或创建一个笔记本:

    • 如果要将代码复制/粘贴到单元格中,请创建新的笔记本
    • 或者从工作室的“示例”部分打开 tutorials/get-started-notebooks/train-model.ipynb。 然后选择“克隆”,将笔记本添加到文件。 (了解在何处找到“示例”。)

设置内核

  1. 在打开的笔记本上方的顶部栏中,创建一个计算实例(如果还没有计算实例)。

    Screenshot shows how to create a compute instance.

  2. 如果计算实例已停止,请选择“启动计算”,并等待它运行。

    Screenshot shows how to start compute if it is stopped.

  3. 确保右上角的内核为 Python 3.10 - SDK v2。 如果不是,请使用下拉列表选择此内核。

    Screenshot shows how to set the kernel.

  4. 如果看到一个横幅,提示你需要进行身份验证,请选择“身份验证”。

重要

本教程的其余部分包含教程笔记本的单元格。 将其复制/粘贴到新笔记本中,或者立即切换到该笔记本(如果已克隆该笔记本)。

使用命令作业在 Azure 机器学习中训练模型

若要训练模型,需要提交作业。 本教程中要提交的作业类型是命令作业。 Azure 机器学习提供了多种不同类型的作业来训练模型。 用户可以根据模型的复杂性、数据大小和训练速度要求来选择其训练方法。 本教程介绍如何提交命令作业以运行训练脚本。

命令作业是一个函数,可用于提交自定义训练脚本来训练模型。 这也可以定义为自定义训练作业。 Azure 机器学习中的命令作业是在指定环境中运行脚本或命令的一种作业。 可以使用命令作业来训练模型、处理数据或要在云中执行的任何其他自定义代码。

在本教程中,我们将重点介绍如何使用命令作业创建用于训练模型的自定义训练作业。 对于任何自定义训练作业,需要以下项:

  • 环境
  • 数据
  • 命令作业
  • 训练脚本

在本教程中,我们将为示例提供所有这些项:创建一个分类器来预测具有信用卡付款违约高可能性的客户。

创建工作区句柄

在深入了解代码之前,需要一种方法来引用工作区。 你将为工作区句柄创建 ml_client。 然后,你将使用 ml_client 来管理资源和作业。

在下一个单元格中,输入你的订阅 ID、资源组名称和工作区名称。 若要查找这些值:

  1. 在右上方的 Azure 机器学习工作室工具栏中,选择你的工作区名称。
  2. 将工作区、资源组和订阅 ID 的值复制到代码中。
  3. 需要复制一个值,关闭区域并粘贴,然后返回下一个值。
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# authenticate
credential = DefaultAzureCredential()

SUBSCRIPTION="<SUBSCRIPTION_ID>"
RESOURCE_GROUP="<RESOURCE_GROUP>"
WS_NAME="<AML_WORKSPACE_NAME>"
# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id=SUBSCRIPTION,
    resource_group_name=RESOURCE_GROUP,
    workspace_name=WS_NAME,
)

注意

创建 MLClient 不会连接到工作区。 客户端初始化是迟缓的,它将等待它首次需要调用(这将在下一个代码单元格中发生)。

# Verify that the handle works correctly.  
# If you ge an error here, modify your SUBSCRIPTION, RESOURCE_GROUP, and WS_NAME in the previous cell.
ws = ml_client.workspaces.get(WS_NAME)
print(ws.location,":", ws.resource_group)

创建作业环境

若要在计算资源上运行 Azure 机器学习作业,需要一个环境。 环境将列出你希望在要训练的计算资源上安装的软件运行时和库。 它类似于本地计算机上的 Python 环境。

Azure 机器学习提供了许多特选或现成的环境,这些环境对于常见训练和推理方案非常有用。

在此示例中,你将使用 conda yaml 文件为作业创建一个自定义 conda 环境。

首先,创建一个目录来存储文件。

import os

dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)

下面的单元格使用 IPython magic 将 conda 文件写入刚刚创建的目录中。

%%writefile {dependencies_dir}/conda.yaml
name: model-env
channels:
  - conda-forge
dependencies:
  - python=3.8
  - numpy=1.21.2
  - pip=21.2.4
  - scikit-learn=1.0.2
  - scipy=1.7.1
  - pandas>=1.1,<1.2
  - pip:
    - inference-schema[numpy-support]==1.3.0
    - mlflow==2.8.0
    - mlflow-skinny==2.8.0
    - azureml-mlflow==1.51.0
    - psutil>=5.8,<5.9
    - tqdm>=4.59,<4.60
    - ipykernel~=6.0
    - matplotlib

该规范包含一些将在作业中使用的常用包(numpy、pip)。

引用此 yaml 文件以在工作区中创建并注册此自定义环境:

from azure.ai.ml.entities import Environment

custom_env_name = "aml-scikit-learn"

custom_job_env = Environment(
    name=custom_env_name,
    description="Custom environment for Credit Card Defaults job",
    tags={"scikit-learn": "1.0.2"},
    conda_file=os.path.join(dependencies_dir, "conda.yaml"),
    image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
)
custom_job_env = ml_client.environments.create_or_update(custom_job_env)

print(
    f"Environment with name {custom_job_env.name} is registered to workspace, the environment version is {custom_job_env.version}"
)

使用命令函数配置训练作业

你需要创建一个 Azure 机器学习命令作业来训练用于信用违约预测的模型。 命令作业在指定计算资源上的指定环境中运行训练脚本。 你已创建环境和计算群集。 接下来需要创建训练脚本。 在我们的特定情况下,我们将训练数据集以使用 GradientBoostingClassifier 模型生成分类器。

训练脚本将处理数据准备、训练和注册已训练模型。 方法 train_test_split 处理将数据集拆分为测试和训练数据。 在本教程中,你将创建 Python 训练脚本。

可以从 CLI、Python SDK 或工作室界面运行命令作业。 在本教程中,你将使用 Azure 机器学习 Python SDK v2 创建并运行命令作业。

创建训练脚本

首先,创建训练脚本 - main.py python 文件。

首先为脚本创建源文件夹:

import os

train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)

此脚本处理数据的预处理,将其拆分为测试和训练数据。 然后,该脚本使用此数据来训练基于树的模型并返回输出模型。

MLFlow 用于在作业过程中记录参数和指标。 MLFlow 包支持跟踪 Azure 训练的每个模型的指标和结果。 我们将首先使用 MLFlow 获取数据的最佳模型,然后在 Azure 工作室上查看模型的指标。

%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

def main():
    """Main function of the script."""

    # input and output arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, help="path to input data")
    parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
    parser.add_argument("--n_estimators", required=False, default=100, type=int)
    parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
    parser.add_argument("--registered_model_name", type=str, help="model name")
    args = parser.parse_args()
   
    # Start Logging
    mlflow.start_run()

    # enable autologging
    mlflow.sklearn.autolog()

    ###################
    #<prepare the data>
    ###################
    print(" ".join(f"{k}={v}" for k, v in vars(args).items()))

    print("input data:", args.data)
    
    credit_df = pd.read_csv(args.data, header=1, index_col=0)

    mlflow.log_metric("num_samples", credit_df.shape[0])
    mlflow.log_metric("num_features", credit_df.shape[1] - 1)

    #Split train and test datasets
    train_df, test_df = train_test_split(
        credit_df,
        test_size=args.test_train_ratio,
    )
    ####################
    #</prepare the data>
    ####################

    ##################
    #<train the model>
    ##################
    # Extracting the label column
    y_train = train_df.pop("default payment next month")

    # convert the dataframe values to array
    X_train = train_df.values

    # Extracting the label column
    y_test = test_df.pop("default payment next month")

    # convert the dataframe values to array
    X_test = test_df.values

    print(f"Training with data of shape {X_train.shape}")

    clf = GradientBoostingClassifier(
        n_estimators=args.n_estimators, learning_rate=args.learning_rate
    )
    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    print(classification_report(y_test, y_pred))
    ###################
    #</train the model>
    ###################

    ##########################
    #<save and register model>
    ##########################
    # Registering the model to the workspace
    print("Registering the model via MLFlow")
    mlflow.sklearn.log_model(
        sk_model=clf,
        registered_model_name=args.registered_model_name,
        artifact_path=args.registered_model_name,
    )

    # Saving the model to a file
    mlflow.sklearn.save_model(
        sk_model=clf,
        path=os.path.join(args.registered_model_name, "trained_model"),
    )
    ###########################
    #</save and register model>
    ###########################
    
    # Stop Logging
    mlflow.end_run()

if __name__ == "__main__":
    main()

在此脚本中,训练模型后,模型文件将会保存并注册到工作区。 通过模型注册,可在 Azure 云的工作区中存储模型并控制模型版本。 注册模型后,可以在 Azure Studio 中名为模型注册表的一个位置找到所有其他已注册的模型。 模型注册表可帮助你组织和跟踪已训练的模型。

配置命令

现在已有一个可执行分类任务的脚本,你将使用可以运行命令行操作的常规用途命令。 此命令行操作可以直接调用系统命令或运行脚本。

在这里,创建输入变量来指定输入数据、拆分比、学习速率和注册的模型名称。 命令脚本将:

  • 使用之前创建的环境 - 可以使用 @latest 表示法在运行命令时指示环境的最新版本。
  • 配置命令行操作本身 - 在这种情况下为 python main.py。 可通过 ${{ ... }} 表示法在命令中访问输入/输出。
  • 由于未指定计算资源,因此该脚本将在自动创建的无服务器计算群集上运行。
from azure.ai.ml import command
from azure.ai.ml import Input

registered_model_name = "credit_defaults_model"

job = command(
    inputs=dict(
        data=Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.chinacloudapi.cn/datasets/credit_card/default_of_credit_card_clients.csv",
        ),
        test_train_ratio=0.2,
        learning_rate=0.25,
        registered_model_name=registered_model_name,
    ),
    code="./src/",  # location of source code
    command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
    environment="aml-scikit-learn@latest",
    display_name="credit_default_prediction",
)

提交作业

现在可以提交要在 Azure 机器学习工作室中运行的作业。 这一次你将对 ml_client 使用 create_or_updateml_client 是一个客户端类,支持使用 Python 连接到 Azure 订阅并与 Azure 机器学习服务交互。 ml_client 支持使用 Python 提交作业。

ml_client.create_or_update(job)

查看作业输出并等待作业完成

选择上一个单元格的输出中的链接,以在 Azure 机器学习工作室中查看作业。 此作业的输出在 Azure 机器学习工作室中如下所示。 浏览选项卡,了解各种详细信息,如指标、输出等。完成后,该作业将在工作区中注册一个模型(这是训练的结果)。

Screenshot shows the overview page for the job.

重要

等待作业的状态变成“已完成”,然后再返回到此笔记本继续。 该作业需要 2 到 3 分钟才能运行。 如果计算群集已缩减到零个节点,并且自定义环境仍在生成,则可能需要更长时间(最多 10 分钟)。

运行单元格时,笔记本输出会显示指向 Azure Studio 上作业详细信息页的链接。 或者,还可以在左侧导航菜单中选择“作业”。 作业是指定脚本或代码段中多个运行的分组。 运行的信息存储在该作业下。 详细信息页概述了作业、运行时间、创建时间等。该页还包含有关作业的其他信息的选项卡,例如指标、输出 + 日志和代码。 下面列出了作业详细信息页中的可用选项卡:

  • 概述:概述部分提供有关作业的基本信息,包括其状态、开始时间和结束时间,以及运行的作业类型
  • 输入:输入部分列出了用作作业输入的数据和代码。 本部分可以包括数据集、脚本、环境配置和训练期间使用的其他资源。
  • 输出 + 日志:“输出 + 日志”选项卡包含作业运行时生成的日志。 如果训练脚本或模型创建出现问题,此选项卡可帮助进行故障排除。
  • 指标:“指标”选项卡显示模型的关键性能指标,例如训练分数、f1 分数和精度分数。

清理资源

如果打算继续学习其他教程,请跳到后续步骤

停止计算实例

如果不打算现在使用它,请停止计算实例:

  1. 在工作室的左侧导航区域中,选择“计算”。
  2. 在顶部选项卡中,选择“计算实例”
  3. 在列表中选择该计算实例。
  4. 在顶部工具栏中,选择“停止”。

删除所有资源

重要

已创建的资源可用作其他 Azure 机器学习教程和操作方法文章的先决条件。

如果你不打算使用已创建的任何资源,请删除它们,以免产生任何费用:

  1. 在 Azure 门户中,选择最左侧的“资源组” 。

  2. 从列表中选择你创建的资源组。

  3. 选择“删除资源组”

    Screenshot of the selections to delete a resource group in the Azure portal.

  4. 输入资源组名称。 然后选择“删除”。

后续步骤

了解如何部署模型

本教程使用了联机数据文件。 若要详细了解访问数据的其他方法,请参阅教程:在 Azure 机器学习中上传、访问和探索数据

若要详细了解在 Azure 机器学习中训练模型的不同方法,请参阅什么是自动化机器学习 (AutoML)?。 自动化 ML 是一种补充工具,用于减少数据科学家查找最适合其数据的模型所花费的时间。

如果需要更多类似于本教程的示例,请参阅工作室的示例部分。 GitHub 示例页提供了这些相同的示例。这些示例包括可以运行代码并学习训练模型的完整 Python 笔记本。 可以从示例中修改和运行现有脚本,其中包含分类、自然语言处理和异常情况检测等方案。