使用Keras进行实时训练和预测



我想使用Keras进行实时训练和预测设置。在我的场景中,我通过MQTT获得实时数据,该数据应用于训练(LSTM)神经网络和/或将其应用于预测。

我正在使用具有GPU支持和相当强大的GPU容量的Tensorflow后端,但在我的场景中,Keras并没有真正从GPU加速中获利。(我使用keras存储库中的示例进行了一些性能测试,以确保GPU加速正常工作)。在我的第一种方法中,我使用model.train_on_batch(...)方法来训练网络,每个项目都通过MQTT来:

model = load_model()
def on_message(msg):
    """
    Method called by MQTT client each time new data comes in
    """
    if msg.topic == 'my/topic':
        X, Y = prepare_data(msg.payload)
        prediction = model.predict(X)
        loss = model.train_on_batch(X, Y)
        send_to_visualization_tool(prediction, loss)

在此设置中,一个训练步骤大约需要200ms。然而,当我引入缓冲区(例如缓冲100个数据点)时,整个批处理的训练时间只会略微增加。这表明批量训练的设置时间开销很大。我还注意到,当使用大小为1的批处理时,CPU消耗相当高,而GPU几乎没有使用。

作为替代方案,我现在引入了一个同步队列,MQTT客户端在数据传入时推送数据,然后神经网络将处理前一批传入的所有数据作为批处理:

train_data_queue = Queue.Queue()
# MQTT client running in separate thread
def on_message(msg):
    train_data_queue.put(msg.payload)
model = load_model()
while True:
    train_data_batch = dequeue_all(train_data_queue)  # dequeue all items from queue
                                                      # or block until at least one
                                                      # item is present
    X, Y = prepare_data(train_data_batch)
    predictions = model.predict_on_batch(X)
    losses = model.train_on_batch(X, Y)
    send_to_visualization_tool(predictions, losses)

这种方法工作得很好,但如果我能摆脱同步队列和多线程的额外复杂性就更好了。

因此,我的问题是:有没有一种方法可以减少一次批量培训的开销?例如,通过在纯tensorflow中重新实现模型?或者你能想到用Keras进行实时训练的更好方法吗?

keras的性能应该与原始tensorflow的性能大致相似,因此我不建议重写您的模型。

事实上,现代硬件通常需要花费相同的时间来训练单个示例和一批示例,这就是为什么我们花费如此多的精力来处理事情。如果您想使用tf.contrib.batching,就可以摆脱同步队列的复杂性。Batch_function,但是如果你想获得额外的吞吐量,你仍然需要从许多线程中提供它。

最新更新