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