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


当层(例如 BatchNorm)需要跟踪状态,例如运行方差和均值时,模型缓冲器(buffer)是非常必要的 。DDP 通过让 rank 为 0 的进程获得授权来支持模型缓冲器 。
核心梯度下降
开发过程中的主要工作就是梯度降低,它也是 DDP 中决定性能的关键步骤 。这个在 reducer.cpp 中的实现有 4 个主要的组成部分:构建 parameter-to-bucket map、安装 autograd 钩子,启动 bucket AllReduce 以及检测全局未用过的参数 。
Parameter-to-Bucket Mapping 已经对 DDP 的速度有了相当大的影响 。在每次反向传播中,tensor 从全部的参数梯度到 bucket 被复制,平均梯度在 AllReduce 之后又被复制回 tensor 。
Autograd Hook 是 DDP 反向传播的进入点 。在构造期间,DDP 遍历模型中的所有参数,找出每个参数的梯度累加器,并且为每个梯度累加器安装相同的 post-hook 函数 。当相应的梯度准备就绪时,梯度累加器会启用 post hook,并且当整个 bucket 准备好启动 AllReduce 操作时,DDP 会确定启用 。
Bucket Allreduce 是 DDP 中通信开销的主要来源 。默认情况下,bucket 的大小是 25MB 。
实验评估
研究者展示了使用专属 32-GPU 集群和共享权限时 PyTorch DDP 的评估结果,其中 GPU 部署在 4 台服务器,并通过迈络思 MT27700 ConnectX-4 100GB/s 的网卡连接 。每台服务器配有 8 个英伟达 Tesla V100 GPU 。
下图 5 展示了一台服务器上 8 个 GPU 的互连方式:
接下来,研究者利用 ResNet50 和 BERT 这两个流行的模型度量了 PyTorch DDP 在每次迭代时的延迟和可扩展性,并且大多数实验使用随机生成的合成输入和标签,这对于比较每次迭代时的延迟来说足够了 。
延迟故障
为了验证通信重叠计算的有效性,下图 6 展示了 ResNet50 和 BERT 模型分别使用 NCCL 和 Gloo 反向传递时的延迟故障 。所有实现都用到了 4 台服务器上的 32 个 GPU 。
结果显示,在 PyTorch DDP 训练时,反向传递是耗时最长的步骤,这是因为 AllReduce 通信(即是梯度同步)在这一过程中完成 。
Bucket 大小
bucket 大小是一个重要的配置选项 。根据经验,出于最大努力估计,bucket_cap_mb 的默认值是 25MB 。研究者使用两台机器上的 16 个 GPU 比较不同 bucket 大小下每次迭代的延迟 。另一个极端是在短时间内传递全部的梯度,结果如下图 7 所示 。
下图 8 给出了相同设置下、32 个 GPU 上的实验结果 。在这种情况下,离群值(outlier)的跨度更大,这并不意外 。因为在有更多参与者的情况下,同步必然要花费更长的时间,并且 strangler 的影响更明显 。
可扩展性
为了理解 DDP 的可扩展性,研究者用多达 256 个 GPU 上的 NCCL 和 Gloo 后端来度量 ResNet50 和 BERT 每次迭代的训练延迟 。结果如下图 9 所示 。
下图 10 给出了每 1、2、4 和 8 次迭代进行梯度下降时每次迭代的平均延迟 。
除了每次迭代延迟,测量收敛速度以验证加速度是否会因收敛放缓而被消除也非常关键 。实验采用 MNIST 数据集来训练 ResNet 。学习率设置为 0.02,批处理大小是 8 。结果如下图 11(a)所示;图 11(b)是将批处理大小设为 256,学习率设为 0.06 的测量结果 。
循环分配(Round-Robin)进程组
PyTorch 分布式包支持将 Round-Robin 进程组和多个 NCCL 或 Gloo 进程组组合在一起,从而按照 Robin-Robin 顺序向各个进程组实例分配聚合通信 。
下图 12 展示了使用 1、3 和 5 个 NCCL 或 Gloo 进程组的 Round-Robin 进程组每次迭代的延迟 。最显著的加速是使用 NCCL 后端的 BERT 模型 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: