如何加速Kubernetes的集群管理?
循环分配(Round-Robin)进程组 PyTorch 分布式包支持将 Round-Robin 进程组和多个 NCCL 或 Gloo 进程组组合在一起,从而按照 Robin-Robin 顺序向各个进程组实例分配聚合通信。
下图 12 展示了使用 1、3 和 5 个 NCCL 或 Gloo 进程组的 Round-Robin 进程组每次迭代的延迟。最显著的加速是使用 NCCL 后端的 BERT 模型。 结果显示,在 PyTorch DDP 训练时,反向传递是耗时最长的步骤,这是因为 AllReduce 通信(即是梯度同步)在这一过程中完成。 Bucket 大小
bucket 大小是一个重要的配置选项。根据经验,出于最大努力估计,bucket_cap_mb 的默认值是 25MB。研究者使用两台机器上的 16 个 GPU 比较不同 bucket 大小下每次迭代的延迟。另一个极端是在短时间内传递全部的梯度,结果如下图 7 所示。 下来,研究者利用 ResNet50 和 BERT 这两个流行的模型度量了 PyTorch DDP 在每次迭代时的延迟和可扩展性,并且大多数实验使用随机生成的合成输入和标签,这对于比较每次迭代时的延迟来说足够了。 延迟故障
为了验证通信重叠计算的有效性,下图 6 展示了 ResNet50 和 BERT 模型分别使用 NCCL 和 Gloo 反向传递时的延迟故障。所有实现都用到了 4 台服务器上的 32 个 GPU。 聚合通信 DDP 是在集合通信库基础上建立的,包括 3 个选项 NCCL、Gloo 和 MPI。DDP 采用了来自这三个库的 API,并将它们封装进同一个 ProcessGroup API 中。 由于所有的通信都是聚合操作,因此所有的 ProcessGroup 实例上的后续操作必须和其类型匹配并遵循相同的顺序。对所有的库使用同一个 ProcessGroup API 允许研究者在相同的 DDP 实现上试验不同的通信算法。 如果单一 NCCL、Gloo 或 MPI 的 ProcessGroup 无法使链路容量达到饱和,通过使用循环的 ProcessGroups,DDP 可以获得更高的带宽利用率。 具体实现DDP 的实现在之前的几个版本中已经改进了多次。研究者介绍了当前 PyTorch v1.5.0 的状态。DDP 同时在 Python 和 C++ 上都可以实现,Python 开放了 API 并组成了非性能关键因素组件,而 C++ 提供了核心梯度下降算法。Python API 通过 Pybind11 的 API 调用了 C++ 内核。 Python 前端 Python 前端中的实现细节决定了 DDP 的行为。可配置的 Knobs 在 DDP 构造函数 API 中开放。具体包括:
本地模型中的 Model Device Affinity 也能控制 DDP 的行为,尤其是当模型因为太大而需要跨越多个设备运行时,更是如此。对于大型模型,模型的每一层可以放在不同的设备上,使用 Tensor.to(device) API 可以将中间输出从一个设备转移到另一个上。DDP 也可以在多个模型上运行。 当层(例如 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 的互连方式: (编辑:保山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |