如果初始训练发生在后台线程中,训练性能会下降

2024-09-28 19:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据流,我正在训练几个Keras模型。传入的数据被分类为不同的类别。如果聚合了一个类别的足够数据,我将构建一个模型,对其进行一些初始培训,将其保存到数据结构中以供以后使用,并对流中输入的模型类别数据进行分类。在第二个线程中,我正在检查出现的条件,以便根据新数据重新训练模型,并在必要时重新训练该线程

到目前为止,这个工作还可以

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

现在的问题是:一旦我将初始训练移到第二个线程,训练性能(model.fit函数)就会变得很糟糕。它只使用一个内核,尽管它在移动到另一个线程之前使用了所有内核。如果我再把它移回去,一切都会好起来的。到目前为止,我无法对这种行为做出解释,也无法找到解决办法

有人给我一个提示吗

我试着使用tf.Graph和tf.Session对象,但没用

编辑: 当第二个线程开始对模型进行初始训练时,我就在第一个线程的代码中加入睡眠(5)。然后训练速度再次提高到可以承受的水平。似乎第一个线程的操作阻碍了第二个线程的操作。实际上,在我的测试场景中,传入流以最大速度出现,因此使用了整个内核。看起来这可能是由于pythons有限的线程能力造成的?我想知道为什么在第二个线程中再培训时这没有问题

编辑:看起来我在这里遇到了Python的GIL限制。我会想办法绕过它


Tags: 数据模型编辑数据结构tf分类性能条件