我有以下问题。我正在使用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()无法正常工作。我在做什么错了?
答案 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)
原因是,您产生的每个过程都将需要模型的新初始化版本,用于进行预测。因此,您必须确保为每个生成的过程实例化/加载模型。绝对不是最佳选择。
这是多处理机器学习训练和/或推理的已知警告。一些库开箱即用地具有多处理功能,并提供对其模型的可并行调用。但是,在大多数库中,一旦要进行多处理,就可以自己完成!
确保一次实例化模型,然后找到一种在流程之间共享该模型的方法。一种基本的实现方法是将模型作为烧瓶服务提供,然后根据您的内心需求对该服务进行预测。干杯!