- 报错:
RuntimeError: Attempting to deserialize object on CUDA device 2 but torch.cuda.device_count() is 1 - 原因:在使用Pytorch加载模型时报错。加载的模型是用两个GPU训练的,而加载模型的电脑只有一个GPU,所以会出错。
- 解决:
model = torch.load(model_path)
改为:model = torch.load(model_path, map_location='cuda:0')
如果是4块到2块:就把map_location改为:map_location={'cuda:1': 'cuda:0'}
- 报错:
PyTorch多GPU的处理机制
使用多GPU时,应该记住pytorch的处理逻辑是:
1.在各个GPU上初始化模型。
2.前向传播时,把batch分配到各个GPU上进行计算。
3.得到的输出在主GPU上进行汇总,计算loss并反向传播,更新主GPU上的权值。
4.把主GPU上的模型复制到其它GPU上。
- nn.Module.cuda() 和 Tensor.cuda() 的作用效果的区别
无论是对于模型还是数据,cuda()函数都能实现从CPU到GPU的内存迁移,但是他们的作用效果有所不同。- 对于nn.Module:
model = model.cuda()
model.cuda()
上面两句能够达到一样的效果,即对model自身进行内存迁移。
- 对于Tensor:
和nn.Module不同,调用tensor.cuda()只是返回这个tensor对象在GPU内存上的拷贝,而不会对自身进行改变。因此必须对tensor进行重新赋值,即tensor=tensor.cuda().