Keras中fit_generator()函数中的多进程和工作线程在Windows 10下使用时存在困惑

13
在fit_generator()的文档(文档:https://keras.io/models/sequential/#fit_generator)中,它说参数use_multiprocessing接受一个布尔值,如果设置为True,则允许基于进程的线程。
它还说,参数workers是一个整数,指定使用基于进程的线程时要启动多少进程。显然,默认值为1(单个基于进程的线程),如果设置为0,则在主线程上执行生成器。
我原以为这意味着,如果use_multiprocessing=True且workers> 0(让我们使用6作为示例),那么它将独立地旋转6个生成器进程。但是,当我测试时,我认为我可能误解了某些内容(见下文)。我的困惑在于,如果我将use_multiprocessing设置为False并且workers = 1,则在我的任务管理器中,我可以看到所有12个虚拟核心正在被相当均匀地利用,并且在训练模型时我的CPU使用率约为50%(参考:我的i7-8750H CPU有6个支持虚拟化的内核,并且我已经在BIOS中启用了虚拟化)。如果我增加工作人数,CPU使用率达到100%,训练速度更快。如果我将工作人数减少到0,以便它在主线程上运行,则我可以看到所有虚拟核心仍在使用,但似乎有些不均匀,CPU使用率约为36%。
不幸的是,如果我将multiprocessing设置为True,那么我会收到一个brokenpipe错误。我还没有解决这个问题,但我想更好地理解我在尝试解决什么问题。
如果有人能够解释一下使用use_multiprocessing = True和use_multiprocessing = False进行训练的区别,以及workers为0、1和> 1时的情况,我将不胜感激。如果有影响的话,我正在使用tensorflow(gpu版本)作为keras的后端,python 3.6在Spyder中与IPython Console一起使用。
我怀疑use_multiprocessing=True实际上是在启用多进程,而当use_multiprocessing=False时,workers>1则设置线程数,但这只是我的猜测。

workers=0 时,多CPU使用率可能是因为您的预处理代码的某些部分具有并行部分,例如numpy函数。 - mrgloom
在Keras内部使用了multiprocessing.pool.ThreadPoolmultiprocessing.Pool - mrgloom
1个回答

16

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

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


谢谢!所以听起来当 use_multiprocessing=False 时,工作进程会指定要使用的线程数。我需要阅读有关线程的资料,以更好地理解为什么这会使用所有 CPU 核心,而不管线程数是多少。Use_multiprocessing=True 对我来说仍然是个谜。也许它实际上正在启动进程并更改工作进程的行为,以设置要启动的进程数?我将在之后提出一个新问题,询问如何在 Windows 上修复 use_multiprocessing,之前我会再次确认它是否已经是一个已解决的问题。 - chemdatafarmer
@Daniel,你能详细解释一下 use_multiprocessing=True 吗?我也遇到了几个问题,就像你说的一样卡死了。该如何正确使用它呢? - Innat
1
大多数时候出现 WARNING:tensorflow:multiprocessing 可能与 TensorFlow 发生不良交互,导致非确定性死锁。建议使用高性能数据管道 tf.data. 有时在第一个 epoch 冻结所有内容。 - Innat
@M.Innat,我从未使用过它。 - Daniel Möller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接