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

Azure 上深度学习模型的分布式训练

Blob 存储
容器注册表
机器学习

本参考体系结构演示如何在支持 GPU 的 VM 群集之间展开深度学习模型的分布式训练。 该方案属于图像分类,但也可以针对其他深度学习方案(例如分段或 对象检测)通用化该解决方案。

GitHub 中提供了本体系结构的参考实现。

体系结构

显示分布式深度学习的体系结构关系图。

下载此体系结构的 Visio 文件

工作流

该体系结构包括以下服务:

Azure 机器学习计算在此体系结构中根据需求扩展和缩减资源,发挥着核心的作用。 Azure 机器学习计算是一个可以帮助预配和管理 VM 群集、计划作业、收集结果、缩放资源以及处理故障的服务。 它允许使用支持 GPU 的 VM 来运行深度学习工作负荷。

标准 Blob 存储用于存储日志和结果。 高级 Blob 存储用于存储训练数据,通过 blobfuse 装载在训练群集的节点中。 Blob 存储高级层的性能比标准层更好,建议用于分布式训练方案。 使用 blobfuse 装载后,在第一次循环期间,训练数据将下载到训练群集的本地磁盘并被缓存。 在后续的每个循环中,将从本地磁盘读取数据,这是性能最高的选项。

Azure 容器注册表用于存储由 Azure 机器学习计算用来运行训练的 Docker 映像。

组件

  • Azure 机器学习是一个开放平台,用于大规模管理机器学习模型的开发和部署。 该平台支持常用的开放框架,并提供自动特征化和算法选择。 你可以使用机器学习将模型部署到各种目标,包括 Azure 容器实例。
  • Azure Blob 存储Azure 存储中的一项服务。 Blob 存储提供针对大量非结构化数据进行了优化的云对象存储。
  • 容器注册表是一种基于云的私有注册表服务。 你可以使用容器注册表来存储和管理专用 Docker 容器映像和相关项目。

方案详细信息

方案:图像分类是计算机影像中广泛应用的技术,其一般处理方式是训练卷积神经网络 (CNN)。 对于包含大型数据集的特大模型,使用单个 GPU 进行训练可能需要花费数周甚至数月之久。 在某些情况下,由于模型过大,以致 GPU 无法容纳合理的批大小。 在这些情况下使用分布式训练可以缩短训练时间。

此具体方案使用 Horovod 基于 ImageNet 数据集与合成数据训练 ResNet50 CNN 模型。 本参考实现演示如何使用 TensorFlow 完成此任务。

有多种方法能够以分布方式训练深度学习模型,包括基于同步或异步更新的数据并行方法和模型并行方法。 目前,最常见的方案是基于同步更新进行数据并行训练。 这种方法最容易实现,足以满足大多数用例的需求。

在基于同步更新的数据并行分布式训练中,模型跨 n 个硬件设备进行复制。 训练样本的小批分割成 n 个微批。 每个设备对微批执行向前和向后传递。 设备完成该过程后,将与其他设备共享更新。 这些值用于计算整个小批的更新权重,权重将在模型之间同步。 相关的 GitHub 存储库中介绍了此方案。

数据并行分布式训练。

本体系结构还可用于模型并行和异步更新。 在模型并行分布式训练中,模型将分割到 n 个硬件设备,每个设备包含模型的一部分。 在最简单的实现中,每个设备包含一个网络层,在向前和向后传递期间,信息将在设备之间传递。 可以这种方式训练大型神经网络,但代价是性能下降,因为一个设备需要持续等待另一个设备完成向前或向后传递。 某些高级技术使用合成渐变,可在一定程度上缓解此问题。

训练步骤如下:

  1. 创建要在群集上运行的、用于训练模型的脚本。
  2. 将训练数据写入 Blob 存储。
  3. 创建机器学习工作区。 此步骤还会创建用于托管 Docker 映像的容器注册表实例。
  4. 创建支持机器学习 GPU 的群集。
  5. 提交训练作业。 对于每个具有独特依赖关系的作业,都会生成一个新的 Docker 映像并将其推送到容器注册表。 在执行期间,相应的 Docker 映像将会运行并执行你的脚本。
  6. 所有结果和日志将写入 Blob 存储。

群集训练注意事项

Azure 提供多个适合用于训练深度学习模型的支持 GPU 的 VM 类型。 下面按从低到高的顺序提供了这些 VM 类型的价格和速度:

Azure VM 系列 NVIDIA GPU
NC K80
NDs P40
NCsv2 P100
NCsv3 V100
NDv2 8x V100 (NVLink)
ND A100 v4 8x A100 (NVLink)

我们建议在横向扩展之前先纵向扩展训练。例如,在试用 K80 系列群集之前,先试用单个 V100。 同样,应考虑使用单个 NDv2 而不是八个 NCsv3 VM。

下图根据使用 TensorFlow 和 Horovod 执行的基准测试,显示了不同 GPU 类型的性能差异。 该图显示了 32 个 GPU 群集在使用不同 GPU 类型和 MPI 版本的各个模型中的吞吐量。 模型是在 TensorFlow 1.9 中实现的

GPU 群集上的 TensorFlow 模型的吞吐量结果。

上表中所示的每个 VM 系列包含采用 InfiniBand 的配置。 运行分布式训练时使用 InfiniBand 配置可以加快节点之间的通信速度。 对于利用 InfiniBand 的框架,InfiniBand 还可提高其训练缩放效率。 有关详细信息,请参阅 Infiniband 基准比较

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改进工作负载质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

存储

训练深度学习模型时,一个经常被忽视的问题是训练数据的存储位置。 如果存储速度太慢,以致无法跟上 GPU 的需求,则训练性能可能会下降。

Azure 机器学习计算支持许多存储选项。 要获得最佳性能,请将数据本地下载到每个节点。 但是,此过程可能很麻烦,因为你必须将数据从 Blob 存储下载到每个节点。 如果使用 ImageNet 数据集,此过程可能需要相当长的时间。 默认情况下,机器学习会装载存储,以便在本地缓存数据。 因此,在实践中完成在第一个循环之后,将从本地存储中读取数据。 通过将这种布局与高级 Blob 存储相结合,可以在易用性和性能之间提供良好的折衷。

尽管 Azure 机器学习计算可以使用 blobfuse 适配器装载标准层 Blob 存储,但我们不建议将标准层用于分布式训练,因为其性能通常不足以处理所需的吞吐量。 使用高级层作为训练数据的存储,如前面的体系结构示意图中所示。 有关两个层之间的吞吐量和延迟比较的博客文章,请参阅高级块 Blob 存储 - 性能的新高度

容器注册表

每当预配机器学习工作区时,也会预配一组依赖资源(Blob 存储、密钥保管库、容器注册表和 Application Insights)。 或者,用户可以使用现有的 Azure 资源,并在创建新的机器学习工作区期间将这些资源关联到该工作区。

默认情况下,将预配基本层容器注册表。 对于大规模深度学习,我们建议你自定义工作区以使用高级层的容器注册表。 它提供显着更高的带宽,能够更快地拉取跨训练集群节点的 Docker 映像。

数据格式

对于大型数据集,通常建议使用 TFRecordsPetastorm 等数据格式,这些格式提供的 I/O 性能比使用多个小图像文件更好。

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述

使用已启用高业务影响的工作区

在使用敏感数据的方案中,应考虑将机器学习工作区指定为高业务影响 (HBI),方法是在创建该工作区时将 hbi_workspace 标志设置为 true。 已启用 HBI 的工作区可以加密计算群集的本地暂存磁盘、启用 IP 筛选、减少 Microsoft 收集的诊断数据量,等等。 有关详细信息,请参阅使用 Azure 机器学习进行数据加密

加密静态和动态数据

在 Blob 存储中加密敏感静态数据。 每次将数据从一个位置移到另一位置时,请使用 SSL 来保护数据传输。 有关详细信息,请参阅 Azure 存储安全指南

保护虚拟网络中的数据

对于生产部署,请考虑将机器学习群集部署到你指定的虚拟网络子网中。 通过此设置,群集中的计算节点便可安全地与其他虚拟机通信,或者与本地网络通信。 还可以对所有关联的资源使用服务终结点或专用终结点,以授权从虚拟网络进行访问。

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

使用 Azure 定价计算器估算运行深度学习工作负载的成本。 有关特定于机器学习的成本规划和管理注意事项,请参阅计划管理 Azure 机器学习的成本。 有关详细信息,请参阅成本优化支柱概述

高级 Blob 存储

高级 Blob 存储的数据存储成本较高,但事务成本低于标准 Blob 存储的热层存储数据的成本。 因此,对于事务率较高的工作负载,高级 Blob 存储可能会更划算。 有关详细信息,请参阅 Azure Blob 存储定价

容器注册表

容器注册表提供基本、标准和高级层。 根据所需的存储选择层。 如果需要异地复制,或要提高跨并发节点的 Docker 拉取操作的吞吐量,请选择“高级”。 此外,还需支付标准网络费用。 有关详细信息,请参阅 Azure 容器注册表定价

Azure 机器学习计算

在此体系结构中,Azure 机器学习计算可能是主要的成本驱动因素。 这种实现需要一个 GPU 计算节点集群。 这些节点的价格取决于其数量和所选 VM 大小。 有关包括 GPU 的 VM 大小的详细信息,请参阅 GPU 优化的虚拟机大小Azure 虚拟机定价

通常,深度学习工作负载会在每个纪元或几个纪元之后跟踪进度。 这种做法限制了意外中断对培训的影响。 可以将这种做法与机器学习计算群集的低优先级 VM 的使用配对。 低优先级 VM 以明显降低的速率使用 Azure 的富余容量,但是,如果容量需求增大,可能会抢占这些富余容量。

卓越运营

卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅卓越运营支柱概述

运行作业时,监视进度并确保操作按预期进行,这点至关重要。 然而,在活动节点群集间进行监视可能是一项挑战。

机器学习提供多种方式来检测试验。 会自动记录脚本中的 stdout 和 stderr 流。 这些日志将自动同步到工作区 Blob 存储。 可以通过 Azure 门户查看这些文件,或者使用 Python SDK 或机器学习 CLI 来下载或流式传输这些文件。 如果你使用 Tensorboard 记录你的实验,这些日志会自动同步。 你可以直接访问它们或使用机器学习 SDK 将它们流式传输到 Tensorboard 会话

性能效率

性能效率是指工作负载能够以高效的方式扩展以满足用户对它的需求。 有关详细信息,请参阅性能效率要素概述

由于网络开销,分布式训练的缩放效率始终小于 100% — 在设备之间同步整个模型成了一个瓶颈。 因此,分布式训练最适合于:

  • 无法通过在单个 GPU 上使用合理的批量大小来训练的大型模型。
  • 无法通过以简单、并行的方式分发模型来解决的问题。

不建议将分布式训练用于运行超参数搜索。 与单独训练多个模型配置相比,其缩放效率会影响性能,并降低分布式方法的效率。

提高缩放效率的方法之一是增加批大小。 但请谨慎进行这一调整。 在不调整其他参数的情况下增加批大小可能会损害模型的最终性能。

部署此方案

GitHub 中提供了本体系结构的参考实现。 请遵循该文章中的步骤在支持 GPU 的 VM 群集之间展开深度学习模型的分布式训练。

作者

本文由 Microsoft 维护, 最初由以下贡献者撰写。

主要作者:

若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。

后续步骤

本体系结构的输出是保存到 Blob 存储中的已训练模型。 可将此模型操作化,以用于实时评分或批处理评分。 有关详细信息,请参阅以下参考体系结构:

对于涉及分布式训练或深度学习的架构,请参阅以下资源: