间谍与Windows 10中的Keras fit_generator()中关于多处理和工作者的混淆

时间:2019-02-10 20:11:52

标签: multithreading keras multiprocessing windows-10 python-3.6

在fit_generator()的文档(文档:https://keras.io/models/sequential/#fit_generator)中,它说参数use_multiprocessing接受一个布尔值,如果将其设置为True,则该布尔值允许基于进程的线程。

它也表示参数worker是一个整数,它指定使用基于进程的线程时要启动的进程数。显然,它默认为1(基于单个进程的线程),如果设置为0,它将在主线程上执行生成器。

我认为这意味着,如果use_multiprocessing = True且workers> 0(以6为例),它将启动6个独立运行生成器的进程。但是,当我对此进行测试时,我认为我一定会误会某些东西(见下文)。

我感到困惑的原因是,如果我将use_multiprocessing设置为False并且worker = 1,那么在任务管理器中,我可以看到我的所有12个虚拟内核都被平均地利用,而我的CPU使用率约为50%,训练我的模型(作为参考,我有一个i6-8750H CPU,它具有6个支持虚拟化的内核,并且在BIOS中启用了虚拟化)。如果增加工人数量,CPU使用率将达到100%,培训速度将大大提高。如果将工作程序的数量减少到0以便它在主线程上运行,我可以看到我的所有虚拟内核仍在使用中,但是似乎有些不平衡,CPU使用率约为36%。

不幸的是,如果我将multiprocessing设置为True,那么我将得到一个坏管道错误。我尚未解决此问题,但我想更好地了解我要在此处解决的问题。

如果有人可以解释使用use_multiprocessing = True和use_multiprocessing = False进行训练之间的区别,以及当worker为0、1和> 1时,我将不胜感激。如果有问题,我将使用tensorflow(gpu版本)作为IPython控制台的Spyder中python 3.6的keras后端。

我的怀疑是,当True时use_multiprocessing实际上启用了多处理,而use_multiprocessing = False时的worker> 1正在设置线程数,但这只是一个猜测。

1 个答案:

答案 0 :(得分:1)

我唯一知道的是,当use_multiprocessing=Falseworkers > 1时,有许多并行数据加载线程(我对这些名称,线程,进程等并不是很满意)。但是有五个并行的前端将数据加载到队列中(因此,加载数据的速度更快,但不会影响模型的速度-如果数据加载时间太长,这可能会很好)。

每当我尝试use_multiprocessing=True时,所有内容都会被冻结。