PyTorch錯(cuò)誤解決方案及技巧

    • 報(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'}
  1. 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上。

  1. 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().

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容