版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第PyTorch編寫代碼遇到的問題及解決方案RuntimeError:AttemptingtodeserializeobjectonCUDAdevice1buttorch.cuda.device_count()is1.Pleaseusetorch.loadwithmap_locationtomapyourstoragestoanexistingdevice.
或者是RuntimeError:expecteddevicecuda:0butgotdevicecuda:1
錯誤原因之一
使用了CUDA1顯卡訓(xùn)練保存的模型文件,使用CUDA0驗證
代碼中寫了
device=torch.device(“cuda”iftorch.cuda.is_available()else“cpu”)
可以在命令行設(shè)置讓哪些GPU可見
exportCUDA_VISIBLE_DEVICES=1#GPU編號
exportCUDA_VISIBLE_DEVICES=0,1,2,3#4張顯卡可見
也可以在代碼里改成
checkpoint=torch.load(checkpoint,map_location=‘cuda:0')
錯誤提示
raiseConnectionError(e,request=request)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=8097):Maxretriesexceededwithurl:/update(CausedbyNewConnectionError('urllib3.connection.HTTPConnectionobjectat0x7f3111915e80:Failedtoestablishanewconnection:[Errno111]Connectionrefused',))
Exceptioninusercode:
因為沒有啟動visdom可視化程序,所有報錯
在終端執(zhí)行命令visdom之后就能看到如下信息
Checkingforscripts.
It'sAlive!
INFO:root:ApplicationStarted
Youcannavigatetohttp://localhost:8097
nn.Module.cuda()和Tensor.cuda()
無論是對于模型還是數(shù)據(jù),cuda()都能實現(xiàn)從CPU到GPU的內(nèi)存遷移,但是他們的作用效果有所不同。
Model:
model=model.cuda()
model.cuda()
上面兩句能夠達(dá)到一樣的效果,即對model自身進(jìn)行的內(nèi)存遷移
Tensor:
model=Model()
tensor=torch.zeros([2,3,10,10])
model.cuda()
tensor.cuda()
tensor_cuda=tensor.cuda()
model(tensor)#會報錯
model(tensor_cuda)#正常運行
和nn.Module不同,調(diào)用tensor.cuda只是返回這個tensor對象在GPU內(nèi)存上的拷貝,而不會對自身進(jìn)行改變。因此必須對tensor進(jìn)行重新賦值,即tensor=tensor.cuda()
PyTorch0.4計算累積損失的不同
以廣泛使用的模式total_loss+=loss.data[0]為例。Python0.4.0之前,loss是一個封裝了(1,)張量的Variable,但Python0.4.0的loss現(xiàn)在是一個零維的標(biāo)量。對標(biāo)量進(jìn)行索引是沒有意義的(似乎會報invalidindextoscalarvariable的錯誤)。使用loss.item()可以從標(biāo)量中獲取Python數(shù)字。所以改為:
total_loss=total_loss+loss.item()
如果在累加損失時未將其轉(zhuǎn)換為Python數(shù)字,則可能出現(xiàn)程序內(nèi)存使用量增加的情況。這是因為上面表達(dá)式的右側(cè)原本是一個Python浮點數(shù),而它現(xiàn)在是一個零維張量。因此,總損失累加了張量和它們的梯度歷史,這可能會產(chǎn)生很大的autograd圖,耗費內(nèi)存和計算資源。
自適應(yīng)CPU和GPU設(shè)備的trick
device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")
model=Model().to(device)
total_loss=0
forinput,targetintrain_loader:
input,target=input.to(device),target.to(device)
total_loss=total_loss+loss.item()
withtorch.no_grad():
forinput,targetintest_loader:
torch.Tensor.detach的使用
官方說明:ReturnsanewTensor,detachedfromthecurrentgraph,Theresultwillneverrequiregradient
假設(shè)有模型A和模型B,我們需要將A的輸出作為B的輸入,但訓(xùn)練時我們只訓(xùn)練模型B.那么可以這樣做:
input_B=output_A.detach
它可以使兩個計算圖的梯度傳遞斷開,從而實現(xiàn)我們所需的功能。
pytorch中l(wèi)oss函數(shù)的參數(shù)設(shè)置
以CrossEntropyLoss為例:
CrossEntropyLoss(self,weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='elementwise_mean')
若reduce=False,那么size_average參數(shù)失效,直接返回向量形式的loss,即batch中每個元素對應(yīng)的loss.
若reduce=True,那么loss返回的是標(biāo)量:
如果size_average=True,返回loss.mean.
如果size_average=False,返回loss.sum.
weight:輸入一個1D的權(quán)值向量,為各個類別的loss加權(quán),如下公式所示:
ignore_index:選擇要忽視的目標(biāo)值,使其對輸入梯度不作貢獻(xiàn)。如果size_average=True,那么只計算不被忽視的目標(biāo)的loss的均值。
reduction:可選的參數(shù)有:‘none'|‘elementwise_mean'|‘sum',正如參數(shù)的字面意思。
多GPU的處理機(jī)制
使用多GPU時,應(yīng)該記住PyTorch的處理邏輯是:
在各個GPU上初始化模型。
前向傳播時,把batch分配到各個GPU上進(jìn)行計算。
得到的輸出在主GPU上進(jìn)行匯總,計算loss并反向傳播,更新主GPU上的權(quán)值。
把主GPU上的模型復(fù)制到其它GPU上。
訓(xùn)練時損失出現(xiàn)nan的問題
訓(xùn)練模型時出現(xiàn)損失為nan的情況
可能導(dǎo)致梯度出現(xiàn)nan的三個原因:
梯度爆炸。也就是說梯度數(shù)值超出范圍變成nan.通??梢哉{(diào)小學(xué)習(xí)率、加BN層或者做梯度裁剪來試試看有沒有解決。
損失函數(shù)或者網(wǎng)絡(luò)設(shè)計。比方說,出現(xiàn)了除0,或者出現(xiàn)一些邊界情況導(dǎo)致函數(shù)不可導(dǎo),比方說log(0)、sqrt(0).
臟數(shù)據(jù)??梢允孪葘斎霐?shù)據(jù)進(jìn)行判斷看看是否存在nan.
補(bǔ)充一下nan數(shù)據(jù)的判斷方法:
注意!像nan或者inf這樣的數(shù)值不能使用==或者is來判斷!為了安全起見統(tǒng)一使用math.isnan或者numpy.isnan吧。
importnumpyasnp
ifnp.any(np.isnan(input.cpu().numpy())):
print("InputdatahasNaN!")
if(np.isnan(loss.item())):
print("LossvalueisNaN!")
pytorch內(nèi)存泄漏
torch.as_tensor(data,dtype=None,device=None)-Tensor:為data生成tensor。
如果data已經(jīng)是tensor,且d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 32350.1-2025軌道交通絕緣配合第1部分:基本要求電工電子設(shè)備的電氣間隙和爬電距離
- 液狀化妝品制造工常識評優(yōu)考核試卷含答案
- 滴丸工安全規(guī)程知識考核試卷含答案
- 纖維碳化裝置操作工崗前技能競賽考核試卷含答案
- 鋁鎂粉球磨工崗前跨界整合考核試卷含答案
- 酒店員工培訓(xùn)與業(yè)務(wù)能力提升制度
- 酒店客房預(yù)訂與客戶關(guān)系管理規(guī)范制度
- 財務(wù)報告分析與改進(jìn)制度
- 城市酒店管理培訓(xùn)
- 丙烷購銷合同模板
- 簡愛插圖本(英)夏洛蒂·勃朗特著宋兆霖譯
- 中醫(yī)內(nèi)科-郁病課件
- 焊接專業(yè)人才培養(yǎng)方案
- 第二屆全國技能大賽江蘇省選拔賽焊接項目評分表
- 糖尿病護(hù)士年終總結(jié)
- 第20課 《美麗的小興安嶺》 三年級語文上冊同步課件(統(tǒng)編版)
- 糖尿病基礎(chǔ)知識培訓(xùn)2
- 手工藝品加工合同
- 研學(xué)旅行概論第六章
- GB/T 22176-2023二甲戊靈乳油
- 根據(jù)信用證制作商業(yè)發(fā)票、裝箱單、裝船通知
評論
0/150
提交評論