1、RuntimeError: cuda runtime erorr (77): an illegal memory access was encountered at
在使用命令前面加上CUDA_LAUNCH_BLOCKING=1(禁止並行的意思)
(設置os.environ['CUDA_LAUNCH_BLOCKING'] = 1
),也就是命令形式為:CUDA_LAUNCH_BLOCKING=1 python3 train.py
2、ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm)
出現這個錯誤的情況是,在服務器上的docker中運行訓練代碼時,batch size設置得過大,shared memory不夠(因為docker限制了shm).解決方法是,將Dataloader的num_workers設置為0.
3、優化器的weight_decay項導致的隱蔽bug,我們都知道weight_decay指的是權值衰減,即在原損失的基礎上加上一個L2懲罰項,使得模型趨向於選擇更小的權重參數,起到正則化的效果。但是我經常會忽略掉這一項的存在,從而引發了意想不到的問題。
引用別人的例子:這次的坑是這樣的,在訓練一個ResNet50的時候,網絡的高層部分layer4暫時沒有用到,因此也並不會有梯度回傳,於是我就放心地將ResNet50的所有參數都傳遞給Optimizer進行更新了,想着layer4應該能保持原來的權重不變才對。但是實際上,盡管layer4沒有梯度回傳,但是weight_decay的作用仍然存在,它使得layer4權值越來越小,趨向於0。后面需要用到layer4的時候,發現輸出異常(接近於0),才注意到這個問題的存在。雖然這樣的情況可能不容易遇到,但是還是要謹慎:暫時不需要更新的權值,一定不要傳遞給Optimizer,避免不必要的麻煩。