DataParallel 和 DistributedDataParallel 的区别和使用方法
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 的区别和使用方法相关推荐
- python while if 区别_对python中for、if、while的区别与比较方法
如下所示: if应用举例: #if 若条件成立,只执行一次 #if 条件:如果条件成立,执行条件后的代码块内容,不成立,直接跳过代码块 #判断如果年龄age小于18,输出未成年 #=一个等号表示赋值的 ...
- oracle怎么查别的库,ORACLE_SID、实例名和数据库名的区别及查看方法
ORACLE_SID.实例名和数据库名的区别及查看方法 ORACLE_SID.实例名和数据库名的区别及查看方法 1.ORACLE_SID.实例名(SID)和数据库名的区别 操作系统环境变量(ORACL ...
- js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...
- cont char *p 和 char* const p 区别及记忆方法
/* cont char *p 和 char* const p 区别及记忆方法 const char *p = "hello"; 和 char const *p = "h ...
- Python中NaN、nan和NAN的区别及使用方法
Python中NaN.nan和NAN的区别及使用方法 Python中的NaN(Not a Number)是一个特殊的浮点数值,用于表示非数值型计算结果或无限大的运算结果,常用于科学计算.数据分析等领域 ...
- PS中色相饱合度/可选颜色/色彩平衡/曲线的区别和运用方法详解
http://www.jb51.net/photoshop/374517.html PS中色相饱合度/可选颜色/色彩平衡/曲线的区别和运用方法详解 整体思路: 1.使用颜色混合模式营造照片基调. 2. ...
- 对象浅拷贝和深拷贝有什么区别与实现方法
在JS中,除了基本数据类型,还存在对象.数组这种引用数据类型. 基本数据类型有number,string,boolean,null,undefined五类. 基本数据类型 名值存储在栈内存中 当b=a ...
- 博士论文查重与普通的区别及其处理方法
在论文中,相对于本科.专科这种简单的毕业论文来说,博士论文可谓是其中最难的.博士论文对于学术成果非常看重,如果一篇好文章运用的好的话,会给其他人甚至后人带来很大的影响,其价值也是非常大的.下面早检测小 ...
- jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
转正于:http://www.jb51.net/article/44003.htm 没有图片,请看上面的原文 这篇文章主要介绍了jquery遍历之parent()和parents()的区别及paren ...
最新文章
- 任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
- AI Frontiers | 微软首席 AI 科学家邓力演讲:口语对话系统的分类及三代演变
- navicate 导出批量插入语句
- jQuery EasyUI API 中文文档 - 进度条
- PL/SQL之JOB用法 (定时跑数据)
- 程序员为什么老得快_这段 Python 代码让程序员赚 300W,公司已确认!网友:神操作!...
- 【总结】C++逻辑与或
- VS2022编译项目出现““csc.exe”已退出,代码为 -1073741819”的错误解决办法
- Thrift原理简析
- 人人商城生成app教程_人人商城打包app教程 方法 hbuilder打包支持支付宝微信原生支付...
- HTML5-打字游戏
- spring bean生命周期源码剖析
- c语言 获取硬盘序列号,获取硬盘序列号的C++代码
- 九宫格日记 2017年12月19日(周二)
- 隐藏header html,html5 header标签 css3布局教程
- 计算机ppt上超链接咋设置,ppt查看器_ppt图片链接接怎么设置打开方式是图片查看器?_ppt超链接打开方式...
- Pycharm远程调试踩坑:[Errno 2] No such file or directory Process finished with exit code 2
- 计算机性能检查方法,测试电脑性能的方法步骤详解
- html table 内外边框,HTML_TABLE内外边框
- ADAMS-Simulink联合仿真-零基础(一)
热门文章
- .iml文件_jetbrains误删maven 项目.iml文件后的处理方法
- flexcell控件 许可证信息没有找到_报表控件 ActiveReports 全面迎来 .Net Core 时代
- qt使用样式表来设置不规则按钮
- api.php phpcms,phpcms程序api怎么写接口
- 机械系统计算机控制试卷及答案,机械系统设计试题及答案
- win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
- c语言 手动实现sizeof,sizeof究竟是怎样实现的?
- a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...
- python3中的int类型占64位,有没有什么办法来强制Python来使用64位整数的Windows?
- 计算机网络通信中常用的检错码,4月全国高等教育自学考试计算机网络与通信试题及答案解析...