PyTorch分布式概述(从官方文档翻译)

前言

这是torch.distributed软件包的概览页。本页的目标是将文档分类为不同的主题,并简要描述每一个主题。如果这是您第一次使用PyTorch构建分布式培训应用程序,建议使用此文档导航到最适合您的用例的技术。

介绍

从PyTorch v1.6.0开始,torch.distributed中的功能可以分为三个主要组件:

  1. 分布式数据并行训练(DDP) 是一种广泛采用的单程序多数据训练模式。使用DDP,模型在每个进程上都被复制,每个模型副本都将被提供一组不同的输入数据样本。DDP负责梯度通信以保持模型副本同步,并将其与梯度计算重叠以加快训练。
  2. 基于RPC的分布式训练RPC支持无法适应数据并行训练的通用训练结构,如分布式流水线并行性、参数服务器范式以及DDP与其他训练范式的组合。它有助于管理远程对象的生存期,并将autograd引擎扩展到机器边界之外。
  3. 集体通信c10d库支持在组内的进程之间发送张量。它同时提供集体通信API(例如,all_reduce和all_gather)和P2P通信API(如send和isend)。DDP和RPC(ProcessGroup Backend)建立在c10d之上,前者使用集体通信,后者使用P2P通信。通常,开发人员不需要直接使用这种原始通信API,因为DDP和RPCAPI可以服务于许多分布式训练场景。然而,在某些用例中,这个API仍然是有帮助的。一个例子是分布式参数平均,其中应用程序希望在反向通过之后计算所有模型参数的平均值,而不是使用DDP来传达梯度。这可以将通信与计算解耦,并允许对通信内容进行更精细的控制,但另一方面,它也放弃了DDP提供的性能优化。使用PyTorch编写分布式应用程序展示了使用c10d通信API的示例。

Data Parallel Training

PyTorch为数据并行训练提供了多种选择。对于逐渐从简单发展到复杂、从原型发展到生产的应用程序,常见的开发轨迹是:

  1. 如果数据和模型可以容纳在一个GPU中,则使用单设备训练,并且训练速度不是问题。
  2. 使用单机多GPU DataParallel在一台机器上使用多个GPU,以最小的代码更改加快训练速度。
  3. 如果您想进一步加快训练速度并愿意编写更多代码来进行设置,请使用单机多GPU DistributedDataParallel。
  4. 如果应用程序需要跨越机器边界进行扩展,请使用多机器DistributedDataParallel和启动脚本。
  5. 当数据和模型无法容纳在一个GPU上时,在单机或多机上使用多GPU FullyShardedDataParallel训练。
  6. 如果预计会出现错误(例如内存不足),或者资源可以在训练过程中动态加入和离开,请使用torch.distributed.aelastic启动分布式训练。

torch.nn.DataParallel

DataParallel 包能够以最低的编码障碍实现单机多 GPU 并行性。只需要对应用程序代码进行一行更改。教程可选:数据并行性显示了一个示例。尽管 DataParallel 非常易于使用,但它通常无法提供最佳性能,因为它在每次前向传递中都会复制模型,并且其单进程多线程并行性自然会受到 GIL 争用的影响。为了获得更好的性能,请考虑使用 DistributedDataParallel。

torch.nn.parallel.DistributedDataParallel

与DataParallel相比,DistributedDataParallel需要多一步设置,即调用init_process_group。 DDP 使用多进程并行性,因此模型副本之间不存在 GIL 争用。此外,模型在 DDP 构建时广播,而不是在每次前向传递中广播,这也有助于加快训练速度。 DDP 附带了多种性能优化技术。如需更深入的解释,请参阅本文 (VLDB’20)。
DDP材料如下:

  1. DDP 注释提供了一个入门示例以及对其设计和实现的一些简要描述。如果这是您第一次使用 DDP,请从本文档开始。
  2. 分布式数据并行入门解释了 DDP 训练的一些常见问题,包括工作负载不平衡、检查点和多设备模型。请注意,DDP 可以轻松地与单机多设备模型并行性相结合,单机模型并行最佳实践教程中对此进行了描述。
  3. 启动和配置分布式数据并行应用程序文档展示了如何使用 DDP 启动脚本。
  4. 使用 ZeroRedundancyOptimizer 的分片优化器状态配方演示了 ZeroRedundancyOptimizer 如何帮助减少优化器内存占用。
  5. 使用连接上下文管理器进行不均匀输入的分布式训练教程逐步介绍如何使用通用连接上下文进行不均匀输入的分布式训练。

torch.distributed.FullyShardedDataParallel

FullShardedDataParallel (FSDP) 是一种数据并行范例,它维护模型参数、梯度和优化器状态的每个 GPU 副本,它将所有这些状态跨数据并行工作线程进行分片。从 PyTorch v1.11 开始添加了对 FSDP 的支持。 FSDP 入门教程提供了 FSDP 如何工作的深入解释和示例。

torch.distributed.elastic

随着应用程序复杂性和规模的增长,故障恢复成为一项要求。有时,使用 DDP 时不可避免地会遇到内存不足 (OOM) 等错误,但 DDP 本身无法从这些错误中恢复,并且无法使用标准的 try- except 结构来处理它们。这是因为 DDP 要求所有进程以紧密同步的方式运行,并且不同进程中启动的所有 AllReduce 通信必须匹配。如果组中的某个进程抛出异常,则可能会导致不同步(AllReduce 操作不匹配),从而导致崩溃或挂起。 torch.distributed.elastic 增加了容错能力和利用动态机器池(弹性)的能力。

RPC-Based Distributed Training

许多训练范式不适合数据并行,例如参数服务器范式、分布式管道并行、具有多个观察者或代理的强化学习应用程序等。torch.distributed.rpc旨在支持一般的分布式训练场景。
torch.distributed.rpc 有四个主要支柱:

  • RPC 支持在远程工作人员上运行给定的功能。
  • RRef 有助于管理远程对象的生命周期。参考计数协议在 RRef 注释中介绍。
  • 分布式 Autograd 将 autograd 引擎扩展到机器边界之外。更多详细信息请参阅分布式 Autograd 设计。
  • 分布式优化器自动联系所有参与的工作人员,使用分布式 autograd 引擎计算的梯度来更新参数。

RPC教程如下:

  1. 分布式 RPC 框架入门教程首先使用一个简单的强化学习 (RL) 示例来演示 RPC 和 RRef。然后,它将基本的分布式模型并行性应用到 RNN 示例中,以展示如何使用分布式 autograd 和分布式优化器。
  2. 使用分布式 RPC 框架实现参数服务器教程借鉴了 HogWild 的精神!训练并将其应用于异步参数服务器(PS)训练应用程序。
  3. 使用 RPC 的分布式管道并行教程将单机管道并行示例(在单机模型并行最佳实践中介绍)扩展到分布式环境,并展示了如何使用 RPC 实现它。
  4. 使用异步执行实现批量 RPC 处理教程演示了如何使用 @rpc.functions.async_execution 装饰器实现 RPC 批量处理,这有助于加快推理和训练速度。它使用类似于上述教程 1 和 2 中的 RL 和 PS 示例。
  5. 将分布式数据并行与分布式 RPC 框架相结合教程演示了如何将 DDP 与 RPC 相结合,以使用分布式数据并行性与分布式模型并行性相结合来训练模型。

PyTorch Distributed Developers

如果您想为 PyTorch Distributed 做出贡献,请参阅开发人员指南

以上内容均翻译致pytorch分布式训练官方文档: PyTorch Distributed Overview.

  • 47
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值