之所以說慘痛是有原因的。這個錯誤有人嚴重懷疑是顯卡和pytorch二者之一有一個是有問題的,也曾經想一度放棄,最后還是分享我的解決方法是啥,不確定對大家都適用。
一開始遇到這個錯誤,報的是我寫的一個模塊內的:
File "/gpfs/share/home/1601111331/uda_for_convex/convex_mirror_block/convex_mirror_block.py", line 126, in forward
Rotx = torch.zeros(B, 3, 3).to(self.device)
RuntimeError: CUDA error: an illegal memory access was encountered
語法啥的也沒有問題,這個錯誤出現的iter是隨機的,就是不確定運行到哪一步就會出現這個問題,為了解決這個問題,我先從最簡單的解決方案入手
比如使用cudnn benchnark=False之類的,還是不行,然后用CUDA_LAUNCH_BLOCKING=1還是不行,然后我感覺可能是數據聲明的方式有問題,那我直接換利用一個現成的cuda上的tensor,進行new,這樣的話就不會有創建tensor然后放到cuda上這樣一個步驟,顯然還是不行
然后我就懷疑是cuda版本和pytorch版本的問題,我就升級到了最新的pytorch1.9版本,還是會報這個錯誤,一度絕望。
關鍵是我用同樣的代碼,在我本地跑的時候就沒有這個問題,我本地的環境是cuda8,pytorch1.0,所以我准備在學校的服務器上配置這個環境,但是在此之前,我一直想嘗試但是沒有嘗試github上的一個人的解決方案,這個方案是:
If I use device = torch.device("cuda:1"), I always got RuntimeError: CUDA error: an illegal memory access was encountered error. But when I set a specific gpu by torch.cuda.set_device(1), everything is fine.
之前一直沒有嘗試是因為,這個解決方案修改起來太麻煩,畢竟我不可能逐個的去修改代碼,看看哪些地方用.to(device),哪些地方用.cuda(),但是就在剛剛用同樣的pytorch-1.9.0的環境,竟然沒有報錯...
所以接下來應該用這種方式將數據或者模型放到cuda之中...
后來發現好像.cuda()也不能解決問題,然后我將pytorch下降到1.1,這個問題得到了解決
真難受,明明是降級pytorch可以解決的問題,但是我卻解決了一個星期...