- 報(bào)錯(cuò):
RuntimeError: Attempting to deserialize object on CUDA device 2 but torch.cuda.device_count() is 1 - 原因:在使用Pytorch加載模型時(shí)報(bào)錯(cuò)。加載的模型是用兩個(gè)GPU訓(xùn)練的,而加載模型的電腦只有一個(gè)GPU,所以會(huì)出錯(cuò)。
- 解決:
model = torch.load(model_path)
改為:model = torch.load(model_path, map_location='cuda:0')
如果是4塊到2塊:就把map_location改為:map_location={'cuda:1': 'cuda:0'}
- 報(bào)錯(cuò):
PyTorch多GPU的處理機(jī)制
使用多GPU時(shí),應(yīng)該記住pytorch的處理邏輯是:
1.在各個(gè)GPU上初始化模型。
2.前向傳播時(shí),把batch分配到各個(gè)GPU上進(jìn)行計(jì)算。
3.得到的輸出在主GPU上進(jìn)行匯總,計(jì)算loss并反向傳播,更新主GPU上的權(quán)值。
4.把主GPU上的模型復(fù)制到其它GPU上。
- nn.Module.cuda() 和 Tensor.cuda() 的作用效果的區(qū)別
無(wú)論是對(duì)于模型還是數(shù)據(jù),cuda()函數(shù)都能實(shí)現(xiàn)從CPU到GPU的內(nèi)存遷移,但是他們的作用效果有所不同。- 對(duì)于nn.Module:
model = model.cuda()
model.cuda()
上面兩句能夠達(dá)到一樣的效果,即對(duì)model自身進(jìn)行內(nèi)存遷移。
- 對(duì)于Tensor:
和nn.Module不同,調(diào)用tensor.cuda()只是返回這個(gè)tensor對(duì)象在GPU內(nèi)存上的拷貝,而不會(huì)對(duì)自身進(jìn)行改變。因此必須對(duì)tensor進(jìn)行重新賦值,即tensor=tensor.cuda().