项目场景:pytorch在训练最后一个batch时卡住
问题描述
需要手动输入ctrl +c
程序才可继续运行,但不稳定。
Progress: 100% |##################################################################################################################################################################################| Elapsed Ti
me: 1:04:05 Time: 1:04:05
Epoch [2/8] train loss = 5.403
^CException ignored in: <function _MultiProcessingDataLoaderIter.__del__ at 0x7f7b5224dd40>
Traceback (most recent call last):
File "/anaconda3/envs/pred2d/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 961, in __del__
self._shutdown_workers()
File "/anaconda3/envs/pred2d/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 941, in _shutdown_workers
w.join()
File "/anaconda3/envs/pred2d/lib/python3.7/multiprocessing/process.py", line 140, in join
res = self._popen.wait(timeout)
File "/anaconda3/envs/pred2d/lib/python3.7/multiprocessing/popen_fork.py", line 48, in wait
return self.poll(os.WNOHANG if timeout == 0.0 else 0)
File "/anaconda3/envs/pred2d/lib/python3.7/multiprocessing/popen_fork.py", line 28, in poll
pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt:
原因分析:
根据博客1,应该是与cv2和pytorch发生了互锁。
解决方案:
博客1提出了三种解决方案,显然在已经写好dataloader的情况下,关闭cv2的多线程是一个好的方案。
在dataloader中,修改前:
...
import cv2
...
修改后:
...
import cv2
...
cv2.setNumThreads(0)
cv2.ocl.setUseOpenCL(False)
之前博主的经验是正确的,关闭cv2的多线程后,训练速度在第二个epoch及以后都明显加快。
2022年8月11日更新:
实测,batch_size增大到一定程度之后,还是会出现在最后一个epoch卡住的现象(比如,batch_size在10左右可通过关闭cv2的多线程解决这一问题,但是当batch_size到70这一量级又会出现卡住)。有知道如何根除的请告知我。