我有一个训练有素的模型,我想用它来预测一些数据并使用flask + uwsgi来提供它。一切正常,但是当我点击服务器时,它会抛出一个错误:
File "api.py", line 150, in get_data
im = sess.run(image_tf)
`ValueError: Fetch argument <tf.Tensor 'DecodeJpeg_2:0' shape=(?, ?, 3) dtype=uint8> cannot be interpreted as a Tensor.
(Tensor Tensor("DecodeJpeg_2:0", shape=(?, ?, 3), dtype=uint8)
is not an element of this graph.)`
很少有请求正常工作,但是fe会抛出上述错误。我发现它与tensorflow会话有关但我无法弄清楚如何有效地在烧瓶中使用它。以下是摘录:
config = my_config_pb2.MyConfig()
with tf.gfile.FastGFile('myconfig.pbtxt', 'r') as f:
text_format.Merge(f.read(), config)
sess_config = tf.ConfigProto(
log_device_placement=False,
allow_soft_placement = True
)
sess = tf.Session(config=sess_config)
init_op = tf.global_variables_initializer()
sess.run(init_op)
def load_model():
# Loading model that will be used.
tf.saved_model.loader.load(sess,
[tf.saved_model.tag_constants.SERVING],config.model_path)
graph = tf.get_default_graph()
input_image = graph.get_tensor_by_name('input_image:0')
....
....
params = some parameters
return params
def get_data(im,ftype,params):
try:
img = tf.read_file(im)
image_tf = tf.image.decode_jpeg(img, channels=3)
except Exception as e:
print ("## Got Exception while reading: ", e)
return None
im = sess.run(image_tf)
pred = sess.run(....)
return pred
params = load_model(sess)
@app.route("/data", methods=['GET', 'POST'])
def data():
if request.method == 'GET':
url = request.args.get('path')
print ("##","recieved")
if not path:
abort(400)
pred = get_data(image,"url",params)
return pred
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True, port=8011,use_reloader=False)
最后我使用以下方式运行应用程序:
`uwsgi --http 0.0.0.0:8011 --wsgi-file api.py --master --processes 4 --threads 2 --callable app --lazy --lazy-apps`
有谁能告诉我我做错了什么?
答案 0 :(得分:1)
原因是uwsgi分叉进程运行多个&#34;副本&#34;你的应用程序。
但是,您可以在该上下文之外实例化图形。您的可调用内容为app
,因此应在其中实例化模型。
您可以使用before_first_request
回调来加载模型。
此博客文章可以方便地了解如何设置它: https://networklore.com/start-task-with-flask/
相关瓶文件:http://flask.pocoo.org/docs/0.12/api/#flask.Flask.before_first_request
答案 1 :(得分:0)
您好,您已经解决问题了吗?我遇到过类似的问题,使用Keras可以使用Theano代替Tensorflow来解决此问题。
我必须将以下代码添加到脚本中,并使用KERAS_BACKEND=theano python myprogram.py
在Linux OS上运行该程序。
import theano
theano.config.optimizer="None"
请参阅以下stackoverflow帖子: