pytorch中多GPU的batch_size问题

KeyError: Caught KeyError in replica 0 device, 或者ValueError: Caught ValueError in replica 0 on device 0.都是因为batch_size没有设好。
在端到端的语音中,一个语句就是一个输入,total即总的输入就是text中的行数,用wc -l text,就可以看到了。
多个gpu训练时,每个gpu上的负载时batch_size / n_gpu
训练迭代的次数为total / batch_size
但是肯定会有余数,要注意的是不要让余数恰好被n_gpu - 1整除。
要注意的一点就是每个gpu上分的数据可以是不相等的,好比batch_size = 13, n_gpu = 4,这样是可以的,不一定要一定整除,我试验了一下发现是没问题的。但是batch_size不能等于3的倍数,好比9,这样就会导致全部分到前3个gpu上,第4个gpu上分不到数据,就会报keyerror 或者value error。
也就是说上面的余数和batch_size不要恰好等于小于你总调用的gpu个数的gpu的倍数,比较绕口。举例就是,好比余数或者batch_size为m,gpu个数为n, 要保证下面的式子。伪代码,见谅。

for i <  n:
	m % i != 0

不过一般为了保证每个gpu负载均衡,batch_size要设成n_gpu的倍数,报错时可以计算一下余数,然后调整bathc_size的大小,保证余数的大小满足上面的伪代码。
runtime error一般都是因为batch_size设的过大,gpu显存不够了,调小一点就好了。
今天遇到runtime error,因为我并行模型时并行了两次,代码重复写了。

也可以在加载数据时,把drop_last设为True,
当你的整个数据长度不能够整除你的batchsize,选择是否要丢弃最后一个不完整的batch,默认为False。
2022.4.27
使用dataparallel时会出现上述问题,使用分布式数据并行可以自己重写一下给每个gpu分配batch的函数,可以避免上面的问题,也不用考虑batchsize和gpu的关系了。推荐采用分布式。

你可能感兴趣的:(python,gpu)