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

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

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

先决条件

  1. 要使用 Azure 机器学习,首先需要一个工作区。如果您没有,请完成创建开始创建工作区所需的资源并了解有关使用它的更多信息。

  2. 登录工作室并选择您的工作区(如果尚未打开)。

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

设置你的内核

Python 3.10 - SDK v2

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

要训​​练模型,您需要提交 工作。您将在本教程中提交的作业类型是 指挥工作。 Azure 机器学习提供了多种不同类型的作业来训练模型。用户可以根据模型的复杂性、数据大小和训练速度要求来选择训练方法。在本教程中,您将学习如何提交 指挥工作 运行一个 训练脚本

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

在本教程中,我们将重点关注使用命令作业来创建用于训练模型的自定义训练作业。对于任何定制培训工作,需要以下项目:

  • 计算资源(通常是计算集群,我们建议使用它来实现可扩展性)
  • 环境
  • 数据
  • 指挥工作
  • 训练脚本

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

创建工作区句柄

ml_clientml_client

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

  1. 在右上角的 Azure 机器学习工作室工具栏中,选择工作区名称。
  2. 将工作区、资源组和订阅 ID 的值复制到代码中。
  3. 您需要复制一个值,关闭该区域并粘贴,然后返回下一个值。
from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential # 验证凭据 = DefaultAzureCredential() # # 获取工作区句柄 ml_client = MLClient( credential=credential, subscription_id="", resource_group_name="",workspace_name="",)

创建计算集群来运行您的作业

在 Azure 中,作业可以指 Azure 允许其用户执行的多项任务:训练、管道创建、部署等。对于本教程以及我们训练机器学习模型的目的,我们将使用 工作 作为运行训练计算的参考(培训工作)。

您需要计算资源来运行 Azure 机器学习中的任何作业。它可以是具有 Linux 或 Windows 操作系统的单节点或多节点计算机,也可以是 Spark 等特定计算结构。在 Azure 中,有两种计算资源可供选择:实例和集群。一个计算实例包含一个计算资源节点,而 计算集群 包含几个。 A 计算集群 包含更多用于计算任务的内存。对于训练,我们建议使用计算集群,因为它允许用户将计算分布在多个计算节点上,从而获得更快的训练体验。

您配置一个 Linux 计算集群。请参阅有关 VM 大小和价格的完整列表。

对于本示例,您只需要一个基本集群,因此您使用具有 2 个 vCPU 核心、7 GB RAM 的 Standard_DS3_v2 模型。

from azure.ai.ml.entities import AmlCompute # 分配给计算集群的名称 cpu_compute_target = "cpu-cluster" try: # 让我们看看计算目标是否已存在 cpu_cluster = ml_client.compute.get(cpu_compute_target) print( f"You已经有一个名为 {cpu_compute_target} 的集群,我们将按原样重用它。" ) except Exception: print("创建新的 cpu 计算目标...") # 让我们使用预期参数 cpu_cluster 创建 Azure 机器学习计算对象= AmlCompute( name=cpu_compute_target, # Azure 机器学习计算是按需 VM 服务 # 如果遇到配额不足错误,请将大小更改为可用的类似 VM。\ # 了解更多信息 https:// azure.microsoft.com/en-us/pricing/details/machine-learning/. type="amlcompute", # VM Family size="STANDARD_DS3_V2", # 没有作业运行时的最小运行节点数 min_instances=0, # 节点数in cluster max_instances=4, # 作业终止后节点将运行多少秒idle_time_before_scale_down=180, # Dedicated 或LowPriority。后者更便宜,但有可能终止作业 tier="Dedicated", ) print( f"AMLCompute with name {cpu_cluster.name} will be create, withcompute size {cpu_cluster.size}" ) # 现在,我们通过MLClient 的 create_or_update 方法的对象 cpu_cluster = ml_client.compute.begin_create_or_update(cpu_cluster)

营造就业环境

要在计算资源上运行 Azure 机器学习作业,您需要一个环境。环境列出了您想要安装在要进行培训的计算机上的软件运行时和库。它类似于本地计算机上的 python 环境。

Azure 机器学习提供了许多精心策划或现成的环境,这对于常见的训练和推理场景非常有用。

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

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

导入 os dependency_dir = "./dependencies" os.makedirs(dependency_dir, exit_ok=True)

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

%%writefile {dependency_dir}/conda.yaml 名称:model-env 通道:- conda-forge 依赖项:- python=3.8 - numpy=1.21.2 - pip=21.2.4 - scikit-learn=0.24.2 - scipy= 1.7.1 - pandas>=1.1,<1.2 - pip: - 推理模式[numpy-support]==1.3.0 - mlflow== 1.26.1 - azureml-mlflow==1.42.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="信用卡默认作业的自定义环境", Tags={"scikit-learn": "0.24 .2"}, conda_file=os.path.join(dependency_dir, "conda.yaml"), image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest", ) custom_job_env = ml_client.environments .create_or_update(custom_job_env) print( f"名称为 {custom_job_env.name} 的环境已注册到工作区,环境版本为 {custom_job_env.version}" )

使用命令功能配置训练作业

梯度提升分类器
训练测试分割

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

创建训练脚本

让我们从创建训练脚本开始 - 主要.py python 文件。

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

导入 os train_src_dir = "./src" os.makedirs(train_src_dir, exit_ok=True)

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

MLFlow 用于记录我们工作期间的参数和指标。 MLFlow 包允许您跟踪每个模型 Azure 列车的指标和结果。我们将使用 MLFlow 首先获取数据的最佳模型,然后在 Azure 工作室上查看模型的指标。

%%writefile {train_src_dir}/main.py 导入os 导入argparse 导入pandas 作为pd 导入mlflow 导入mlflow.sklearn 来自sklearn.ensemble 导入GradientBoostingClassifier 来自sklearn.metrics 导入classification_report 来自sklearn.model_selection 导入train_test_split def main(): """脚本的主要功能。""" # 输入和输出参数 parser = argparse.ArgumentParser() parser.add_argument("--data", type=str, help="输入数据的路径") parser.add_argument("- -test_train_ratio", type=float, required=False, 默认=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() # 开始记录 mlflow.start_run() # 启用自动记录 mlflow .sklearn.autolog() ################### #<准备数据> ################### print(" ".join(f"{k}={v}" for k, v in vars(args).items())) print("输入数据:", 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) #分割训练数据集和测试数据集train_df, test_df = train_test_split(credit_df, test_size=args.test_train_ratio, ) #################### # ######## ############ ################## #<训练模型> ############## #### # 提取标签列 y_train = train_df.pop("下个月默认付款") # 将数据帧值转换为数组 X_train = train_df.values # 提取标签列 y_test = test_df.pop("下个月默认付款") # 将数据帧值转换为数组 X_test = test_df.values print(f"使用形状为 {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)) ################### # ### ################ ############################ #<保存并注册模型># ######################## # 将模型注册到工作区 print("通过 MLFlow 注册模型") mlflow.sklearn.log_model( sk_model= clf, Registered_model_name=args.registered_model_name, artifact_path=args.registered_model_name, ) # 将模型保存到文件 mlflow.sklearn.save_model( sk_model=clf, path=os.path.join(args.registered_model_name, "trained_model"), ) ########################### # ############### ############ # 停止记录 mlflow.end_run() if __name__ == "__main__": main()

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

配置命令

现在您已经有了可以执行分类任务的脚本,请使用通用目的 命令 可以运行命令行操作。此命令行操作可以直接调用系统命令或通过运行脚本。

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

@latestpython main.py${{ ... }}
来自 azure.ai.ml 导入命令 来自 azure.ai.ml 导入输入 Registered_model_name = "credit_defaults_model" job = command( input=dict( data=Input( type="uri_file", path="https://azuremlexamples.blob. core.windows.net/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/", # 源代码位置 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}}",环境= "aml-scikit-learn@latest",compute="cpu-cluster", #删除此行以使用无服务器计算 display_name="credit_default_prediction", )

提交作业

create_or_updateml_clientml_clientml_client
ml_client.create_or_update(作业)

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

通过选择上一个单元格的输出中的链接来查看 Azure 机器学习工作室中的作业。此作业的输出在 Azure 机器学习工作室中将如下所示。探索选项卡以获取各种详细信息,例如指标、输出等。完成后,该作业将在您的工作区中注册一个模型作为培训的结果。

Screenshot shows the overview page for the job.

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

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

清理资源

如果您打算立即继续学习其他教程,请跳至后续步骤。

停止计算实例

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

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

删除所有资源

如果您不打算使用您创建的任何资源,请将它们删除,这样就不会产生任何费用:

  1. 在 Azure 门户中,选择 资源组 在最左边。

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

  3. 选择 删除资源组

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

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

下一步

了解如何部署模型

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

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

如果您想要更多与本教程类似的示例,请参阅 样品 工作室的一部分。我们的 GitHub 示例页面上提供了这些相同的示例。这些示例包括完整的 Python 笔记本,您可以运行代码并学习如何训练模型。您可以修改并运行示例中的现有脚本,其中包含分类、自然语言处理和异常检测等场景。