数据建模的基本流程 分布式数据处理的概念

PyTorch 在学术圈里已经成为最为流行的深度学习框架,如何在使用 PyTorch 时实现高效的并行化?
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法 。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估 。

数据建模的基本流程 分布式数据处理的概念


论文地址:
http://www.jinnalai.com/uploads/article/2021/09/29/86396.pdf 是深度学习研究和应用中广泛使用的科学计算包 。深度学习的最新进展证明了大型数据集和大型模型的价值,这需要扩展模型训练更多计算资源的能力 。
同时,由于简明的原理和广泛的适用性,数据并行已经成为了分布式训练的一种热门方案 。通常,分布式数据并行技术会在每个计算资源上复制模型以独立生成梯度,然后在每次迭代时传递这些梯度以保持模型副本的一致性 。尽管该技术在概念上很简单,但计算和通信之间的细微依赖关系使优化分布式训练的效率变得不简单 。
因此,在这篇论文中,来自 Facebook AI 和华沙大学的研究者介绍了 PyTorch 分布式数据并行模型的设计、实现以及评估 。
从 v1.5 开始,PyTorch 自身提供了几种加速分布数据并行的技术,包括分桶梯度(bucketing gradients)、通信重叠计算(overlapping computation with communication)以及跳过梯度同步(skipping gradient synchronization) 。相关评估结果显示,在配置正确的情况下,PyTorch 分布式数据并行模型可以用 256 个 GPU 达到接近线性的可扩展性 。
接下来,我们来看 PyTorch 分布式数据并行训练的模型设计、具体实现和效果评估 。
系统设计
PyTorch 提供了一个数据分布式并行(DistributedDataParalle, DDP)模型来帮助实现在多个进程和机器的并行训练 。在分布训练期间,每个模型都有自己的本地模型副本和本地优化器 。就纠错而言,分布式数据并行训练和本地训练在数学上必须是等价的 。
下图 1 描述了 DDP 构造块的组成,其中包含一个 Python API 前端和 C++ 梯度下降核心算法,并采用了 c10d 聚合通信库 。

数据建模的基本流程 分布式数据处理的概念


Python API 前端
在设计 API 时,研究者制定了以下两个设计目标来达到必要的功能:
非侵入式:对应用提供的 API 必须是非侵入式的;
拦截式:API 需要允许拦截各种信号并立即触发适当的算法 。
分布式数据并行化旨在使用更多的计算资源来加速训练 。
根据以上需求,研究者用 nn.Module 实现了分布式数据并行 。nn.Module 采用本地模型作为构造函数的参数,并在反向传播中透明地同步梯度 。下面的代码是使用 DDP 模型的示例:

数据建模的基本流程 分布式数据处理的概念


梯度下降
研究者阐述了在 PyTorch 上进行分布式数据并行训练的几种梯度降低技术 。DDP 中的梯度下降算法已经有了新的改进 。为了介绍当前实现的结构,研究者从一个简单的初始方案(naive solution)开始,逐步介绍更多复杂的版本,最终在 PyTorch v1.5.0 上使用当前版本 。
初始方案
DDP 首先校正了所有的训练进程,以保证各个进程:
从相同的模型状态开始;
每次迭代花费同样多的梯度 。
为了完成第二点,初始方案在进行本地反向传播之后、更新本地参数之前插入了一个梯度同步环节 。幸运的是,PyTorch 的 autograd 引擎能够接受定制的 backward 钩子(hook) 。DDP 可以注册 autograd 钩子来触发每次反向传播之后的计算 。然后,它会使用 AllReduce 聚合通信来号召计算所有进程中每个参数的平均梯度,并且把结果写回梯度 tensor 。

推荐阅读