你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

配置和提交训练作业

适用于:适用于 Python 的 Azure 机器学习 SDK v1

重要说明

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

建议在 2026 年 6 月 30 日之前过渡到 SDK v2。 有关 SDK v2 的详细信息,请参阅 什么是 Azure 机器学习 CLI 和 Python SDK v2? 以及 SDK 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 的 Azure 机器学习 SDK 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 的 Azure 机器学习 SDK 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 的 Azure 机器学习 SDK 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 的 Azure 机器学习 SDK 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 的 Azure 机器学习 SDK 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 机器学习维护的 Docker 映像及其内容可在 Azure 机器学习容器中查看。 框架特定的依赖项列在相应的框架文档中:

    注意

    如果你认为某个特定的包比较常用,需要添加到 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 机器学习会将具有相同指标名称的块串联到一个连续列表中。

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

后续步骤