如何使用flask + uwsgi服务tensorflow模型?

时间:2018-03-12 03:56:38

标签: python tensorflow flask uwsgi

我有一个训练有素的模型,我想用它来预测一些数据并使用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`

有谁能告诉我我做错了什么?

2 个答案:

答案 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帖子:

Theano error deep learning python