调用DataLoader时采用num_workers>0导致数据加载出现阻塞问题的解决方法
本文仅就我在程序debug过程中遇到的数据加载阻塞问题寻找解决方法,不涉及原理性探究,文章内容源于网络搜索,仅作为工作记录,希望能对读者的debug有所帮助。
问题描述
测试程序时发现,当DataLoader函数中加载数据时线程数设定大于0时,程序会卡住,但当设定线程数为1(num_workers=0即将用主进程加载数据)时,程序能正常运行,但由于仅单线程的加载致使神经网络在训练时会花将近一半的时间在数据加载上。
解决方法
若运行环境为windows,可参看https://blog.csdn.net/qq_41196472/article/details/106393994?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param考虑将训练放在main函数下(该方法有待验证)
但实际的运行环境为服务器上运行,继续查找相关结果,找到博文https://blog.csdn.net/jacke121/article/details/108900716?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param,运用类似博文的方法对DataLoader查找致使程序出现的断点,找到同样是由于cv2库内的函数导致的阻塞,这里可以考虑将该cv2函数改写。
在无法改写的cv2函数的情况下也能通过知乎文章https://zhuanlan.zhihu.com/p/133707658和这篇博客https://blog.csdn.net/jacke121/article/details/109126670的解决方法,通过在import cv2之后加上cv2.setNumThreads(0) 来避免卡死。
如有疑问或更好的解决方法,欢迎在评论区交流。
更多推荐
所有评论(0)