训练 PyTorch 模型

本文介绍了如何使用 Azure 机器学习设计器中的“训练 Pytorch 模型”组件来训练 DenseNet 之类的 PyTorch 模型。 训练在你定义模型并设置其参数后进行,并且需要带标签的数据。

目前,“训练 PyTorch 模型”组件支持单节点训练和分布式训练。

如何使用“训练 PyTorch 模型”

  1. 在设计器中将 DenseNet 组件或 ResNet 添加到管道草稿。

  2. 将“训练 PyTorch 模型”组件添加到管道。 可以在“模型训练”类别下找到此组件。 展开“训练”,然后将“训练 PyTorch 模型”组件拖到你的管道中。

    注意

    对于大型数据集,最好是在“GPU”类型的计算上运行“训练 PyTorch 模型”组件,否则管道会出现故障 。 可以通过设置“使用其他计算目标”,在组件的右窗格中为特定组件选择计算。

  3. 在左侧输入中,附加未训练的模型。 将训练数据集和验证数据集附加到“训练 PyTorch 模型”的中间和右侧输入中。

    对于未经训练的模型,其必须为与 DenseNet 类似的 PyTorch 模型;否则将引发“InvalidModelDirectoryError”错误。

    对于数据集,训练数据集必须是已标记的图像目录。 请参阅“转换为图像目录”以了解如何获取标记的图像目录。 如果未标记,将引发“NotLabeledDatasetError”。

    训练数据集和验证数据集具有相同的标签类别,否则将引发 InvalidDatasetError。

  4. 对于“时期”,指定要训练的时期数。 每个时期将循环访问整个数据集,默认循环访问 5 次。

  5. 对于“批大小”,指定在一个批次中训练的实例数,默认为 16 个。

  6. 对于“学习率预热步数”,应指定要预热训练的回合数,以防该值默认为 0 时,初始学习率略微太大而无法开始收敛。

  7. 对于“学习率”,应指定学习速率值,其中默认值为 0.001。 学习率可控制每次在 sgd 等优化器中对模型进行测试和纠正时使用的步长。

    设置的学习率越小,模型测试就越频繁,而且可能会陷入局部停滞。 设置的学习率越大,收敛速度就越快,而且有可能会超过实际最小值。

    注意

    如果训练损失在训练期间变为 Nan,则可能是因学习率太大所致,此时降低学习率或许会有所帮助。 在分布式训练中,为了保持梯度稳定下降,实际学习率将由 lr * torch.distributed.get_world_size() 计算,因为进程组的批尺寸为单一进程的进程总数。 应用多项式学习率衰减可帮助构建一个性能更好的模型。

  8. 对于“随机种子”,可以选择键入一个整数值,将其用作种子。 如果需要跨运行确保试验的可再现性,建议使用种子。

  9. 对于“耐性”,请指定在验证损失不连续减少时提前停止训练的时期数。 默认为 3。

  10. 对于“打印频率”,应指定每个训练回合中迭代的训练日志打印频率,默认值为 10。

  11. 提交管道。 如果数据集较大,这将需要一段时间,建议使用 GPU 计算。

分布式训练

在分布式训练中,用于训练模型的工作负载会在多个微型处理器之间进行拆分和共享,这些处理器称为工作器节点。 这些工作器节点并行工作以加速模型训练。 目前,设计器支持适用于“训练 PyTorch 模型”组件的分布式训练。

定型时间

借助分布式训练,你可以通过训练 PyTorch 模型在 ImageNet(1,000 个类别、1,200,000 张图像)等大型数据集上进行训练。 下表显示了使用不同设备在 ImageNet 上从头开始对 Resnet50 进行 50 个回合训练的训练时间及表现。

设备 训练时间 训练吞吐量 Top-1 验证准确率 Top-5 验证准确率
16 V100 GPU 6 小时 22 分钟 大约 3,200 张图像/秒 68.83% 88.84%
8 V100 GPU 12 小时 21 分钟 大约 1,670 张图像/秒 68.84% 88.74%

单击此组件的“指标”选项卡,然后查看训练指标图,如“每秒训练图数”和“排名第 1 的准确率”。

Screenshot showing training metrics

如何启用分布式训练

若要为“训练 PyTorch 模型”组件启用分布式训练,可以在组件右侧窗格的“运行设置”中进行设置。 分布式训练只支持 AML 计算群集

注意

激活分布式训练需要多个 GPU,因为使用 NCCL 后端的“训练 PyTorch 模型”组件时需要 cuda。

  1. 选择此组件并打开右侧面板。 展开“运行设置”部分。

    Screenshot showing how to set distributed training in runsetting

  2. 请确保已为计算目标选择 AML 计算。

  3. 在“资源布局”部分,需要设置以下值:

    • 节点计数:计算目标中用于训练的节点数。 该值应小于或等于计算群集的最大节点数。 默认值为 1,代表单节点作业。

    • 每个节点的进程计数:每个节点触发的进程数。 该值应小于或等于计算的处理单位。 默认值为 1,代表单进程作业。

    通过单击计算名称进入“计算详情”页,便可检查计算的“最大节点数”和“处理单位”。

    Screenshot showing how to check compute cluster

此处 可详细了解 Azure 机器学习分布式训练的相关信息。

分布式训练故障排除

如果为此组件启用分布式训练,则每个进程都会生成驱动程序日志。 70_driver_log_0 适用于主进程。 在右侧窗格的“输出 + 日志”选项卡下,即可查看驱动程序日志中每个进程的详细错误信息。

Screenshot showing driver log

如果启用分布式训练的组件发生故障,但未生成任何 70_driver 日志,则可查看 70_mpi_log 以了解错误详情。

下方示例显示了一则常见错误,即每个节点的进程计数大于计算的处理单位 。

Screenshot showing mpi log

有关组件故障排除的更多详细信息,可参阅此文

结果

管道运行完成后,若要使用模型进行评分,请将训练 PyTorch 模型连接到为图像模型评分,以预测新输入示例的值。

技术说明

预期输入

名称 Type 说明
未训练的模型 UntrainedModelDirectory 未经训练的模型,需要 PyTorch
训练数据集 ImageDirectory 训练数据集
验证数据集 ImageDirectory 每个时期用于评估的验证数据集

组件参数

名称 范围 类型 默认 说明
时期 >0 Integer 5 选择包含标签的列或结果列
批大小 >0 Integer 16 要在一个批次中训练的实例数
学习率预热步数 >=0 Integer 0 预热训练的回合数
学习速率 >=double.Epsilon Float 0.1 “随机梯度下降”优化器的初始学习速率。
随机种子 任意 Integer 1 模型使用的随机数生成器的种子。
耐性 >0 Integer 3 要提前停止训练的时期数
打印频率 >0 Integer 10 每个回合中迭代的训练日志打印频率

Outputs

名称 Type 说明
已训练模型 ModelDirectory 已训练模型

后续步骤

请参阅 Azure 机器学习可用的组件集