踩坑记

修改网络模块或者获得模型的某个参数

解决方法: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不一,数据长度也不一,导致进程自己死锁,无法继续进行

解决方式:自行写通讯结构