目录
Keras模型部署服务中遇到的问题及解决方法
问题:
问题描述:flask应用调用模型初次是没问题的,但第二次(或多次)请求会报错误Error - Tensor input_1:0, specified in either feed_devices or fetch_devices was not found in the Graph
原因都是graph不一致造成的。也就是web应用初始化和调用不在一个线程,导致出现两个不同的graph。所以改善方法就是在初始化时保存graph,在模型预测时指定graph。
网上的方法:
第二次调用model的时候,model底层tensorflow的session中还有数据。在调用模型之前加上如下命令:
keras.backend.clear_session()
缺点:每次调用预测时都要load_model,耗费了大量的时间。
参考:https://blog.csdn.net/selfimpro_001/article/details/99693273
解决:
import os
import tensorflow as tf
from dpai.public.module_loader import get_gpu_options
from tensorflow.python.keras.backend import set_session
import keras.backend
from keras.models import load_model
class IntentClassifyModel(object):
def __init__(self):
self.graph = tf.get_default_graph()
config = tf.ConfigProto(gpu_options=get_gpu_options())
self.session = tf.Session(config=config)
self.model = load_model(default_model_path)
def __call__(self, sentence):
with self.graph.as_default():
set_session(self.session)
......(自己的demo)
适用于一个服务运行多个算法服务时:
class IntentClassifyModel(object):
def __init__(self):
self.graph = tf.get_default_graph()
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
self.session = tf.Session(config=config)
with self.graph.as_default():
with self.session.as_default():
print('load')
self.model = load_model(model_path)
print('load done')
self.model.summary()
def __call__(self, sentence):
with self.graph.as_default():
with self.session.as_default():
......(以下为自己的demo)
# result = predict(model, x_test, y_test)
text = text_process(sentence)
y_pred = self.model.predict(text)
y_pred = y_pred.argmax(axis=1)
for i in y_pred:
label = i
return id_label[str(label)]
参考:
https://blog.csdn.net/weixin_40548136/article/details/106716098