- Pytorch 的多 GPU 处理接口是
torch.nn.DataParallel(module, device_ids)
,其中module
参数是所要执行的模型,而device_ids
则是指定并行的 GPU id 列表。 - 而其并行处理机制是,首先将模型加载到主 GPU 上,然后再将模型复制到各个指定的从 GPU 中,然后将输入数据按 batch 维度进行划分,具体来说就是每个 GPU 分配到的数据 batch 数量是总输入数据的 batch 除以指定 GPU 个数。每个 GPU 将针对各自的输入数据独立进行 forward 计算,最后将各个 GPU 的 loss 进行求和,再用反向传播更新单个 GPU 上的模型参数,再将更新后的模型参数复制到剩余指定的 GPU 中,这样就完成了一次迭代计算。所以该接口还要求输入数据的 batch 数量要不小于所指定的 GPU 数量。
那么谈谈我遇到的问题:
torch.nn.DataParallel()
数据量太大,算力又不足,寻思gpu并行加速,加入以下代码。
model = torch.nn.DataParallel(model)
model.cuda()
不幸的是,没加速进程,反而出现以下bug。
ValueError: only one element tensors can be converted to Python scalars
我点击错误提示 loss.item(),通过debug我发现它的tensor dimension为GPU并行的个数。
但是,从最开始的理论来看,loss应该是要回传主gpu上,应该是最终的一个loss,怎么会出现多个loss呢?
This is my problem。
解决办法:我发现只要在model后面加上module就能正常运行。