Pytorch分布式训练踩坑
踩坑记
修改网络模块或者获得模型的某个参数
解决方法:model后面添加module
获取到网络模型后,使用并行方法,并将网络模型和参数移到GPU上。注意,若需要修改网络模块或者获得模型的某个参数,一定要在model后面加上.module,否则会报错,比如:
model.img_size 要改成 model.module.img_size
最后一个batch卡死
现象:PyTorch 训练时在第一个 epoch 的最后一个 batch 卡死
原因:Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids)
,该接口还要求输入数据的 batch 数量要不小于所指定的 GPU 数量。另根据官网的解释和注释 (The batch size should be larger than the number of GPUs used.),batch的数量会均分到每块GPU上进行处理,因此要保证一个整数的关系。
解决方法:一定要注意在使用多块 GPU 训练时,注意 batch_size
的取值,避免出现最后一个 batch 的实际size小于所指定的 GPU 数量的情况。
模型训练不动了
现象:显卡利用率100%,但是模型不动了
原因:在模型训练时使用了一些同步原语,但是,模型的训练iter不一,数据长度也不一,导致进程自己死锁,无法继续进行
解决方式:自行写通讯结构
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Thyssen Wen's Blog!