Compartir a través de

配置和提交训练作业

适用于:Python SDK azureml v1

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

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

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

先决条件

什么是脚本运行配置?

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

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

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

训练模型

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

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

或者可以:

创建试验

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

from azureml.core import Experiment

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

选择计算目标

选择要在其中运行训练脚本的计算目标。 如果 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 机器学习特选环境

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

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)。

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'

创建脚本作业配置

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

from azureml.core import ScriptRunConfig

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

# Set compute target
# Skip this if you are running on your local computer
script_run_config.run_config.target = my_compute_target

如果你未指定环境,系统会为你创建一个默认环境。

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

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

指定分布式作业配置

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

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

提交试验

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 的文件夹,则会将这些文件自动上传到作业历史记录,以便在完成作业后可对其进行访问。

要在训练期间创建项目(如模型文件、检查点、数据文件或绘制的图像),请将其写入 ./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(无模块命名):如果在 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 容器注册表服务层级

后续步骤