配置和提交训练作业
本文介绍如何配置和提交 Azure 机器学习作业以训练模型。 代码片段说明了配置和提交训练脚本的关键部分。 然后,使用其中一个示例笔记本查找完整的端到端工作示例。
训练时,通常先在本地计算机上启动,然后再横向扩展到基于云的群集。 使用 Azure 机器学习,你可以在各种计算目标上运行脚本,而无需更改训练脚本。
只需在脚本作业配置中为每个计算目标定义环境即可。 若之后想要在不同的计算目标上运行训练实验,则可以指定该计算的作业配置。
先决条件
- 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 立即尝试试用版订阅
- 适用于 Python 的 Azure 机器学习 SDK (>= 1.13.0)
- Azure 机器学习工作区
ws
- 计算目标
my_compute_target
。 创建计算目标
什么是脚本运行配置?
ScriptRunConfig 用于配置试验过程中提交训练作业时所需的信息。
使用 ScriptRunConfig 对象提交训练实验。 此对象包含:
- source_directory:包含训练脚本的源目录
- script:要运行的训练脚本
- compute_target:要在其上运行的计算目标
- environment:运行脚本时要使用的环境
- 一些其他的可配置选项(有关详细信息,请参阅参考文档)
训练模型
对于所有类型的计算目标,用于提交训练作业的代码模式都是相同的:
- 创建要运行的试验
- 创建脚本将在其中运行的环境
- 创建 ScriptRunConfig,它指定计算目标和环境
- 提交作业
- 等待作业完成
或者可以:
- 提交用于超参数优化的 HyperDrive 运行。
- 通过 VS Code 扩展提交试验。
创建试验
在工作区中创建试验。 试验是一种轻型容器,可帮助组织作业提交和跟踪代码。
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
参数提供分布式作业特定配置。 支持的配置类型包括 MpiConfiguration、TensorflowConfiguration 和 PyTorchConfiguration。
有关运行 Horovod、TensorFlow 和 PyTorch 分布式作业的详细信息和示例,请参阅:
提交试验
run = experiment.submit(config=src)
run.wait_for_completion(show_output=True)
重要
提交训练作业时,将创建包含训练脚本的目录的快照,并将其发送到计算目标。 目录快照也作为试验的一部分存储在工作区中。 如果更改文件并再次提交作业,只会上传已更改的文件。
为了防止在快照中包含不必要的文件,请在目录中创建 ignore 文件(.gitignore
或 .amlignore
)。 将要排除的文件和目录添加到此文件中。 有关此文件中使用的语法的详细信息,请参阅 .gitignore
的语法和模式。 .amlignore
文件使用相同的语法。 如果同时存在这两个文件,则会使用 .amlignore
文件,不会使用 .gitignore
文件。
有关快照的详细信息,请参阅快照。
重要
特殊文件夹两个文件夹 outputs 和 logs 接收 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 的版本,按如下所述进行卸载,然后安装正确的版本:
- 启动命令 shell,激活安装了 azureml-core 的 conda 环境。
- 输入
pip freeze
并查找PyJWT
,如果找到,则列出的版本应低于 2.0.0 - 如果列出的版本不受支持,请在命令行界面中使用
pip uninstall PyJWT
,并输入 y 进行确认。 - 使用
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_packages
或conda_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 容器注册表服务层级。
后续步骤
- 教程:训练和部署模型使用一个托管计算目标来训练模型。
- 了解如何使用特定的 ML 框架(如 Scikit-learn、TensorFlow 和 PyTorch)来训练模型。
- 若要构建更好的模型,请了解如何高效地优化超参数。
- 训练模型后,了解如何以及在何处部署模型。
- 查看 ScriptRunConfig 类 SDK 参考。
- 通过 Azure 虚拟网络使用 Azure 机器学习