前言
2017 年,Facebook 开源了针对深度学习的框架 PyTorch。PyTorch 可以帮助开发者和研究人员更加轻松的构建和训练模型。凭借其简单易用、功能强大、用途广泛等特点,PyTorch 广受欢迎,且至今仍是最火的深度学习框架之一。
近年来,随着数据集和模型规模的日益庞大,出于效率考虑,开发者通常采用分布式训练的方式,提⾼训练速度以加快模型迭代。流行的深度学习框架 PyTorch 也为分布式训练提供了内置支持。PyTorch 的分布式训练方式主要有 DP (DataParallel)、DDP (Distributed DataParallel)、Horovod 三种,其中 DP 和 DDP 是 PyTorch 原生支持的方式, 而 Horovod 是第三方支持。本文将对这三种方式进行比较。并对如何进一步提高 PyTorch 分布式训练的效率进行介绍。
PyTorch 分布式训练如何更加简单、高效?Amazon SageMaker 结合了软件和硬件技术来改善 GPU 间和节点间的通信, 只需对训练脚本进行少量代码更改即可带来效率的提升。不仅如此,Amazon SageMaker 还通过 MLOps 对大规模深度学习模型构建、训练、部署的整个流程进行了优化,从而让深度学习模型更快地投入生产。
我们将带大家探索如何用 Amazon SageMaker 实现 PyTorch 分布式训练与深度学习全流程的改造。在亚马逊云科技 6 月 23 日即将举办的“人工智能新引擎”为主题的创新大会(Innovate)中也将对大规模机器学习实践进行详细和全面地介绍,感兴趣可扫码报名。
传统 PyTorch 数据并行训练的三种方式
在分布式训练中,训练模型的工作负载被拆分到多个微型处理器上,每个微型处理器都被称为一个工作节点,通过节点并行工作的方式加速模型训练。
分布式训练通常被用于深度学习模型训练的两种情况。其一是数据集太大而无法加载并希望在限定时间内得到结果;其二是模型太大,无法加载到一张 GPU 卡上。前者采用数据并行的方式,而后者则通常采用模型并行的方式中。数据并行更易于使用且应用更为广泛,模型并行目前还不够成熟,尚缺乏统一的方案。在 PyTorch 中实现数据并行的方式有以下三种。
DataParallel(DP)
DP 基于 PS 架构, 只能用于单机多卡的场景, 无法满足多机的场景。它基于单进程多线程的方式实现,所有的调度及数据加载都是通过一个进程进行,其中有一个 master 节点负责从各卡搜集梯度、计算更新参数、再将参数同一发送到各卡。这种方式导致 master 节点的计算和网络压力较重,从而导致网络阻塞,训练速度降低。因此,尽管使用非常简单, 只需要在原本单机版的代码中加上一行代码,但是效率较低。
DDP (Distributed DataParallel)
DDP 采用 ring-all-reduce 进行通信, 既能用于单机多卡的场景,也能用于多机多卡的场景。DDP 基于多进程的方式实现,一般每个卡一个进程,独立进行梯度计算,不需要 master 节点,每个进程只和上下游两个两个进程进行通信,极大减少了网络阻塞的情况,因此相对而言 DP 而言,它的效率更高。采用 DDP 需要涉及更多的代码改造,对初学者有一定挑战,但如果对代码比较熟悉,则更推荐采用 DDP 的方式。就目前而言,DDP 是 PyTorch 分布式训练的主流。
Horovod
除了 PyTorch 原生的两种分布式训练的方式,Horovod 在业界也非常受到认可。Horovod 是 Uber 于 2017 年发布的一个易于使用的高性能的分布式训练框架。使用 Horovod 编写可扩展的训练脚本,可以在单 GPU、多 GPU 甚至多台主机上运行, 而无需太多的代码更改。Horovod 基于 Allreduce 的算法。该算法摆脱了 PS 对于 Parameter-Server 带宽的依赖, 可以让每个节点在带宽传输中的位置是对等的,并且减少传输次数。
事实上,Horovod 不仅支持 PyTorch,还支持 TensorFlow、Mxnet 等多种框架。相较原生的分布式训练方式,在 TensorFlow 里 Horovod 分布式训练的应用更广泛,而在 PyTorch 里面,由于应用性方面的考虑及代码侵入等问题的存在,大多数用户还是更倾向选择原生的 DDP 方式。
使用 Horovod 进行多机分布式训练,还存在一个问题,即需要开发者手动配置每台机器的环境并将代码和数据复制进去,对于大规模训练来说,流程非常繁琐。在这方面,Amazon SageMaker 对 Horovod 提供了支持。Amazon SageMaker 提供了 Horovod 相关的深度学习镜像。当开发者使用 Horovod 进行分布式训练时,可以在 Amazon SageMaker 的 Python-SDK 里面指定 Distribution 的参数。Amazon SageMaker 基于该参数即可自动确定应该如何运行脚本。开发者所需要的仅仅是在 API 里做简单的指令,剩下的工作 Amazon SageMaker 会进行相应调整,极大的简化了多机分布式训练准备工作流程。
如何实现更高效的 PyTorch 分布式训练
不管是深度学习框架 PyTorch 的 DDP 还是 Horovod,主要针对系统层面进行了优化,将已有的单机单卡场景通过算法扩展到多机多卡场景,虽然系统层面的优化使得并行效率不断提升,但边际效益却越来越明显,尤其体现在扩展效率方面。扩展效率低会导致资源极大的浪费,因此分布式训练框架要解决的一个重要的痛点就是如何尽可能利用 GPU 资源,最大限度利用带宽,以提升效率。
亚马逊云科技在 Gartner®发布的 Magic Quadrant™ for Cloud AI Developer Services 报告中位列领导者象限。作为人工智能及机器学习领域的全球企业,亚马逊云科技始终致力于 AI/ML 的技术与解决方案创新。
Amazon SageMaker 通过提高分布式训练过程中的线性扩展效率,达到对分布式训练的优化。在 PyTorch、Horovod、TensorFlow 等框架的基础上,Amazon SageMaker 分布式训练使用分区算法,在亚马逊云科技 GPU 实例中自动拆分大型深度学习模型和训练集,减轻开发者需手动执行的工作量。它通过数据并行和模型并行两种方式实现分布式训练效率的提升。
数据并行
Amazon SageMaker 的数据并行通信算法旨在充分利用亚马逊云科技的网络和基础设施实现线性扩展效率的提升。
一方面,Amazon SageMaker 基于不同场景提供多种形式的存储。在进行分布式训练的过程中需要加载训练数据,传统的方式通过代码实现该过程,将数据分片,拷贝到多台机器上,因此会带来很大一部分数据拷贝开销。而采用 Amazon SageMaker 进行分布式训练则可以将数据直接从 Amazon S3 中下载到训练机器上,解决了开发者手动进行数据分片和数据传输的问题。
另一方面,在训练过程中开发者需要关注算法的指标,Amazon SageMaker 实现了指标的可视化。开发者可以直接通过任务监控平台了解指标的变化,不需要随时查看日志。当然,所有日志 Amazon SageMaker 也会保留下来,方便开发者追踪和检查。
模型并行
模型并行算法所解决的最主要的问题就是模型分区的问题。即使对于经验最丰富的数据科学团队,对于大型模型进行手动划分也至少需要数周的时间。通过 Amazon SageMaker 可以对模型进行自动分析并找到 GPU 之间对模型进行分区最有效的方式,只需几秒钟时间,就能够实现对模型的拆分。不仅如此,开发者使用 Amazon SageMaker 在多个 GPU 之间拆分模型,仅仅需要在 PyTorch 或 TensorFlow 训练脚本中更改不到 10 行代码,就能实现快速启动和运行。
在模型训练过程中,Amazon SageMaker 通过将训练批次拆分为较小的微批次,最大限度地利用 GPU 实例。较小的微批次通过高效的管道输送到 GPU,以保持所有 GPU 设备同时处于活动状态。在去年年底亚马逊云科技 re:Invent 还推出了 Amazon SageMaker Training Compiler 编译器进一步提升模型训练的效率,通过图形和内核级优化能够将训练速度提高 50%。
应用案例
Amazon SageMaker 分布式训练在对象检测、自然语言处理、计算机视觉等领域都有着广泛的应用。现代汽车作为世界上最大的汽车制造商之一,在开发自动驾驶汽车中投入了大量人力和物力。自动驾驶中比较常用的算法是语义分割,这种方式需要定期测试准确性并收集额外的图像以修正特定情况下的预测性不足问题,而现代汽车并没有足够的时间和新数据来训练模型。通过 Amazon SageMaker 数据并行库进行分布式训练,只用几行代码就将基于 PyTorch 数据并行的训练代码转换为 Amazon SageMaker 数据并行库,并在 8 个 GPU 实例或总共 64 个 GPU 的情况下实现了高达 93% 的扩展效率,训练时间减少 10 倍。
MLOps,云端深度学习全流程改造
Amazon SageMaker 不仅专注于解决深度学习模型训练的问题。事实上,它能够实现的是机器学习与深度学习构建、训练、部署全流程的自动化、规模化与标准化,即 MLOps。
模型构建与训练
模型的开发是一个非常繁琐的过程,从数据标记到数据预处理、模型训练、模型评估到模型的更新和部署,在每个环节,算法工程师都需要不停进行来回迭代。采用 Amazon SageMaker Pipelines 能够自动化整个模型构建工作流程。开发者可以将 Amazon SageMaker 管道配置为定期自动运行或在触发某些事件时自动运行,也可以根据需要选择手动运行模式。通过这样的方式开发者可避免大量重复工作,以实现快速实验和模型重新训练。
ML 模型构建与训练是一个迭代过程,涉及训练数百个不同的模型以寻找最佳算法、模型架构和参数,以达到所需的预测精度水平。这使得想要跟踪性能最佳的模型及输入配置非常困难,也很难将正在进行的实验与过去的实验进行比较以进一步改进。通过 Amazon SageMaker Experiments 与 Amazon SageMaker Studio 集成,能够提供可视化界面来查看正在进行的和过去的实验,比较关键性能指标的试验,并确定性能最佳的模型,从而提高试验的可重复性和数据科学家之间的协作效率。
模型部署
模型构建与训练完成后,只有被部署到生产中才能够正式投入使用。早期深度学习模型更多的是应用于学术界,不需要考虑生产方面的问题。PyTorch 也是近几年才发展起来的。一旦涉及生产,就进入了模型推理阶段,然而,在当时并没有一个框架能够很好的解决 Pytorch 模型推理的问题。
基于这样的问题,2020 年 4 月亚马逊云科技联手 Facebook 推出了 TorchServe PyTorch 模型服务库。采用 TorchServe 能够在不编写自定义代码的情况下轻松地大规模部署训练好的 PyTorch 模型。借助 TorchServe 多模型服务、适用于 A/B 测试的模型版本控制、监控指标以及适用于应用程序集成的 RESTful 终端节点等特性,开发者可以快速将模型从研究推向生产。
2021 年 12 月亚马逊云科技宣布与 Meta 深化合作。为进一步简化模型在生产环境中的部署,亚马逊云科技与 Meta 将持续优化 TorchServe 的功能,从而让深度学习模型更快的投入生产。TorchServe 近年来有哪些创新,又有哪些应用实践,敬请期待 6 月 23 日 14:00-18:00 以“人工智能新引擎”为主题的亚马逊云科技创新大会(Innovate)。
大会将重磅发布人工智能“新引擎”缔造企业变革和业务创新的四大路径。50 多位专家,40 多个前沿技术话题,7 大分会场,亚马逊云科技创新大会(Innovate)将以在线大会的方式全面阐释亚马逊云科技如何通过 AI/ML 技术赋能客户,帮助开发者,于变局之中抓住机遇、实现创新。
评论