torch.nn.DataParallel的一些tip(持续更新)

为什么要用dataparallel?

加速训练?原理是什么?
最根本的原因是加大了batch_size,所以加速了训练。原因是我们在用GPU训练模型的时候,因为模型本身占现存就很大了,比方说BERT,那么在一次forward的过程中,如果batch_size过大,那么单块板子上计算图就构建地太大了,因此有可能炸显存,所以也就限制了batch_size的大小。

而dataparallel的原理就是把原先的model replicate多份,每份都是一个副本,然后在forward的时候,就可以一次性传入更大的batch_size。
比方说,原先模型在单卡上只能最多feed 16 batch_size的样本,现存就上限了;现在用dataparallel把model复制到3块板子上,那就可以forward 16*3 也就是48 batch_size的样本,这些样本会被均分为三份,分别给三块板子上的那三个parallel model(如下图);
我们都知道,一个batch 的loss其实就是把batch里面所有单个样本的loss取avg,所以我们把一个batch 48分为更小的三份,每份16,最后在三块板子上的loss再取一次avg,这和直接forward 48 batch_size其实相差不大。
在这里插入图片描述
虽然也有人做过实验,发现均分到多块板子上,每块板子算出来的loss其实会有比较大的差距的,一般如果你的实验受batch_size影响比较大(比方说metric learning),那么就最好别用dataparallel。

其他tips:

  • 被封装成dataparallel的model,forward的时候最后就返回loss,尽量不要返回额外的feature、prediction,这样会导致主卡和其他几块副卡负载不均衡。还可以通过其他方法缓解这个问题:
    和nn.DataParallel说再见

  • 有些情况下,如果你输入的batch不是n_gpu的倍数,那么会报错;同理,你的forward如果返回的类型不是cuda上的tensor,或者tensor的除batch_size以外的维度不一致,那么也会报错(多卡的结果不能gather到一起)。所以尽量推荐在eval的时候不要用dataparallel去预测,因为有时候我们可能想在test的时候获得模型的预测结果,而预测的返回内容不一定会是tensor,而且sample的batch_size也不能完全做到是n_gpu的倍数。
    可以用:
    在这里插入图片描述
    在pred或者eval的时候还原回单卡model

  • 保存的时候注意保存主model:
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
torch.nn.parallel.DataParallel是PyTorch中的一个模块,用于在单个节点上进行多GPU数据并行训练。它能够自动将输入数据划分为多个小批次,并将这些小批次分发到不同的GPU上进行计算。每个GPU上都有一个模型副本,每个副本都独立地计算损失和梯度,并将梯度聚合后进行参数更新。 然而,torch.nn.parallel.DataParallel有一些限制,例如需要在每个GPU上有足够的显存来存储模型和梯度,因为它会复制模型到每个GPU上。此外,它还要求输入数据能够被划分为多个小批次,并且每个小批次的大小是相同的。 相比之下,torch.nn.parallel.DistributedDataParallel是一个更高级的模块,可以在单节点或多节点上进行多进程的分布式训练。每个模型副本由独立的进程控制,可以在不同的机器上运行。它不需要将模型复制到每个GPU上,而是通过进程间通信来在各个进程之间共享模型参数和梯度。这样可以更好地利用多个GPU和多个机器的计算资源,提高训练速度。 值得注意的是,torch.nn.parallel.DistributedDataParallel的初始化和使用方法与torch.nn.parallel.DataParallel略有不同,需要进行一些额外的设置和配置。但是,对于单节点的多GPU数据并行训练,torch.nn.parallel.DistributedDataParallel已被证明比torch.nn.parallel.DataParallel更快。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Pytorchtorch.nn.parallel.DistributedDataParallel](https://blog.csdn.net/baidu_35120637/article/details/110816619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [torch.nn.parallel.DistributedDataParallel](https://blog.csdn.net/weixin_45216013/article/details/125472676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值