【问题标题】:Using model.predict (Keras + TF) in multiprocessing在多处理中使用 model.predict (Keras + TF)
【发布时间】:2018-10-18 10:25:46
【问题描述】:

我有以下问题。我正在使用 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() 无法正常工作。我做错了什么?

【问题讨论】:

  • tensorflow后端构建的计算图存在于python框架之外。以这种方式使用多处理不会构建图的多个副本。您仍然只有一个模型副本,并试图一次发送 4 个数据流。
  • James 是对的,考虑在前台进程运行预测并在后台运行线程/进程以收集您的下一个数据帧。您可以缓冲多个数据帧,将它们放在网络输入的批处理维度中
  • okey 然后通过线程收集数据似乎是正确的方法。所以一般来说不可能运行例如多个进程中的多个预测?

标签: python tensorflow keras multiprocessing


【解决方案1】:

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

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

例如:

    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】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2019-02-12
      • 2023-04-03
      相关资源
      最近更新 更多