Pytorch 解決自定義子Module .cuda() tensor失敗的問題
最近在剛從tensorflow轉入pytorch,對於自定義的nn.Module 碰到了個問題,即使把模組 modle=Model().cuda(),裡面的子Module的parameter都沒有被放入cuda,導致輸入是torch.cuda.FloatTensor,但是比如CNN的weight卻還是torch.FloatTensor
(當然最粗暴的方法就是直接在子模組裡面都用了 .cuda()
但是問題並不在那,可能是呼叫子模組的時候,存在某些錯誤,導致父模組沒有把子模組的parameter註冊到pytorch中。
而我遇到的錯誤就是,使用list來存放子模組的物件,導致list中的parameter沒有註冊。
解決方案就是 使用nn.ModuleList()這個封裝的函式 來替換list() / []
參考這裡
補充知識:關於Pytorch框架下報錯CUDA驅動版本不滿足CUDA執行版本——一種可能的原因及解決辦法
執行Pytorch程式碼的時候遇到:
RuntimeError: cuda runtime error (35) : CUDA driver version is insufficient for CUDA runtime version at /pytorch/aten/src/THC/THCGeneral.cpp:74
可能原因:每一個pytorch版本都有對應的cuda版本,可能是在安裝pytorch的時候,選擇的pytorch版本所對應的版本cuda版本與本機所安裝的cuda版本不相符。
check步驟:
#檢視pytorch版本
import torch
torch.__version__
#檢視pytorch版本對應的cuda版本
torch.version.cuda
#檢視cuda是否可用
torch.cuda.is_available()
#檢視Linux server安裝的cuda版本
#切換到/usr/local/cuda/samples/1_Utilities/deviceQuery然後執行
./deviceQuery
出現類似以下資訊:
./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GTX TITAN Black" CUDA Driver Version / Runtime Version 8.0 / 8.0 CUDA Capability Major/Minor version number: 3.5 Total amount of global memory: 6080 MBytes (6375407616 bytes) (15) Multiprocessors,(192) CUDA Cores/MP: 2880 CUDA Cores GPU Max Clock rate: 1072 MHz (1.07 GHz) Memory Clock rate: 3500 Mhz Memory Bus Width: 384-bit L2 Cache Size: 1572864 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536),2D=(65536,65536),3D=(4096,4096,4096) Maximum Layered 1D Texture Size,(num) layers 1D=(16384),2048 layers Maximum Layered 2D Texture Size,(num) layers 2D=(16384,16384),2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,z): (1024,1024,64) Max dimension size of a grid size (x,z): (2147483647,65535,65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery,CUDA Driver = CUDART,CUDA Driver Version = 8.0,CUDA Runtime Version = 8.0,NumDevs = 1,Device0 = GeForce GTX TITAN Black Result = PASS
比對前後兩個cuda版本是否一致,如果不一致,就需要解除安裝並安裝與本機cuda版本相同的pytorch(當然應該也可以改本機的cuda版本,只不過相對比較麻煩)
pip3 uninstall pytorch
pip3 install [pytorch-version-link]
開啟連結,選擇合適版本版本,右鍵複製連結地址,替換上面的pytorch-version-link,執行命令就行。
這樣應該就可以解決了。
以上這篇Pytorch 解決自定義子Module .cuda() tensor失敗的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。