pytorch训练框架或MMlab系列这类封装Pytorch的框架(MMdet、MMcls等)在训练中,如果要在dataset相关的pipeline中进行debug,用pdb打断点,很容易触发这样的错误:
bdb.BdbQuit: Caught BdbQuit in DataLoader worker process 0.
这是由于pytorch的Dataloader在多线程的时候不允许debug。因此要做的很简单,把多线程改成单线程,这个参数在mmlab系列通常是config中的workers_per_gpu。即将workers_per_gpu从原本设置的2或者更多改成
workers_per_gpu=0
注意这里不是改成workers_per_gpu=1,因为从这个参数的定义和描述中可以发现:
num_workers (int, optional) – how many subprocesses to use for data loading.
0
means that the data will be loaded in the main process. (default:0
)
然而在Pytorch>=1.7.0版本时,只改动 workers_per_gpu=0也会报错
raise ValueError('persistent_workers option needs num_workers > 0')
ValueError: persistent_workers option needs num_workers > 0
这是由于Dataloader有一个新的参数persistent_workers,这个默认为True的参数是为了加快训练速度,在数据加载完并不会关闭worker进程,而是保持现有的worker进程继续进行下一个Epoch的数据加载。当设置为True的时候,要求num_workers>=1 。因此进行debug的话还要把这个参数设置为False,一般在