[PyTorch]图解DistributedDataParallel (DDP)的通信方式:gather,all_gather,all_reduce,reduce,scatter

18 篇文章 0 订阅

在DistributedDataParallel (DDP)中,PyTorch不仅提供了Point-to-point communication这样的底层通讯方式,也提供了gather,all_gather,all_reduce,reduce,scatter这样的经封装的通讯方式.
但在文档中没有提供详细的说明.
在查找资料的过程中,在一个tutorials找到了相应的图解,一目了然.
文中图片与参数均来自官方doc与tutorials,本文仅作为个人笔记使用.
故,其中一些细节会略去,有兴趣的朋友可以参考手册与源代码.

1. 关于Point-to-point communication

在这里插入图片描述send 和 recv是基础的通信设计, 可以实现复杂的通信功能.
同样的,也可能由于设计出现一些意外,造成无限期的等待.

2. 图解gather,all_gather,all_reduce,reduce,scatter

具体使用方法可以查阅官方docs
在这里插入图片描述

3. 提供的OP

不知道是不是doc版本的原因,为查阅的doc并没有像open CV的doc那样提供出op的超链接.
目前收集到的有:
dist.ReduceOp.SUM,
dist.ReduceOp.PRODUCT,
dist.ReduceOp.MAX,
dist.ReduceOp.MIN.

按照tutorial的说法:
一般来说,任何可交换的数学运算都可以用作运算符。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: import torchfrom torch.distributed import all_reducetensor = torch.randn(10)all_reduce(tensor, op=torch.distributed.ReduceOp.SUM) ### 回答2: import torch import torch.distributed as dist # 设置进程数量和当前进程的编号 world_size = 4 rank = dist.get_rank() # 初始化进程组 dist.init_process_group("gloo", rank=rank, world_size=world_size) # 构造输入数据 input_tensor = torch.tensor([1, 2, 3, 4]) # 执行all_reduce操作 output_tensor = torch.zeros_like(input_tensor) dist.all_reduce(input_tensor, output_tensor, op=dist.ReduceOp.SUM) # 打印结果 print(f"Rank {rank}: {output_tensor}") # 释放进程组资源 dist.destroy_process_group() 以上代码展示了在PyTorch中如何使用all_reduce函数进行分布式的全局sum操作。 首先,我们需要设置进程数量(world_size)和当前进程的编号(rank),以便在多个进程之间进行通信。 接下来,我们使用init_process_group函数初始化分布式进程组,指定通信后端为gloo。这个函数也接收rank和world_size等参数。 然后,我们构造一个输入张量input_tensor,该张量包含了每个进程共享的部分数据。 接着,我们创建一个与input_tensor相同大小的输出张量output_tensor,并将其初始化为0。 最后,我们调用all_reduce函数,将input_tensor中的数据进行全局求和操作,并将结果保存在output_tensor中。 最后,我们打印每个进程的输出结果。 最后,我们使用destroy_process_group函数释放进程组资源。 注意:在实际使用中,需要在每个进程中保持一致的world_size和rank,以确保会话的正确初始化和通信操作。 ### 回答3: 下面是一个使用PyTorch进行all_reduce的示例代码: ```python import torch import torch.distributed as dist # 初始化进程组 dist.init_process_group(backend='gloo') # 创建本地张量 local_tensor = torch.tensor([1, 2, 3, 4]) # 在每个进程上执行all_reduce操作 dist.all_reduce(local_tensor, op=dist.ReduceOp.SUM) # 输出结果 print('Process', dist.get_rank(), 'local tensor:', local_tensor) # 释放进程组资源 dist.destroy_process_group() ``` 这段示例代码首先通过`init_process_group`函数来初始化进程组,使用`gloo`作为分布式通信的后端。然后,创建一个本地张量`local_tensor`。接下来,调用`all_reduce`函数,将`local_tensor`在所有进程上执行求和操作。最后,每个进程输出自己的`local_tensor`的结果。最后,通过`destroy_process_group`函数释放进程组资源。请注意,该示例假设运行在一个有多个进程的分布式环境中。 这个示例演示了如何使用PyTorch进行分布式计算中的all_reduce操作。all_reduce操作是一种常用的集体通信操作,它用于在分布式环境中将本地张量的值聚合成全局结果。在示例中,我们使用了`dist.ReduceOp.SUM`作为`all_reduce`函数的操作参数,表示将本地张量求和聚合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值