Python 在多处理中使用model.predict(Keras+;TF)

Python 在多处理中使用model.predict(Keras+;TF),python,tensorflow,keras,multiprocessing,Python,Tensorflow,Keras,Multiprocessing,我有以下问题。我使用Tensorflow Keras模型来评估连续传感器数据。我的模型输入由15个传感器数据帧组成。因为函数model.predict()需要将近1秒的时间,所以我希望异步执行此函数,以便在此时间段内收集下一个数据帧。 为了实现这一点,我创建了一个池,其中包含多处理库和一个用于model.predict的函数。我的代码如下所示: def predictData(data): return model.predict(data) global model model =

我有以下问题。我使用Tensorflow Keras模型来评估连续传感器数据。我的模型输入由15个传感器数据帧组成。因为函数model.predict()需要将近1秒的时间,所以我希望异步执行此函数,以便在此时间段内收集下一个数据帧。 为了实现这一点,我创建了一个池,其中包含多处理库和一个用于model.predict的函数。我的代码如下所示:

def predictData(data): 
   return model.predict(data)

global model
model = tf.keras.models.load_model("Network.h5")
model._make_predict_function()

p = Pool(processes = 4)
...
res = p.apply_async(predictData, ([[iinput]],))
print(res.get(timeout = 10))

现在,调用predictData()时总是出现超时错误。似乎model.predict()工作不正常。我做错了什么?

可以在多个并发python进程中运行多个预测,只需在每个独立进程中构建自己的tensorflow计算图,然后调用keras.model.predict

编写一个将与多处理模块(Process或Pool类)一起使用的函数, 在这个函数中,你应该建立你的模型,tensorflow图和你需要的任何东西, 设置所有tensorflow和keras变量,然后可以对其调用预测方法, 然后将结果通过管道传回主流程

例如:

    def f(data):

          import tensorflow, keras

          configure your tensorflow and keras settings (e.g.  GPU/CPU usage)

          keras_model = build_your_keras_model()

          result = keras_model.predict(data)

          return result

    if __main__ = '__main__':

          p = Pool(processes = 4)

          res = p.apply_async(f, (data,))

          print(res.get(timeout = 10))

原因是您生成的每个进程都需要一个新的初始化版本的模型,该模型用于进行预测。因此,您必须确保为每个衍生流程实例化/加载您的模型。这显然不是最优的

这是多处理机器学习培训和/或推理的已知警告。有些库具有现成的多处理功能,并提供对其模型的并行调用。然而,在大多数库中,一旦您想要进行多处理,您就只能靠自己了


确保实例化模型一次,然后找到跨流程共享该模型的方法。这样做的一个基本方法是,将您的模型作为一个烧瓶服务,然后根据该服务做出心满意足的预测。干杯

在tensorflow后端构建的计算图存在于python框架之外。以这种方式使用多处理不会生成图形的多个副本。您仍然只有一个模型的副本,并且试图同时发送4个数据流。杰姆斯是正确的,考虑在前景进程上运行预测,并在后台运行线程/进程来收集下一个数据帧。您可以缓冲多个数据帧,将它们放入网络输入的批处理维度中,然后通过线程收集数据似乎是正确的方法。因此,通常不可能在多个过程中运行多个预测?