机器学习可能基于数据发现一般化法则的劣势日益突显,咱们看到有越来越多的开发者关注如何训练出更疾速、更精确的机器学习模型,而分布式训练 (Distributed Training) 则可能大幅减速这一过程。
亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注 / 珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库! |
---|
对于在亚马逊云科技上进行分布式训练的话题,在各种场合和论坛咱们探讨了很多。随着 PyTorch 这一开源机器学习框架被越来越多的开发者在生产环境中应用,咱们也将围绕它开展话题。本文咱们将别离探讨在 PyTorch 上的两种分布式训练:数据分布式训练,以及模型分布式训练。
首先咱们来看看当今机器学习模型训练的演进趋势中,开发者对模型训练后果的两种迫切需要:
- 更疾速
- 更精确
更疾速的数据分布式训练
对于机器学习模型训练来说,将宏大的训练数据无效拆分,有助于放慢训练速度。
常见的数据分布式训练形式有两种:
基于参数服务器的数据分布式训练
(异步)参数服务器 (Parameter Server) : 如 TensorFlow Parameter Server Strategy
对于参数服务器 (Parameter Server) 来说,计算节点被分成两种:
- Workers:保留一部分的训练数据,并且执行计算;
- Servers:独特维持全局共享的模型参数。
而 Workers 只和 Servers 有通信,Workers 相互之间没有通信。
参数服务器形式的长处开发者都很相熟就不赘述了,而参数服务器的一个次要问题是它们对可用网络带宽的利用不够现实,Servers 经常成为通信瓶颈。
因为梯度在反向传递期间按程序可用,因而在任何给定的时刻,从不同服务器发送和接管的数据量都存在不均衡。有些服务器正在接管和发送更多的数据,有些很少甚至没有。随着参数服务器数量的减少,这个问题变得更加重大。
基于 Ring ALL-Reduce 的数据分布式训练
(同步)Ring All-Reduce: 如 Horovod 和 PyTorch DDP
Ring All-Reduce 的网络连接是一个环形,这样就不须要独自的 GPU 做 Server。6 个 GPU 独立做计算,用各自的数据计算出各自的随机梯度,而后拿 6 个随机梯度的相加之和来更新模型参数。为了求 6 个随机梯度之和,咱们须要做 All-Reduce。在全副的 GPU 都实现计算之后,通过 Ring All-Reduce 转 2 圈(第 1 圈加和,第 2 圈播送这个加和),每个 GPU 就有了 6 个梯度的相加之和。留神算法必须是同步算法,因为 All-Reduce 须要同步(即期待所有的 GPU 计算出它们的梯度)。
Ring All-Reduce 的次要问题是:
- 通过 Ring All-Reduce 转圈传递信息时,例如:G0 传递给 G1 时,其它 GPU 都在闲置状态;因而,这种步进工夫越长,GPU 闲置工夫就越长;而 GPU 越多这种通信代价就越大;
- All-Reduce 的资源会占用贵重的 GPU 资源,所以会在扩大的时候,面临效率挑战。
实例:Amazon SageMaker 数据并行的分布式办法
那么如何尽可能打消上述弊病?咱们通过亚马逊云科技在 Amazon SageMaker 上的数据并行实例来演示如何解决这一问题。
SageMaker 从头开始构建新的 All-Reduce 算法,以充分利用亚马逊云科技网络和实例拓扑,利用 EC2 实例之间的节点到节点通信。
这样做的劣势在于:
- 引入了一种名为均衡交融缓冲区的新技术,以充分利用带宽。GPU 中的缓冲区将梯度放弃到阈值大小,而后复制到 CPU 内存,分片成 N 个局部,而后将第 i 个局部发送到第 i 个服务器。均衡服务器发送和接管的数据,无效利用带宽。
- 能够无效地将 All-Reduce 从 GPU 转移到 CPU。
咱们可能重叠向后传递和 All-Reduce,从而缩短步进工夫,开释 GPU 资源用于计算。
在这里分享要害的 PyTorch 代码步骤:
- 更新训练脚本
与非分布式训练不同的是,在这里咱们输出 mdistributed.dataparallel.torch.torch_smdbp 的模型:
# Import SMDataParallel PyTorch Modules
import smdistributed.dataparallel.torch.torch_smddp
- 提交训练任务
在这里指定一个开关,关上数据并行即可。这样能够十分不便地调试,而不必在底层配置上破费工夫。
# Training using SMDataParallel Distributed Training Framework
distribution={"smdistributed":
{"dataparallel":
{"enabled": True}
}
},
debugger_hook_config=False,
您能够在 GitHub 上查看残缺代码示例:
Amazon Sagemaker Examples
- https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/mnist/code/train_pytorch_smdataparallel_mnist.py?trk=cndc-detail
- https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/mnist/pytorch_smdataparallel_mnist_demo.ipynb?trk=cndc-detail
更精确的模型分布式训练
家喻户晓,模型越大,那么预测后果的准确度越高。
那么在面对宏大模型的时候如何进行模型并行?咱们举荐开发者应用以下形式:
主动模型拆分
次要的优化策略基于内存应用和计算负载,从而更好地实现大模型的兼容。
均衡内存应用:均衡每台设施上存储的可训练参数和激活次数的总数。
均衡计算负载:均衡每台设施中执行的操作次数。
流水线执行打算
Amazon Sagemaker PyTorch SDK 中能够抉择两种形式实现:
- 简略流水线:须要等前项全副计算完之后能力进行后项的计算。
- 交织流水线:通过更高效利用 GPU 来实现更好的性能,包含模型并行等形式。
Amazon SageMaker 分布式模型并行库的外围性能是流水线执行 (Pipeline Execution Schedule),它决定了模型训练期间跨设施进行计算和数据处理的程序。流水线是一种通过让 GPU 在不同的数据样本上同时进行计算,从而在模型并行度中实现真正的并行化技术,并克服程序计算造成的性能损失。
流水线基于将一个小批次拆分为微批次,而后一一输出到训练管道中,并遵循库运行时定义的执行打算。微批次是给定训练微型批次的较小子集。管道调度决定了在每个时隙由哪个设施执行哪个微批次。例如,依据流水线打算和模型分区,GPU i 可能会在微批处理 b 上执行(向前或向后)计算,而 GPU i+1 对微批处理 b+1 执行计算,从而使两个 GPU 同时处于活动状态。
该库提供了两种不同的流水线打算,简略式和交织式 ,能够应用 SageMaker Python SDK 中的工作流参数进行配置。 在大多数状况下,交织流水线能够通过更高效地利用 GPU 来实现更好的性能。
更多相干信息可参考:
https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/model-p…
PyTorch 模型并行的分布式训练的关键步骤如下(以 PyTorch SageMaker Distributed Model Parallel GPT2 代码为例):
- 更新训练脚本
a. Import 模型并行模块
b. 带入参数的模型并行的初始化 smp.int (smp_config)
具体代码请参考:https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py?trk=cndc-detail
- 提交训练任务
a. 消息传递接口 (MPI) 是编程并行计算机程序的根本通信协议, 这里可形容每台机器上的 GPU 数量等参数
b. 激活模型分布式训练框架和相干配置等
具体代码请参考:https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel/gpt2/train_gpt_simple.py?trk=cndc-detail
实例:Amazon SageMaker 分布式训练
训练医疗计算机视觉 (CV) 模型须要可扩大的计算和存储基础架构。下图案例向您展现如何将医疗语义宰割训练工作负载从 90 小时缩小到 4 小时。
图片起源:官网博客《应用 Amazon SageMaker 训练大规模医疗计算机视觉模型》
解决方案中应用了 Amazon SageMaker 解决进行分布式数据处理,应用 SageMaker 分布式训练库来放慢模型训练。数据 I/O、转换和网络架构是应用 PyTorch 和面向人工智能的医疗凋谢网络 (MONAI) 库构建的。
在下篇文章中,咱们将持续关注无服务器推理,请继续关注 Build On Cloud 微信公众号。
往期举荐
- 机器学习洞察 | 开掘多模态数据机器学习的价值
作者
黄浩文
亚马逊云科技资深开发者布道师,专一于 AI/ML、Data Science 等。领有 20 多年电信、挪动互联网以及云计算等行业架构设计、技术及守业治理等丰盛教训,曾就任于 Microsoft、Sun Microsystems、中国电信等企业,专一为游戏、电商、媒体和广告等企业客户提供 AI/ML、数据分析和企业数字化转型等解决方案咨询服务。
文章起源:https://dev.amazoncloud.cn/column/article/63e32dd06b109935d3b…