我有一个数据流,我正在训练几个Keras模型。传入的数据被分类为不同的类别。如果聚合了一个类别的足够数据,我将构建一个模型,对其进行一些初始培训,将其保存到数据结构中以供以后使用,并对流中输入的模型类别数据进行分类。在第二个线程中,我正在检查出现的条件,以便根据新数据重新训练模型,并在必要时重新训练该线程
到目前为止,这个工作还可以
为了不因等待初始训练完成而阻塞传入数据流的处理,我还将初始训练移动到第二个线程中
现在的问题是:一旦我将初始训练移到第二个线程,训练性能(model.fit函数)就会变得很糟糕。它只使用一个内核,尽管它在移动到另一个线程之前使用了所有内核。如果我再把它移回去,一切都会好起来的。到目前为止,我无法对这种行为做出解释,也无法找到解决办法
有人给我一个提示吗
我试着使用tf.Graph和tf.Session对象,但没用
编辑: 当第二个线程开始对模型进行初始训练时,我就在第一个线程的代码中加入睡眠(5)。然后训练速度再次提高到可以承受的水平。似乎第一个线程的操作阻碍了第二个线程的操作。实际上,在我的测试场景中,传入流以最大速度出现,因此使用了整个内核。看起来这可能是由于pythons有限的线程能力造成的?我想知道为什么在第二个线程中再培训时这没有问题
编辑:看起来我在这里遇到了Python的GIL限制。我会想办法绕过它
目前没有回答
相关问题 更多 >
编程相关推荐