在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是一个整数,指定使用基于进程的线程时要启动多少进程。显然,默认值为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函数。 - mrgloommultiprocessing.pool.ThreadPool
和multiprocessing.Pool
。 - mrgloom