目录

零、Pytorch并行模块

1、Data_parallel

2、多进程封装方式

一、实验目的和实验内容

1.1实验介绍

二、实验设计

2.1对model实现参数的广播、收集和聚合

2.2设置瓶颈节点

2.2.1 聚合时间瓶颈

2.2.2 梯度计算时间瓶颈

零、Pytorch并行模块

1、Data_parallel

单机多卡:数据并行的方式,网络的input数据一般要求IId,被切割成子集,不同子集作为不同device的输入(device指gpu,上面的model都是一样的)。然后计算的loss一般放到nn.DataParallel()的output_device设备上,导致该设备内存占用相比更大。

代码:

2、多进程封装方式

(1)torch.multiprocessing里面的process,这种方式有点类似在终端执行两次python train.py &。这里是要加&符号的。

(2)使用torch.distributed.launch

在终端启用。每个torch.distributed.launch会启动n个进程,并给每个进程一个--local_rank=i的参数。有多少台机器:--nnodes;当前是哪台机器:--node_rank;每台机器有多少个进程:--nproc_per_node;高级参数(多机模式)通讯的address和通讯的port

(3)torch.multiprocessing.spawn

mp.spawn和process有点类似,如下

一、实验目的和实验内容

  • 实验目的

了解并掌握分布式算法中的集体通信和参数聚合策略

  • 实验内容
  1. 了解并尝试集体通信中常用的消息传递接口 (Reduce, AllReduce, Gather, AllGather, Scatter, etc.)
  2. 基于至少两种集体通信原语实现梯度/参数平均的聚合方法,比较通信时间开销,并分析不同聚合策略对模型性能的影响。
  3. 在框架下设置瓶颈节点,讨论瓶颈节点对集体通信的影响。
  • 实验要求
  1. 已提供了基于数据并行的模型代码
  2. 通过前文讲解的内容,实现collective communication下的参数/梯度聚合
  3. 在框架下设置瓶颈节点,并讨论瓶颈节点对通信的影响
  4. 基于至少2种通信原语实现梯度/参数平均的聚合方法,并比较它们的通信时间开销

1.1实验介绍

本次实验是在单机模拟分布式系统,通过多进程来模拟多节点,使用Pytorch的DDP模块来进行分布式任务。

创建DDP模块,首先正确设置过程组,初始化分布式环境。

Init_process确保每个进程都可以使用相同的 IP 地址和端口通过主机进行协调,包括设置

torch.distributed支持点对点通信和集合通信,数据从一个进程到另一个进程的传输称为点对点通信,这些是通过send和recv函数或其直接对应部分isend和irecv实现的。

与点对点通信相反,集合允许跨组中所有进程的通信模式。Pytorch提供4中运算符和7个集合体。

任务是通过pytorch的通信原语来实现参数的广播、收集和聚合。

二、实验设计

2.1对model实现参数的广播、收集和聚合

(1)对不同进程的model进行同一参数的初始化

使用boardcast来操作,0代表进程rank 0,就是第一个进程的model参数复制到其他进程的model里。

(2)训练过程里,还需要对不同进程的参数进行聚合,例如使用all_reduce来聚合模型的参数。

这里的实现主要是对grad做的,采用SUM运算符。

对于参数聚合,处理all_reduce以外,采用reduce+boardcast实现all_reduce相同的功能。

通信原语

Rank数

Train_time

All_reduce

2

12.083552837371826

Reduce+boardcast

2

12.250021696090698

All_reduce

1

14.21995210647583

Reduce+boardcast

1

14.708715438842773

2.2设置瓶颈节点

对rank=1进程设置sleep,查看运算时间

瓶颈节点实验

参数聚合方式

Sleep

Exp_name

All_reduce

Rank 0

Rank 1

Train_time

1

10.395909786224365

2

Rank启动时sleep 0.001秒

12.336158275604248

3

每次聚合时sleep 0.01秒

36.61159658432007

4

每次loss.backward sleep 6s

2.2.1 聚合时间瓶颈

为了查看一次参数聚合不同时间的影响,我打印了聚合前后的时间。

Rank1 使用sleep 0.5s

正常聚合时间是:

2.2.2 梯度计算时间瓶颈

聚合操作需要考虑所有rank的梯度,这一过程里面sleep,根据pytorch的提示应该是会wait的。

对rank1的loss.backward后加上sleep可以看见,

再打印聚合参数完成的时间:

通过上图可以看见,参数聚合的过程是需要所有rank一同时间的。前面的loss. Backward的计算梯度过程时间的差异会体现在模型参数聚合过程。

可以理解,因为想loss计算、梯度计算和梯度更新,在pytorch里面都是针对当前进程的。

Pytorch---DDP使用相关推荐

  1. pytorch 指定卡1_[原创][深度][PyTorch] DDP系列第一篇:入门教程

    引言 DistributedDataParallel(DDP)是一个支持多机多卡.分布式训练的深度学习工程方法.PyTorch现已原生支持DDP,可以直接通过torch.distributed使用,超 ...

  2. [深度][PyTorch] DDP系列第三篇:实战与技巧

    [深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑 ...

  3. pytorch DDP加速之gradient accumulation设置

    pytorch DDP 参考:https://zhuanlan.zhihu.com/p/250471767 GPU高效通信算法-Ring Allreduce: https://www.zhihu.co ...

  4. PyTorch DDP

    正在郁闷呢 jetson nx 的torchvision安装~~ 自带就剩5g 想弄到ssd 项目中的 venv中又 cuda.h没有... 明明已经装好什么都对 算了说今天主题 啊对 还是搬运啊 学 ...

  5. Pytorch DDP分布式数据合并通信 torch.distributed.all_gather()

    文章目录 1. 官网介绍 2. all_gather()不进行梯度传播,用于模型test或eval状态 3. all_gather()需要进行梯度传播,用于模型train状态 4. 相关链接 1. 官 ...

  6. PyTorch 多机多卡训练:DDP 实战与技巧

    作者丨996黄金一代@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/250471767 编辑丨极市平台 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又 ...

  7. Pytorch中的DDP

    一. 概览 DDP的原理? 在分类上,DDP属于Data Parallel.简单来讲,就是通过提高batch size来增加并行度. 为什么快? DDP通过Ring-Reduce的数据交换方法提高了通 ...

  8. Pytorch分布式训练/多卡训练(二) —— Data Parallel并行(DDP)(2.2)(代码示例)(BN同步主卡保存梯度累加多卡测试inference随机种子seed)

    DDP的使用非常简单,因为它不需要修改你网络的配置.其精髓只有一句话 model = DistributedDataPrallel(model, device_ids=[local_rank], ou ...

  9. PyTorch如何加速数据并行训练?分布式秘籍大揭秘

    本文转载自机器之心. 选自arXiv 作者:Shen Li等 机器之心编译 参与:小舟.杜伟 PyTorch 在学术圈里已经成为最为流行的深度学习框架,如何在使用 PyTorch 时实现高效的并行化? ...

  10. PyTorch 多机多卡训练:分布式实战与技巧

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx DistributedDataParallel(DDP)是一个支持多机多卡.分布式训练的深度学 ...

最新文章

  1. 区块链相关论文研读4: Monoxide异步共识组
  2. AIX下两个常用命令
  3. 给批量用户设磁盘配额
  4. Linux Bash变量-数值运算与运算符
  5. 推出了底层代码chatbot开发工具,Rulai获650万美元融资
  6. IDEA 快捷键终极大全
  7. CF802O-April Fools‘ Problem(hard)【wqs二分,优先队列】
  8. 后台通过request.setAttribute向前台传值,前台如何去获取其中的对象或属性值
  9. Linux/Ubuntu 单机配置Hbase
  10. matlab 工业相机 曝光时间_工业相机与普通相机的差别
  11. 诡异的 BOM 字符 \ufeff
  12. 006--C++动态内存(简介)
  13. Centos7安装Informix
  14. QQ空间自动点赞脚本1
  15. zoom 更改安装位置_如何以Zoom更改会议主持人
  16. excel2013超链接进不去,提示“您的组织策略不允许...”
  17. 文字环形旋转加载js特效
  18. mysql创建子用户代码_mysql创设用户及受权
  19. J.A.R.V.I.S.
  20. 360手机怎样更新系统版本android,360手机N5迎来安卓7.0稳定版升级

热门文章

  1. 零基础学日语资料附经验分享
  2. 电脑使用技巧提升篇7:两种方法给U盘加密
  3. 龙芯2号处理器,龙芯2K1000芯片参数
  4. 《(数学篇)》 复数运算
  5. 博士毕业评上副教授后,我打算直接躺平!
  6. 【SQL Server】列转行 STUFF 函数
  7. some words from website
  8. “黑客”必备书籍 你值得拥有!
  9. AdSense 介绍
  10. 程序员该如何说话?做人?做事?