随着mmcv2.0版本的发布,现在越来越多的算法库已经替换成2.0架构,其基础是mmengine。整个流程有很大的变动,整个流程更清晰明了,智能简单,因此之前很多涉及流程的报错也不会再出现。
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.
File "D:\ProgramData\Anaconda3\envs\openmmlab\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
raise RuntimeError('''
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
报错原因:
pytorch在Linux中和windows/MacOS中支持多线程的是存在差异的,Linux中,子线程是直接通过克隆地址来获取dataset和python函数参数的。在window下,python解释器运行后,如果没有指定主入口,python会按顺序执行代码,此时新创建进程后,子进程会再次导入运行的文件并按顺序全部执行代码,多进程代码会再次被执行,但multiprocessing.Process
的源码中是对子进程再次产生子进程是做了限制的,是不允许的,所以会报错提示。
解决办法:
1、在主程序加入if __name__ == '__main__':
,指定程序入口,此时主程序的命名空间为‘__main__’
,继续使用多线程加载
2、设置num_workers=0
并且,persistent_workers=Fal