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

时间:2018-10-18 10:25:46

标签: python tensorflow keras multiprocessing

我有以下问题。我正在使用Tensorflow Keras模型评估连续的传感器数据。我输入的模型包含15个传感器数据帧。因为函数model.predict()大约需要1秒钟,所以我想异步执行此函数,以便可以在此时间段内收集下一个数据帧。 为此,我创建了一个带有多处理库的Pool和一个用于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()无法正常工作。我在做什么错了?

3 个答案:

答案 0 :(得分:1)

至少在安装了正确版本的情况下,Tensorflow已经在计算机上使用了多处理功能(GPU,SSE等)。因此,即使有可能使用多个线程/进程进行预测也没有任何意义。

在GPU上是不可能的,因为您的图形存储在GPU中并且占用了硬件。如果您有多个GPU,则可能是一个例外:Keras + Tensorflow: Prediction on multiple gpus

答案 1 :(得分:1)

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

编写一个将与多处理模块一起使用的函数(具有Process或Pool类), 在此函数中,您应该构建模型,张量流图以及所需的任何东西, 设置所有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))

答案 2 :(得分:0)

原因是,您产生的每个过程都将需要模型的新初始化版本,用于进行预测。因此,您必须确保为每个生成的过程实例化/加载模型。绝对不是最佳选择。

这是多处理机器学习训练和/或推理的已知警告。一些库开箱即用地具有多处理功能,并提供对其模型的可并行调用。但是,在大多数库中,一旦要进行多处理,就可以自己完成!

确保一次实例化模型,然后找到一种在流程之间共享该模型的方法。一种基本的实现方法是将模型作为烧瓶服务提供,然后根据您的内心需求对该服务进行预测。干杯!