1、問題描述:
在PyTorch訓練一個epoch時,模型不能接着訓練,Dataloader卡死。但是程序也不會保存,會一直卡在這個位置。
查看顯卡發現顯存也大部分釋放。只能通過Ctrl+C強制性暫停
這個bug是和多線程有關係。
我自己的代碼重寫了dataloader,使用的是OpenCV的接口進行數據讀取,而沒有用PIL。
目前有三種可靠的解決方式
1、可能是因爲OpenCV與Pytorch互鎖的問題,關閉OpenCV的多線程,問題解決。
Dataloader裏面不用cv2.imread進行讀取圖片,用cv2.imread還會帶來一系列的不方便,比如不能結合torchvision進行數據增強,所以最好用PIL 裏面的Image.open來讀圖片。
2、將DataLoader 裏面的參變量num_workers設置爲0,但會導致數據的讀取很慢,拖慢整個模型的訓練
3、(已經測試)如果用了cv2.imread,也懶得改了,那就加兩條語句,來關閉Opencv的多線程:
cv2.setNumThreads(0)
cv2.ocl.setUseOpenCL(False)
cv2.setNumThreads(0)和cv2.ocl.setUseOpenCL(False)。加了這兩條語句之後,並不影響模型的訓練速度,更具筆者觀察,速度相反還變快了,真神奇呀。 我是在重寫函數 def __getitem__(self, idx): 中加的。其他位置應該也可以。測試完後更新文章
綜上所述:如果遇到此問題,建議選擇方法1和方法3來解決這個問題,因爲不影響模型訓練速度。