1.DataParallel

DataParallel更易于使用(只需简单包装单GPU模型)。

model = nn.DataParallel(model)

它使用一个进程来计算模型参数,然后在每个批处理期间将分发到每个GPU,然后每个GPU计算各自的梯度,然后汇总到GPU0中进行求平均,然后由GPU0进行反向传播更新参数,然后再把模型的参数由GPU0传播给其他的GPU。

特点:
(1)broadcast 的是模型的参数,因此速度慢,效率低
(2)操作简单

因此通信很快成为一个瓶颈,GPU利用率通常很低。nn.DataParallel要求所有的GPU都在同一个节点上(不支持分布式),而且不能使用Apex进行混合精度训练。

https://zhuanlan.zhihu.com/p/113694038

1.DistributedDataParallel支持模型并行,而DataParallel并不支持,这意味如果模型太大单卡显存不足时只能使用前者;
2.DataParallel是单进程多线程的,只用于单机情况,而DistributedDataParallel是多进程的,适用于单机和多机情况,真正实现分布式训练;
3.DistributedDataParallel的训练更高效,因为每个进程都是独立的Python解释器,避免GIL问题,而且通信成本低其训练速度更快,基本上DataParallel已经被弃用;
4.必须要说明的是DistributedDataParallel中每个进程都有独立的优化器,执行自己的更新过程,但是梯度通过通信传递到每个进程,所有执行的内容是相同的;

2. DistributedDataParallel

https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html#torch.nn.parallel.DistributedDataParallel
官网链接

main_proc = Truedevice = torch.device("cuda")is_distributed = os.environ.get("LOCAL_RANK")  # If local rank exists, distributed envprint("distributed: ", is_distributed)if is_distributed:device_id = args.local_ranktorch.cuda.set_device(device_id)print(f"Setting CUDA Device to {device_id}")os.environ['NCCL_IB_DISABLE'] = '0'dist.init_process_group(backend="nccl")print("distributed finished........")main_proc = device_id == 0  # Main process handles saving of models and reportingif is_distributed:train_sampler = torch.utils.data.distributed.DistributedSampler(train_set, shuffle=True) #train_sampler = db2sampler(SequentialSampler(train_set), batch_size, False, bucket_size_multiplier=len(train_set)//batch_size) else:train_sampler = torch.utils.data.RandomSampler(train_set)#train_sampler = db1sampler(SequentialSampler(train_set), batch_size, False, bucket_size_multiplier=len(train_set)//batch_size)train_loader = torch.utils.data.DataLoader(train_set, batch_size, sampler=train_sampler, num_workers=args.workers, collate_fn = pad_collate)valid_loader = torch.utils.data.DataLoader(valid_set, valid_batch_size, num_workers=args.workers, collate_fn = pad_collate)if is_distributed:WAP_model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(WAP_model)  #解决了batchnormal的问题if is_distributed:WAP_model = torch.nn.parallel.DistributedDataParallel(WAP_model, device_ids=[device_id],find_unused_parameters=True)for eidx in range(max_epochs):n_samples = 0ud_epoch = time.time()if is_distributed:train_sampler.set_epoch(epoch=eidx) for i, (x, y,x_idx, x_name) in enumerate(train_loader):WAP_model.train()

注意:在 DataParallel 中,batch size 设置必须为单卡的 n 倍,但是在 DistributedDataParallel 内,batch size 设置于单卡一样即可
比DataParallel,DistributedDataParallel训练时间缩减了好几倍。
一定要用DistributedDataParallel

if is_distributed:train_sampler.set_epoch(epoch=eidx)

https://zhuanlan.zhihu.com/p/97115875

pytorch(分布式)数据并行个人实践总结

坑:
(1)DistributedDataParallel 内,batch size 设置于单卡一样即可

DataParallel 和 DistributedDataParallel 的区别和使用方法相关推荐

  1. python while if 区别_对python中for、if、while的区别与比较方法

    如下所示: if应用举例: #if 若条件成立,只执行一次 #if 条件:如果条件成立,执行条件后的代码块内容,不成立,直接跳过代码块 #判断如果年龄age小于18,输出未成年 #=一个等号表示赋值的 ...

  2. oracle怎么查别的库,ORACLE_SID、实例名和数据库名的区别及查看方法

    ORACLE_SID.实例名和数据库名的区别及查看方法 ORACLE_SID.实例名和数据库名的区别及查看方法 1.ORACLE_SID.实例名(SID)和数据库名的区别 操作系统环境变量(ORACL ...

  3. js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法

    setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...

  4. cont char *p 和 char* const p 区别及记忆方法

    /* cont char *p 和 char* const p 区别及记忆方法 const char *p = "hello"; 和 char const *p = "h ...

  5. Python中NaN、nan和NAN的区别及使用方法

    Python中NaN.nan和NAN的区别及使用方法 Python中的NaN(Not a Number)是一个特殊的浮点数值,用于表示非数值型计算结果或无限大的运算结果,常用于科学计算.数据分析等领域 ...

  6. PS中色相饱合度/可选颜色/色彩平衡/曲线的区别和运用方法详解

    http://www.jb51.net/photoshop/374517.html PS中色相饱合度/可选颜色/色彩平衡/曲线的区别和运用方法详解 整体思路: 1.使用颜色混合模式营造照片基调. 2. ...

  7. 对象浅拷贝和深拷贝有什么区别与实现方法

    在JS中,除了基本数据类型,还存在对象.数组这种引用数据类型. 基本数据类型有number,string,boolean,null,undefined五类. 基本数据类型 名值存储在栈内存中 当b=a ...

  8. 博士论文查重与普通的区别及其处理方法

    在论文中,相对于本科.专科这种简单的毕业论文来说,博士论文可谓是其中最难的.博士论文对于学术成果非常看重,如果一篇好文章运用的好的话,会给其他人甚至后人带来很大的影响,其价值也是非常大的.下面早检测小 ...

  9. jquery遍历之parent()和parents()的区别及parentsUntil()方法详解

    转正于:http://www.jb51.net/article/44003.htm 没有图片,请看上面的原文 这篇文章主要介绍了jquery遍历之parent()和parents()的区别及paren ...

最新文章

  1. 任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
  2. AI Frontiers | 微软首席 AI 科学家邓力演讲:口语对话系统的分类及三代演变
  3. navicate 导出批量插入语句
  4. jQuery EasyUI API 中文文档 - 进度条
  5. PL/SQL之JOB用法 (定时跑数据)
  6. 程序员为什么老得快_这段 Python 代码让程序员赚 300W,公司已确认!网友:神操作!...
  7. 【总结】C++逻辑与或
  8. VS2022编译项目出现““csc.exe”已退出,代码为 -1073741819”的错误解决办法
  9. Thrift原理简析
  10. 人人商城生成app教程_人人商城打包app教程 方法 hbuilder打包支持支付宝微信原生支付...
  11. HTML5-打字游戏
  12. spring bean生命周期源码剖析
  13. c语言 获取硬盘序列号,获取硬盘序列号的C++代码
  14. 九宫格日记 2017年12月19日(周二)
  15. 隐藏header html,html5 header标签 css3布局教程
  16. 计算机ppt上超链接咋设置,ppt查看器_ppt图片链接接怎么设置打开方式是图片查看器?_ppt超链接打开方式...
  17. Pycharm远程调试踩坑:[Errno 2] No such file or directory Process finished with exit code 2
  18. 计算机性能检查方法,测试电脑性能的方法步骤详解
  19. html table 内外边框,HTML_TABLE内外边框
  20. ADAMS-Simulink联合仿真-零基础(一)

热门文章

  1. .iml文件_jetbrains误删maven 项目.iml文件后的处理方法
  2. flexcell控件 许可证信息没有找到_报表控件 ActiveReports 全面迎来 .Net Core 时代
  3. qt使用样式表来设置不规则按钮
  4. api.php phpcms,phpcms程序api怎么写接口
  5. 机械系统计算机控制试卷及答案,机械系统设计试题及答案
  6. win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
  7. c语言 手动实现sizeof,sizeof究竟是怎样实现的?
  8. a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. python3中的int类型占64位,有没有什么办法来强制Python来使用64位整数的Windows?
  10. 计算机网络通信中常用的检错码,4月全国高等教育自学考试计算机网络与通信试题及答案解析...