【天天新视野】多卡训练
1、前言
近期做到的一些工作涉及到多卡训练,不得不感慨深度学习真的是一个烧钱的活,顺便记录一下,主要记录用法,不涉及实现原理。
2、单机多卡并行
官方DDP文档:
(相关资料图)
GETTING STARTED WITH DISTRIBUTED DATA PARALLEL
Github 仓库:
Github 中文文档
GETTING STARTED WITH DISTRIBUTED DATA PARALLEL
DataParallel
使用 nn.Dataarallel() 将模型变换一下,一行搞定
model = nn.DataParallel(model)
根据
为方便说明,我们假设模型输入为(32, input_dim),这里的 32 表示batch_size,模型输出为(32, output_dim),使用 4 个GPU训练。nn.DataParallel起到的作用是将这 32 个样本拆成 4 份,发送给 4 个GPU 分别做 forward,然后生成 4 个大小为(8, output_dim)的输出,然后再将这 4 个输出都收集到cuda:0上并合并成(32, output_dim)。可以看出,nn.DataParallel没有改变模型的输入输出,因此其他部分的代码不需要做任何更改,非常方便。但弊端是,后续的loss计算只会在cuda:0上进行,没法并行,因此会导致负载不均衡的问题。
针对负载不均衡问题,一个缓解的方法是将 loss 放入模型内部计算,即在 forward 的时候计算 loss。
DistributedDatarallel
分布式数据并行方法,通过多进程实现。
1、从一开始就会启动多个进程(进程数等于GPU数),每个进程独享一个GPU,每个进程都会独立地执行代码。这意味着每个进程都独立地初始化模型、训练,当然,在每次迭代过程中会通过进程间通信共享梯度,整合梯度,然后独立地更新参数。2、每个进程都会初始化一份训练数据集,通过DistributedSampler函数实现,即同样的模型喂进去不同的数据做训练,也就是所谓的数据并行。3、进程通过local_rank变量来标识自己,local_rank为0的为master,其他是slave。这个变量是torch.distributed包帮我们创建的,使用方法如下:
import argparse parser = argparse.ArgumentParser()parser.add_argument("--local_rank", type=int, default=-1)args = parser.parse_args()
运行代码
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 train.py
其中,nnodes 表示节点数量,单机,即为1,nproc_per_node 为每个节点的进程数量,与 GPU 数量一致。
模型保存与加载TODO
3、遇到的问题
1、DistributedDataarallel 方法,有时候会出现进程卡死的问题,现象上即为显卡的利用率卡在 100%,未启动进程组,根据tjds排查是IO 虚拟化(也称为 VT-d 或 IOMMU)启用了ACS导致,具体原因参考 故障排除——NCCL2.16.2 文档。
方法一:排查原因是BIOS里IO虚拟化(VT-d)默认启动了PCI访问控制服务(ACS)导致GPU间无法直接通过P2P方式通信,需在BIOS关闭此功能,具体操作参考 tjds
1、 查看ACS是否开启执行 lspci -vvv | grep -I acsctl 如果有显示SrcValid+说明已启用ACS功能2、 添加iommu=pt参数到grub(此步骤应该可以跳过)编辑/etc/default/grub文件添加iommu=pt,再执行update-grub更新grub文件3、 关闭BIOS里ACS功能重启操作系统开机时按 del 进入 BIOS 关闭 ACS 功能,不关 VT-d 只关闭 ACS 功能,具体路径:Path: Advanced -> Chipset Configuration -> North Bridge -> IIO Configuration -> Intel VT for Directed I/O (VT-d) -> ACS Control -> Enable / Disable.4、 检查ACS是否关闭执行lspci -vvv | grep -I acsctl 如果全显示SrcValid-说明已关闭ACS功能
方法二:仍然使用 ‘nccl‘ 后端,禁用 GPU 的 P2P 通信。
torch.distributed.init_process_group(backend="ncll")
NCCL_P2P_DISABLE=1 CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py
嫌麻烦可以写入 bashrc 环境变量。
方法三:更换后端为 ‘gloo’ , shell命令运行程序,纵享丝滑。
torch.distributed.init_process_group(backend="gloo")
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py
缺点就是 gloo 的通信在我用的时候要比 nccl 慢很多。
2、如果训练过程中使用了 Sampler 进行数据分发, dataloader 的 shuffle 不能设置为 True。
3、dataloader 设置 batch_size 时,注意尽量保证每次循环每张卡至少可以分到一个 sample,不然有时候会因某张卡等待输入卡死。
4、我在训练时,dataloader的 num_works 通过 CPU 帮助 GPU 加载数据能够提升 GPU 利用率,倒是没遇到报错。
5、dataloader 的 pin_memory (锁页内存) 按道理是可以锁住一部分内存,减少 CPU 内存拷贝的,但是我用的时候会极大降低 GPU 利用率,此处存疑。
待更新ing
关键词:
相关阅读
-
【天天新视野】多卡训练
1、前言近期做到的一些工作涉及到多卡训练,不得不感慨深度学习真的 -
参观请提前预约!武汉博物馆端午假期正...
【来源:九派新闻综合】各位观众朋友们:2023年端午节假期将至,武汉博 -
江苏首届!常州上榜的是
近日,江苏省政府发布《关于公布首届江苏专利奖的决定》,授予一种多功 -
公积金停缴了还能贷款吗?申请贷款具备...
公积金停缴了还能贷款吗?申请贷款具备条件是什么?随社保网小编来看看 -
这家夫妻店刚扭亏就想IPO,如此急匆匆融...
这家夫妻店刚扭亏就想IPO,如此急匆匆融资为啥?,中兴,上市,融资,ipo, -
描绘健康筑梦想 与爱同行向未来——新...
(本网记者李晓芳)6月19日下午,新华保险贵州分公司借助2023年度“新华 -
快看点丨视频|山东临朐:留学生做“艾...
近日,来自潍坊学院的摩洛哥、土耳其、尼日利亚等国家的11名外国留学生 -
一个殡仪馆女工的手记电影_一个殡仪馆女...
1、您要的资源正在发送,请稍后。2、如需帮助请hi我。3、感觉满意望及 -
618收官 小红书直播“特色不特”
随着各大电商平台618的正式收官,又到了总结战局的时刻。6月19日,小红 -
“昆明市传统地方戏曲和曲艺传承展演中...
昆明信息港讯6月21日上午,“昆明市传统地方戏曲和曲艺传承展演中心... -
焦点消息!省市区三级联动“特种设备安...
福州新闻网6月21日讯(记者朱丽萍周昊)6月是全国“安全生产月”,6... -
当前播报:北京通报4起违反中央八项规定...
6月21日,北京市纪委监委驻市国资委纪检监察组通报了4起违反中央八项规 -
睿昂基因(688217.SH):公司的白血病15种...
格隆汇6月21日丨有投资者向睿昂基因(688217 SH)提问:请问公司白血病15 -
睿昂基因(688217.SH):公司暂未涉及遗传...
格隆汇6月21日丨有投资者向睿昂基因(688217 SH)提问:请问公司有涉及遗 -
孔孟之乡的端午习俗|播资讯
□戴永夏端午又称“端五”“端阳”等,是我国四大传统节日之一。在... -
中新天津生态城确定中新合作三年行动计划
近日,中新天津生态城管委会与新加坡国家发展部生态办共同制定了《中新 -
南京聚隆接受多家机构调研 将加快产品...
6月16日,南京聚隆(300644)发布投资者关系活动记录表,公司于当日接 -
遗产继承的八个常见误区!
近日浙江绍兴诸暨当地媒体发布的一则寻找继承人的公示引发公众对遗产继 -
沈阳铁西:端午打卡新坐标 “向阳院”...
端午节,沉淀着民族精神和文化魅力。铁西区兴顺街道繁荣社区、繁荣南社 -
当前动态:接到一个陌生电话,普定一男子...
顺风耳一个有想法的公众号!“感谢你们的辛苦工作,真没想到,我被...