如果在后台线程中进行初始培训,则培训效果会下降

时间:2019-07-11 10:31:58

标签: python multithreading tensorflow keras

我有一个数据流,正在训练多个Keras模型。传入数据分为不同的类别。如果汇总了一个类别的足够数据,我将建立一个模型,对其进行一些初步训练,将其保存到数据结构中以备后用,并对流中出现的模型类别数据进行分类。在第二个线程中,我正在检查是否需要重新训练模型以使用新数据并在必要时在该线程中进行重新训练的条件。

到目前为止,效果还不错。

为了不通过等待初始训练完成而阻止传入数据流的处理,我还将该初始训练移到了第二个线程中。

现在的问题是:一旦我将初始训练移到第二个线程,训练(model.fit函数)的性能就会变得糟糕。它仅使用一个内核,尽管在移动到另一线程之前已使用了所有内核。如果我再次将其移回原处,一切都会变好。到目前为止,我无法为这种行为提供解决方案或解决方案。

有人对我有提示吗?

我尝试使用tf.Graph和tf.Session对象,但无济于事...

编辑: 一旦第二个线程开始对模型进行初始训练,我便在第一个线程的代码中添加了sleep(5)。然后,训练速度再次上升到可以承受的水平。似乎第一个线程的操作阻碍了第二个线程的操作。实际上,在我的测试场景中,输入流以最大速度进入,因此利用了整个内核。看起来这可能是由于python有限的线程功能引起的吗?我想知道为什么在第二个线程中重新训练时这没问题。

编辑:似乎我在这里遇到Python的GIL限制。会尝试找到解决方法...

0 个答案:

没有答案