torch.distributed
提供了一种类似 MPI 的接口,用于跨多机器网络交换张量数据。它支持几种不同的后端和初始化方法。
目前,torch.distributed
支持三个后端,每个后端具有不同的功能。下表显示哪些功能可用于 CPU / CUDA 张量。只有当用于构建 PyTorch 的实现支持它时,MPI 才支持 cuda。
后端 | tcp |
gloo |
mpi |
---|---|---|---|
设备 | 中央处理器 | GPU | 中央处理器 |
--- | --- | --- | --- |
发送 | ✓ | ✘ | ✘ |
的 recv | ✓ | ✘ | ✘ |
广播 | ✓ | ✘ | ✓ |
all_reduce | ✓ | ✘ | ✓ |
减少 | ✓ | ✘ | ✘ |
all_gather | ✓ | ✘ | ✘ |
收集 | ✓ | ✘ | ✘ |
分散 | ✓ | ✘ | ✘ |
屏障 | ✓ | ✘ | ✓ |
所述torch.distributed
包提供跨在一个或多个计算机上运行的几个计算节点对多进程并行 PyTorch 支持与通信原语。该类torch.nn.parallel.DistributedDataParallel()基于此功能,提供同步分布式培训作为围绕任何 PyTorch 模型的包装器。这不同于所提供的类型的并行的 :模块:torch.multiprocessing
和torch.nn.DataParallel()在它支持多个网络连接的机器和在用户必须明确地启动主训练脚本的单独副本为每个进程。
在单机同步情况下,torch.distributed 或 torch.nn.parallel.DistributedDataParallel()wrapper 可能仍然具有优于数据并行性的其他方法的优点,包括torch.nn.DataParallel():
torch.distributed.init_process_group() 在调用任何其他方法之前,需要使用该函数初始化该包。这将阻止所有进程加入。
初始化分布式包。
参数:
tcp
,mpi
和gloo
。返回当前进程的排名。
Rank 是分配给分布式组中每个进程的唯一标识符。它们总是连续的整数,范围从 0 到world_size
。
返回分布式组中的进程数。
目前支持三种初始化方式:
有两种方法来初始化使用 TCP,这两种方法都需要可以从所有进程访问的网络地址和所需的 world_size。第一种方法需要指定属于等级 0 进程的地址。第一种初始化方式要求所有进程都具有手动指定的等级。
或者,地址必须是有效的 IP 多播地址,在这种情况下可以自动分配等级。组播初始化还支持一个 group_name 参数,只要使用不同的组名,就可以为多个作业使用相同的地址。
import torch.distributed as dist
# Use address of one of the machines
dist.init_process_group(init_method='tcp://10.1.1.20:23456', rank=args.rank, world_size=4)
# or a multicast address - rank will be assigned automatically if unspecified
dist.init_process_group(init_method='tcp://[ff15:1e18:5d4c:4cf0:d02d:b659:53ba:b0a7]:23456',
world_size=4)
另一个初始化方法利用一个文件系统,该文件系统可以从组中的所有计算机共享和可见,以及所需的 world_size。该 URL 应 file://以共享文件系统上的不存在的文件(在现有目录中)开头并包含一个路径。此初始化方法也支持一个 group_name 参数,只要使用不同的组名,就可以使用相同的共享文件路径进行多个作业。
警告
该方法假设文件系统支持使用 fcntl 大多数本地系统进行锁定,NFS 支持它。
import torch.distributed as dist
# Rank will be assigned automatically if unspecified
dist.init_process_group(init_method='file:///mnt/nfs/sharedfile', world_size=4,
group_name=args.group)
该方法将从环境变量中读取配置,从而可以完全自定义获取信息的方式。要设置的变量是:
等级为 0 的机器将用于设置所有连接。
这是默认方法,这意味着 init_method 不必指定(或可以 env://)。
默认集合在默认组(也称为世界)上运行,并要求所有进程进入分布式函数调用。然而,一些工作负载可以从更细粒度的通信中受益。这就是分布式组织发挥作用的地方。new_group()函数可用于创建新组,具有所有进程的任意子集。它返回一个不透明的组句柄,可以作为 group 参数给予所有集合(集合是分布式函数以在某些众所周知的编程模式中交换信息)。
创建一个新的分布式组。
此功能要求主组中的所有进程(即作为分布式作业的一部分的所有进程)都将输入此功能,即使它们不会是组的成员。此外,应在所有进程中以相同的顺序创建组。
参数:
同步发送张量。
参数:
同步接收张量。
参数:
isend()并irecv() 在使用时返回分布式请求对象。一般来说,此对象的类型是未指定的,因为它们不应该手动创建,而是保证支持两种方法:
以异步方式发送张量。
参数:
返回:
分布式请求对象。
以异步方式接收张量。
参数:
返回: 分布式请求对象。
向整个组播放张量。
tensor
在参与集体的所有过程中必须具有相同数量的元素。
参数:
减少所有机器上的张量数据,使得所有机器都得到最终结果。
tensor
在所有进程中,呼叫将是相同的。
参数:
torch.distributed.reduce_op
枚举中的一个值。指定用于元素方式减少的操作。减少所有机器的张量数据。
只有排名过程dst
才会得到最终结果。
参数:
torch.distributed.reduce_op
枚举中的一个值。指定用于元素方式减少的操作。从列表中收集整个组的张量。
参数:
在单个过程中收集张量列表。
参数:
向组中的所有进程散布张量列表。
每个进程将只收到一个张量,并将其数据存储在 tensor
参数中。
参数:
同步所有进程。
这个集体阻止进程,直到整个组进入这个功能。
参数: group (可选) - Group of the collective.
用户名 | 头像 | 职能 | 签名 |
---|---|---|---|
Song | 翻译 | 人生总要追求点什么 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。