运行试错合集
試錯(cuò):
在服務(wù)器訓(xùn)練好的參數(shù)直接被pycharm映射給覆蓋了!
記得把這里取消掉! 如果在py文件中修改了代碼,手動(dòng)上傳! 就是上面的upload!
運(yùn)行結(jié)果:
運(yùn)行train的結(jié)果
評(píng)估階段:
出錯(cuò)了: 但是我改了
嘗試并行! 只是將model改為了并行!但是還是有問題,貌似是自己訓(xùn)練的時(shí)候沒有使用并行,所以導(dǎo)致!
出錯(cuò)了:
出問題了!
第二次運(yùn)行:
如果出現(xiàn)路徑問題的話,要edit configuration!
但是在運(yùn)行期間,出現(xiàn)這樣的情況! 不知何解!
其中num_words是需要更改的!
還是報(bào)這個(gè)錯(cuò)誤:
出問題了
改來改去,感覺方向走偏了! 是只有在to_device()的地方才需要修改! 而沒有這些的地方是不需要的!
因?yàn)樗鼔焊恍枰闾匾夥湃隿uda中!
試來試去,終歸不行啊!
三種方法都試了! 包括改成DistributedDataParallel()!
但是突然謀生想法, 為什么我不弄懂它的原理呢! 這樣就會(huì)懂了!
現(xiàn)在開始懂它的源碼! 包括并行的原理!
首先看李沐的書!!
最終發(fā)現(xiàn)了問題所在:
就是查看你的模型參數(shù)是不是在GPU
代碼如下:
所有的模型參數(shù)都是在CPU上的!!那還訓(xùn)練個(gè)錘子!
那人家報(bào)這個(gè)錯(cuò)誤也就不離奇了:
查看DataParallel源碼:
在模塊級(jí)(module level)實(shí)現(xiàn)數(shù)據(jù)并行性。
該容器通過在 batch dimension中分塊(每個(gè)設(shè)備復(fù)制一次其他對(duì)象)將指定模塊的應(yīng)用程序并行化。在前向傳遞中,module被復(fù)制到每個(gè)設(shè)備上,每個(gè)副本處理輸入的一部分。在向后傳遞過程中,每個(gè)副本的梯度被求和到原始模塊中。批處理大小應(yīng)大于實(shí)際使用的gpu數(shù)量。
警告:
建議使用distributeddataparh列,而不是這個(gè)類,來進(jìn)行多gpu訓(xùn)練,即使只有一個(gè)節(jié)點(diǎn)。請(qǐng)參閱:使用nn. parallel.distributeddataparparallel來代替multiprocessing或nn。數(shù)據(jù)并行和分布式數(shù)據(jù)并行。
允許將任意位置和關(guān)鍵字輸入傳遞給DataParallel,但有些類型需要特殊處理。張量將分散在指定的dim上(默認(rèn)為0)。元組、列表和dict類型將被淺層復(fù)制。其他類型將在不同的線程之間共享,如果在模型的forward pass中寫入,則可能被損壞。
并行化的模塊必須在device_ids[0]上有它的參數(shù)和緩沖區(qū),然后才能運(yùn)行這個(gè)datparallel模塊。
警告:
在每個(gè)forward中,模塊被復(fù)制到每個(gè)設(shè)備上,因此任何對(duì)forward中正在運(yùn)行的模塊的更新都將丟失。例如,如果模塊有一個(gè)計(jì)數(shù)器屬性,在每次forward中遞增,它將始終保持初始值,因?yàn)楦率窃趂orward后銷毀的副本上完成的。但是,dataparhles保證設(shè)備[0]上的副本將有它的參數(shù)和緩沖區(qū)與基本并行化模塊共享存儲(chǔ)。因此,設(shè)備[0]上的參數(shù)或緩沖區(qū)的就地更新將被記錄。例如,BatchNorm2d和spectral_norm()依賴于此行為來更新緩沖區(qū)。
警告:
在模塊及其子模塊上定義的前向和后向鉤子將被調(diào)用len(device_ids)次,每個(gè)鉤子的輸入都位于特定的設(shè)備上。特別地,鉤子只能保證按照相應(yīng)設(shè)備上操作的正確順序執(zhí)行。例如,不能保證通過register_forward_pre_hook()設(shè)置的鉤子會(huì)在所有l(wèi)en(device_ids) forward()調(diào)用之前執(zhí)行,但是每個(gè)這樣的鉤子都會(huì)在該設(shè)備相應(yīng)的forward()調(diào)用之前執(zhí)行。
警告:
當(dāng)module在forward()中返回一個(gè)標(biāo)量(即0維張量)時(shí),包裝器將返回一個(gè)長度向量,該向量等于數(shù)據(jù)并行中使用的設(shè)備數(shù)量,包含來自每個(gè)設(shè)備的結(jié)果。
人家說輸入變量可以在任何設(shè)備上,包括CPU!!
Torch.device:
torch.device代表將torch.Tensor分配到的設(shè)備的對(duì)象。torch.device包含一個(gè)設(shè)備類型(‘cpu’或‘cuda’)和可選的設(shè)備序號(hào)。如果設(shè)備序號(hào)不存在,則為當(dāng)前設(shè)備。如:torch.Tensor用設(shè)備構(gòu)建‘cuda’的結(jié)果等同于‘cuda:X’,其中X是torch.cuda.current_device()的結(jié)果。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model.to(device)這句話需要寫的次數(shù)等于需要保存GPU上的tensor變量的個(gè)數(shù);一般情況下這些tensor變量都是最開始讀數(shù)據(jù)時(shí)的tensor變量,后面衍生的變量自然也都在GPU上.
如果是多個(gè)GPU
在代碼中的使用方法為
pytorch中model=model.to(device)用法
device=torch.device(“cpu”)代表的使用cpu,而device=torch.device(“cuda”)則代表的使用GPU。
當(dāng)我們指定了設(shè)備之后,就需要將模型加載到相應(yīng)設(shè)備中,此時(shí)需要使用model=model.to(device),將模型加載到相應(yīng)的設(shè)備中。將由GPU保存的模型加載到CPU上。
這次再次看這個(gè)錯(cuò)誤:
在設(shè)備1上的副本1出錯(cuò)了!! 所以我們的代碼原理沒有問題! 不知道哪里出錯(cuò)了!
再品一下這句話:
模塊必須在cuda:0上有參數(shù)和緩存! 但是參數(shù)卻在cpu上! 那么必須將參數(shù)放入到GPU上!
這也說明模型的緩存和參數(shù)是獨(dú)立放入的???
總結(jié)
- 上一篇: matlab 动画_MATLAB绘图动画
- 下一篇: ad批量走线_AD PCB直角布线批量改