Pytorch rendezvous 分布式
一、rendezvous 简介:
PyTorch中的rendezvous后端是一种服务,它帮助分布式训练作业中的进程相互发现并协商角色和等级。它还提供了一个屏障和一个一致的作业成员和状态视图。
rendezvous后端是作为torch.distributed.elastic.rendezvous.RendezvousHandler的子类实现的,它定义了创建、加入和销毁rendezvous的接口。rendezvous后端还需要为rendezvous提供容错和弹性,这意味着它可以处理节点故障和训练过程中节点数量的变化。
PyTorch提供了一些内置的rendezvous后端,例如:
C10dRendezvousBackend:使用C10d存储(默认为TCPStore)作为rendezvous后端。使用C10d存储的主要优点是它不需要第三方依赖(如etcd)来建立rendezvous2。
EtcdRendezvousBackend:使用启用了v2 api的etcd服务器作为rendezvous后端。使用etcd的优点是它为rendezvous提供了容错和弹性2。
要在PyTorch中使用rendezvous后端,你需要在使用torchrun或torch.distributed.launch启动你的训练脚本时指定一些选项。
这些选项包括:
–rdzv_id:一个唯一的作业id(由参与作业的所有节点共享)
–rdzv_backend:用于处理rendezvous的后端的名称
–rdzv_endpoint:rendezvous后端运行的端点;通常以host:port的形式
附官方文档链接:https://pytorch.org/docs/stable/elastic/rendezvous.html
(2) pytorch/c10d_rendezvous_backend.py at main - GitHub. https://github.com/pytorch/pytorch/blob/main/torch/distributed/elastic/rendezvous/c10d_rendezvous_backend.py.
(3) torchrun (Elastic Launch) — PyTorch 2.0 documentation. https://pytorch.org/docs/stable/elastic/run.html
二、NCCL和rendezvous的关系:
Rendezvous 和 NCCL 是 torch.distributed 包的两个组件,可在 PyTorch1 中启用分布式并行训练。 Rendezvous 是一种将分布式同步原语与对等点发现相结合的功能。 Torch Distributed Elastic 使用它来收集训练工作的参与者(即节点),以便他们都同意相同的参与者列表和每个人的角色,并就何时可以开始/恢复训练做出一致的集体决定2。 NCCL 是 torch.distributed 支持 GPU 之间分布式通信的后端之一。 类 torch.nn.parallel.DistributedDataParallel() 建立在这个功能的基础上,以提供同步分布式训练作为任何 PyTorch 模型 1 的包装器。
PyTorch distributed package 支持三种built-in backend: Gloo, MPI and NCCL
除了NCCL后端,Rendezvous还支持Gloo和MPI后端¹。这些后端具有不同的分布式通信能力和性能特征。你可以通过向torch.distributed.init_process_group()
传递backend
参数来选择后端¹。例如,要使用Gloo代替NCCL,你可以写:
dist.init_process_group(backend='gloo', ...)
你也可以使用PyTorch没有内置的其他rendezvous后端,例如etcd-v2或c10d²。这些后端需要你向torchrun
指定rdzv_backend
和rdzv_endpoint
参数²。例如,要使用c10d rendezvous后端,你可以写:
torchrun --rdzv_backend=c10d --rdzv_endpoint=localhost:0 ...
PyTorch distributed package supports three built-in backends: Gloo, MPI and NCCL
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡