寫這篇博文的主要目的是記錄一下在使用Pytorch做深度學習項目時踩的一些坑,警醒自己,幫助他人😁😀
1 RuntimeError: No CUDA GPUs are available
明明有GPU,而且我的CUDA也裝好了,怎么會出這么個錯誤呢?
為了確保我的顯卡和CUDA都沒問題,我試了下這個:
import torch
torch.cuda.device_count()
# 1
torch.cuda.is_available()
# True
我又試了下這個:nvidia-smi
,也是正常的,那是為什么呢?😦
幾經輾轉,可能是os.environ['CUDA_VISIBLE_DEVICES']
設置的問題,可以使用nvidia-smi
查看自己的顯卡的編號,例如我有兩張顯卡,編號為0,1,那么則設置:os.environ['CUDA_VISIBLE_DEVICES'] = "0,1"
,問題解決😜
2. RuntimeError: CUDA out of memory. Tried to allocate xxx (GPU 0; xxx total capacity; xxx already allocated; xxx free; 7.43 reserved in total by PyTorch)
出現這么個問題,很顯然,CPU的現存不夠了!😭
要解決這個問題有一個很簡單粗暴的方法:加顯卡!或者換個現存更大的顯卡!
那么如果沒💰呢?
- 減小訓練數據的
batch_size
- 一個可能有用的方法:
torch.cuda.empty_cache()
。關於這個方法的一些情況可以在About torch.cuda.empty_cache()了解 - 如果你的
CPU、內存
很強的化,試試在CPU
上訓練模型
3. To use CUDA with multiprocessing, you must use the 'spawn' start method
這個錯誤出現在我使用多進程利用CUDA進行訓練的時候。
光從報錯來看,似乎提到了該怎么解決這個問題:use the 'spawn' start method
,但咋一看還是摸不清頭腦,具體該怎么解決這個問題呢?
import torch.multiprocessing as mp
mp.set_start_method('spawn')
if __name__ == "__main__":
...
model = ...
data = ...
train(model, data)
...
關於在pytorch中使用多進程,可以參考官方的說明:MULTIPROCESSING BEST PRACTICES,這這個說明里還給出了一個完整的例子:example。
4. RuntimeError: CUDA error: initialization error
錯誤來自使用gpu訓練模型時,當時使用的是dgl
框架訓練圖神經網絡,使用了其中的NodeDataLoader
加載節點數據,先是報了Caught RuntimeError in DataLoader worker process 0.
的bug,接着就報了CUDA error: initialization error
,報錯的棧幀如圖:
在NodeDataLoader
初始化時,有一個num_workers
參數,我設置為了4,改成默認值(0)后這個bug就消失了。從錯誤信息來看,應該是CUDA的初始化問題,而且把num_workers
設置為默認值后就正常了,猜測是因為多線程操作問題導致的,具體的沒有進行深究,但是在github上找到了這個問題 CUDA error (3): initialization error (multiprocessing) #2517。