Pytorch:关于nn.dataParallel我所踩过的坑

报错一:module must have its parameters and buffers on device cuda:1 (device_ids[0]) but found one of them on device: cpu

假设有4张卡,他的运行机制是

  1. 首先把所有权重与tensor都先加载到第一张卡
  2. 然后通过第一张卡在分发给其余的卡

出现这个原因是我刚开始定义模型的时候直接调用了:

m = torch.nn.DataParallel(m, device_ids=[1,0,2,3])

这行代码应该代表了第二步,应该改正为:

m = m.to('cuda:1')
m = torch.nn.DataParallel(m, device_ids=[1,0,2,3])

报错二:RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:1! (when checking arugment for argument index in method wrapper_index_select)

这个报错的大概意思说你的模型内部又新定义了一个tensor,并且它没有与计算图关联,dataParallel不会把这个tensor分发给其他的卡,但是我一开也意识到了这点,所以给这个tensor定义了 device=‘cuda:1’,于是就有了上面的error,如果没有这个操作,那么就与报错一相同。

修改方法:
把新创建的device的设置为 可以被dataParallel分发的device(如demo),比如:

new_tensor = torch.arange(10, device=demo.device)

问题一:速度变慢

很多同学发现在进行多GPU运算时,程序花费的时间反而更多了,这其实是因为你的batch_size太小了,因为torch.nn.DataParallel()这个函数是将每个batch的数据平均拆开分配到多个GPU上进行计算,计算完再返回来合并。这导致GPU之间的开关和通讯过程占了大部分的时间开销。

可以使用watch -n 1 nvidia-smi这个命令来查看每1s各个GPU的运行情况,如果发现每个GPU的占用率均低于50%,基本可以肯定你使用多GPU计算所花的时间要比单GPU计算花的时间更长了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HanZee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值