配置和提交训练作业

适用于:Python SDK azureml v1

重要

本文提供有关使用 Azure 机器学习 SDK v1 的信息。 自 2025 年 3 月 31 日起,SDK v1 已弃用,其支持将于 2026 年 6 月 30 日结束。 可以在该日期之前安装和使用 SDK v1。

建议在 2026 年 6 月 30 日之前过渡到 SDK v2。 有关 SDK v2 的详细信息,请参阅 什么是 Azure 机器学习 Python SDK v2SDK v2 参考

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

训练时,通常在本地计算机上启动,然后横向扩展到基于云的群集。 使用 Azure 机器学习,你可以在各种计算目标上运行脚本,而无需更改训练脚本。

只需在脚本作业配置中为每个计算目标定义环境即可。 若之后想要在不同的计算目标上运行训练实验,则可以指定该计算的作业配置。

先决条件

什么是脚本运行配置?

ScriptRunConfig 用于配置试验过程中提交训练作业时所需的信息。

使用 ScriptRunConfig 对象提交训练实验。 此对象包含:

  • source_directory:包含训练脚本的源目录
  • script:要运行的训练脚本
  • compute_target:要在其上运行的计算目标
  • environment:运行脚本时要使用的环境
  • 其他可配置选项(有关详细信息,请参阅 参考文档

训练模型

对于所有类型的计算目标,用于提交训练作业的代码模式都是相同的:

  1. 创建要运行的试验
  2. 创建运行脚本的环境
  3. 创建 ScriptRunConfig,它指定计算目标和环境
  4. 提交作业
  5. 等待作业完成

或者您可以:

选择计算目标

选择要在其中运行训练脚本的计算目标。 如果 ScriptRunConfig 中未指定任何计算目标,或者 compute_target='local',则 Azure 机器学习会在本地执行脚本。

本文中的示例代码假设你已创建了“先决条件”部分的计算目标 my_compute_target

备注

  • Azure Databricks 不支持作为模型训练的计算目标。 可以使用 Azure Databricks 执行数据准备和部署任务。
  • 若要在启用了 Azure Arc 的 Kubernetes 群集上创建和附加用于训练的计算目标,请参阅配置已启用 Azure Arc 的机器学习

创建环境

Azure 机器学习环境是(机器学习训练发生于其中的)环境的封装。 他们指定与您的训练和评分脚本有关的 Python 包、Docker 镜像、环境变量和软件设置。 它们还指定运行时(Python、Spark 或 Docker)。

你可以定义自己的环境,也可以使用 Azure 机器学习特选环境。 特选环境是默认情况下在工作区中可用的预定义环境。 这些环境由缓存的 Docker 映像支持,降低了作业准备成本。 有关可用特选环境的完整列表,请参阅 Azure 机器学习特选环境

对于远程计算目标,可以从使用以下常用特选环境之一开始:

适用于:Python SDK azureml v1

from azureml.core import Workspace, Environment

ws = Workspace.from_config()
myenv = Environment.get(workspace=ws, name="AzureML-Minimal")

有关环境的更多信息和细节,请参阅在 Azure 机器学习中创建和使用软件环境

本地计算目标

如果计算目标是本地计算机,你需要负责确保所有必需的包在脚本运行于的 Python 环境中可用。 使用 python.user_managed_dependencies 来使用当前的 Python 环境(或指定路径上的 Python)。

适用于:Python SDK azureml v1

from azureml.core import Environment

myenv = Environment("user-managed-env")
myenv.python.user_managed_dependencies = True

# You can choose a specific Python environment by pointing to a Python path 
# myenv.python.interpreter_path = '/home/johndoe/miniconda3/envs/myenv/bin/python'

创建试验

在工作区中创建实验。 试验是一种轻型容器,可帮助组织作业提交和跟踪代码。

适用于:Python SDK azureml v1

from azureml.core import Experiment

experiment_name = 'my_experiment'
experiment = Experiment(workspace=ws, name=experiment_name)

创建脚本作业配置

你已拥有计算目标(my_compute_target,请参阅先决条件)和环境(myenv,请参阅创建环境),现在可创建脚本作业配置,以运行位于 train.py 目录中的训练脚本 (project_folder):

适用于:Python SDK azureml v1

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='train.py',
                      compute_target=my_compute_target,
                      environment=myenv)

如果未指定环境,则会为你创建默认环境。

如果要将命令行参数传递给训练脚本,则可以通过 ScriptRunConfig 构造函数的 arguments 参数来指定这些参数,例如 arguments=['--arg1', arg1_val, '--arg2', arg2_val]

如果要替代允许用于作业的默认最长时间,可以通过 max_run_duration_seconds 参数来实现。 如果运行时间超过此值,系统会尝试自动取消作业。

指定分布式作业配置

若要运行分布式训练作业,请为 distributed_job_config 参数提供分布式作业特定配置。 支持的配置类型包括 MpiConfigurationTensorflowConfigurationPyTorchConfiguration

有关运行 Horovod、TensorFlow 和 PyTorch 分布式作业的详细信息和示例,请参阅:

提交实验

适用于:Python SDK azureml v1

run = experiment.submit(config=src)
run.wait_for_completion(show_output=True)

重要

提交训练作业时,将创建包含训练脚本的目录快照并将其发送到计算目标。 目录快照也作为试验的一部分存储在工作区中。 如果更改文件并再次提交作业,则只会上传已更改的文件。

为了防止在快照中包含不必要的文件,请在目录中创建 ignore 文件(.gitignore.amlignore)。 将要排除的文件和目录添加到此文件中。 有关此文件中使用的语法的详细信息,请参阅 .gitignore.amlignore 文件使用相同的语法。 如果同时存在这两个文件,则会使用 .amlignore 文件,不会使用 .gitignore 文件。

有关快照的详细信息,请参阅快照

重要

特殊文件夹两个文件夹 outputslogs 接收 Azure 机器学习的特殊处理。 在训练期间,将文件写入到与根目录相对的命名 输出日志 的文件夹(./outputs 以及 ./logs分别)时,文件会自动上传到作业历史记录,以便在作业完成后有权访问它们。

若要在训练期间创建项目(例如模型文件、检查点、数据文件或绘图图像),请写入 ./outputs 文件夹。

同样,可以将训练作业中的任何日志写入 ./logs 文件夹。 若要利用 Azure 机器学习的 TensorBoard 集成,请确保将 TensorBoard 日志写入此文件夹。 作业正在进行时,你将能够启动 TensorBoard 并流式传输这些日志。 稍后,您还可以从您的任何以前的任务中恢复日志。

例如,在远程训练作业完成后将写入 outputs 文件夹的文件下载到本地计算机:run.download_file(name='outputs/my_output_file', output_file_path='my_destination_path')

Git 跟踪与集成

如果启动训练作业(其中源目录为本地 Git 存储库),则存储库的相关信息会存储在作业历史记录中。 有关详细信息,请参阅 Azure 机器学习的 Git 集成

Notebook 示例

请参阅这些笔记本,以了解配置不同训练方案作业的示例。

阅读使用 Jupyter 笔记本探索此服务一文,了解如何运行笔记本。

疑难解答

  • AttributeError: "RoundTripLoader" 对象没有属性 "comment_handling":此错误来自 ruamel-yaml(一个 azureml-core 依赖项)的新版本 (v0.17.5),该版本引入了对 azureml-core 的中断性变更。 若要修复此错误,请卸载 ruamel-yaml,方法是运行 pip uninstall ruamel-yaml 并安装另一版本的 ruamel-yaml;支持的版本为 v0.15.35 到 v0.17.4(含)。 为此,可以运行 pip install "ruamel-yaml>=0.15.35,<0.17.5"

  • 作业失败并出现jwt.exceptions.DecodeError:准确的错误消息jwt.exceptions.DecodeError: It is required that you pass in a value for the "algorithms" argument when calling decode()

    请考虑升级到 azureml-core 的最新版本:pip install -U azureml-core

    如果在处理本地作业时遇到此问题,请检查您环境中安装的 PyJWT 版本。 正在启动作业。 受支持的 PyJWT 版本是 2.0.0。 如果版本 >= 2.0.0,请从环境中卸载 PyJWT。 可以检查 PyJWT 的版本,卸载,然后安装正确的版本,如下所述:

    1. 启动命令 shell,激活安装了 azureml-core 的 conda 环境。
    2. 输入 pip freeze 并查找 PyJWT,如果找到,则列出的版本应为 < 2.0.0
    3. 如果列出的版本不是受支持的版本, pip uninstall PyJWT 请在命令行界面中输入 y 进行确认。
    4. 使用 pip install 'PyJWT<2.0.0' 进行安装

    如果您要将用户创建的环境与作业一起提交,请考虑在该环境中使用最新版本的 azureml-core。 >= 1.18.0 版的 azureml-core 已经固定为使用 < 2.0.0 的 PyJWT。 如果需要在提交的环境中使用 < 1.18.0 版的 azureml-core,请确保在 pip 依赖项中指定 < 2.0.0 版的 PyJWT。

  • ModuleErrors(没有名为 xxx 的模块):如果 你在 Azure 机器学习中提交试验时遇到 ModuleErrors,则训练脚本需要安装某个包,但并未添加该包。 你提供包名称后,Azure 机器学习在用于训练作业的环境中安装该包。

    如果您使用估计器提交实验,您可以根据希望安装软件包的来源,在估计器中通过pip_packagesconda_packages参数指定软件包名称。 还可以使用 conda_dependencies_file 指定包含所有依赖项的 yml 文件,或使用 pip_requirements_file 参数列出 txt 文件中的所有 pip 要求。 如果你有自己的 Azure 机器学习环境对象,并且希望替代估算器使用的默认映像,则可以通过估算器构造函数的 environment 参数来指定该环境。

    可以在 Azure 机器学习容器中看到 Azure 机器学习维护的 Docker 映像及其内容。 框架特定的依赖项列在相应的框架文档中:

    备注

    如果你认为某个特定的包比较常用,需要添加到 Azure 机器学习维护的映像和环境中,请在 Azure 机器学习容器中提出 GitHub 问题。

  • NameError(未定义名称)、AttributeError(对象没有属性) :此异常应该是训练脚本引发的。 可以在 Azure 门户中查看日志文件,以获取有关未定义特定名称或属性错误的详细信息。 在 SDK 中,可以使用 run.get_details() 来查看错误消息。 这还会列出针对作业生成的所有日志文件。 在重新提交作业之前,请务必检查训练脚本并修复错误。

  • 作业或试验删除:可以通过以下方式将试验存档:使用 Experiment.archive 方法,或者使用 Azure 机器学习工作室客户端“试验”选项卡视图中的“存档试验”按钮。 执行此操作后,在列出查询和视图时将隐藏该试验,但不会将其删除。

    目前不支持永久删除各个试验或作业。 有关删除工作区资产的详细信息,请参阅导出或删除机器学习服务工作区数据

  • 指标文档太大:对于一次性可从训练作业记录的指标对象大小,Azure 机器学习施加了内部限制。 如果在记录列表值指标时遇到“指标文档太大”错误,请尝试将列表拆分为较小的区块,例如:

    run.log_list("my metric name", my_metric[:N])
    run.log_list("my metric name", my_metric[N:])
    

    在内部,Azure 机器学习会将具有相同指标名称的块串联到一个连续列表中。

  • 计算目标启动时间过长:用于计算目标的 Docker 映像是从 Azure 容器注册表 (ACR) 加载的。 在默认情况下,Azure 机器学习会创建一个使用“基本”服务层级的 ACR。 将工作区的 ACR 更改为“标准”或“高级”层级可能会减少生成和加载映像所需的时间。 有关详细信息,请参阅 Azure 容器注册表服务层级

后续步骤