TensorFlow REST前端但不是TensorFlow服务
python
tensorflow
tensorflow-serving
5
0

我想部署一个简单的TensorFlow模型并在Flask这样的REST服务中运行它。到目前为止在github或此处都找不到很好的例子。

我还没有准备好按照其他帖子中的建议使用TF Serving,它是Google的完美解决方案,但是对于我使用gRPC,bazel,C ++编码,protobuf的任务来说,这是过分的...

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我不喜欢在flask restful文件中放置太多用于数据/模型处理的代码。我通常分别有tf模型类,依此类推。 可能是这样的:

# model init, loading data
cifar10_recognizer = Cifar10_Recognizer()
cifar10_recognizer.load('data/c10_model.ckpt')

@app.route('/tf/api/v1/SomePath', methods=['GET', 'POST'])
def upload():
    X = []
    if request.method == 'POST':
        if 'photo' in request.files:
            # place for uploading process workaround, obtaining input for tf
            X = generate_X_c10(f)

        if len(X) != 0:
            # designing desired result here
            answer = np.squeeze(cifar10_recognizer.predict(X))
            top3 = (-answer).argsort()[:3]
            res = ([cifar10_labels[i] for i in top3], [answer[i] for i in top3])

            # you can simply print this to console
            # return 'Prediction answer: {}'.format(res)

            # or generate some html with result
            return fk.render_template('demos/c10_show_result.html',
                                      name=file,
                                      result=res)

    if request.method == 'GET':
        # in html I have simple form to upload img file
        return fk.render_template('demos/c10_classifier.html')

cifar10_recognizer.predict(X)是简单的函数,在tf会话中运行预测操作:

    def predict(self, image):
        logits = self.sess.run(self.model, feed_dict={self.input: image})
        return logits

ps从文件保存/恢复模型是一个非常漫长的过程,请在处理发布/获取请求时避免这种情况

收藏
评论

有不同的方法可以做到这一点。纯粹地,使用张量流不是很灵活,但是相对简单。这种方法的缺点是,您必须重建图并在还原模型的代码中初始化变量。在tensorflow skflow / contrib learning中显示了一种更优雅的方法,但是目前看来这并不起作用,并且文档已经过时了。

我在这里的 github上放了一个简短的示例,展示了如何将GET或POST参数命名为烧瓶REST部署的tensorflow模型。

然后,主代码位于一个函数中,该函数根据POST / GET数据获取字典:

@app.route('/model', methods=['GET', 'POST'])
@parse_postget
def apply_model(d):
    tf.reset_default_graph()
    with tf.Session() as session:
        n = 1
        x = tf.placeholder(tf.float32, [n], name='x')
        y = tf.placeholder(tf.float32, [n], name='y')
        m = tf.Variable([1.0], name='m')
        b = tf.Variable([1.0], name='b')
        y = tf.add(tf.mul(m, x), b) # fit y_i = m * x_i + b
        y_act = tf.placeholder(tf.float32, [n], name='y_')
        error = tf.sqrt((y - y_act) * (y - y_act))
        train_step = tf.train.AdamOptimizer(0.05).minimize(error)

        feed_dict = {x: np.array([float(d['x_in'])]), y_act: np.array([float(d['y_star'])])}
        saver = tf.train.Saver()
        saver.restore(session, 'linear.chk')
        y_i, _, _ = session.run([y, m, b], feed_dict)
    return jsonify(output=float(y_i))
收藏
评论

这个github项目显示了一个还原模型检查点并使用Flask的工作示例。

@app.route('/api/mnist', methods=['POST'])
def mnist():
    input = ((255 - np.array(request.json, dtype=np.uint8)) / 255.0).reshape(1, 784)
    output1 = simple(input)
    output2 = convolutional(input)
    return jsonify(results=[output1, output2])

在线演示似乎很快。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号