【问题标题】:Error when serving attention_ocr model ("error": "Expected one or two output Tensors, found 17")服务 attention_ocr 模型时出错 ("error": "Expected one or two output Tensors, found 17")
【发布时间】:2020-09-17 05:50:36
【问题描述】:

我正在尝试使用 tensorflow/serving 图像在 docker 上为 attention_ocr model 提供服务。

首先,我用自己的数据集训练了这个模型,用demo_inference.py得到了很好的结果

所以,我将使用 export_model.py
python export_model.py --checkpoint=model.ckpt-111111 --export_dir=/tmp/mydir 导出训练好的模型

然后,运行 docker 容器为模型提供服务。
docker run -it --rm -p 8501:8501 -v /tmp/mydir:/models/aocr -e MODEL_NAME=aocr --gpus all tensorflow/serving

这是我的 python 客户端脚本。

data_dir = '/root/src/models/research/attention_ocr/python/datasets/data/demo/'

data_files = os.listdir(data_dir)

with open(data_dir + "0.jpg", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

## Some requests I tried ##
# predict_request = '{"examples": [{"inputs": ["%s"]}]}' % encoded_string
# predict_request = '{"examples": [{"inputs": "%s"}]}' % encoded_string
predict_request = '{"examples": [{"inputs": {"b64": ["%s"]}}]}' % encoded_string

r = requests.post('http://MY_IP_ADDR:8501/v1/models/aocr:classify', data=predict_request)
print(r.text)

结果.."error": "Expected one or two output Tensors, found 17"

这是第一次使用 tensorflow/serving。我无法处理这个错误。

请帮助这个新手.. 提前致谢。

【问题讨论】:

    标签: python docker tensorflow tensorflow-serving tensorflow-model-garden


    【解决方案1】:

    感谢您报告此问题。我代表您在 Github 上提交了一个错误 (#9264)。问题是默认签名包括模型提供的所有端点。如果要使用 Serving 的分类 API,我们需要修改 export_model 脚本以仅导出分类 API 预期的 2 个张量(即预测和分数)。同时,您可以使用Predict API,它支持任意数量的输出张量。请注意,通过 GRPC 使用预测 API 时,您可以指定 output_filter,但 RESTful API 没有该选项,因此响应非常繁重,因为它会发回所有注意力掩码和原始图像。如果其他人试图弄清楚如何进行推理,这里有一些对我有用的步骤。

    1. 导出模型:
    wget http://download.tensorflow.org/models/attention_ocr_2017_08_09.tar.gz
    tar -xzvf attention_ocr_2017_08_09.tar.gz
    python model_export.py --checkpoint=model.ckpt-399731 \
      --export_dir=/tmp/aocr_b1 --batch_size=1
    

    请注意,由于model_export.py 中的错误,需要--batch_size=1。签名问题发送 PR 时我会处理的。

    1. 运行 docker 容器为模型提供服务。
    sudo docker run -t --rm -p 8501:8501 \
      -v /tmp/aocr_b1:/models/aocr/1 -e MODEL_NAME=aocr tensorflow/serving
    

    请注意,路径需要包含版本号/models/aocr/1。如果您不附加/1,服务器会抱怨它找不到任何版本。

    1. 运行脚本
    python send_serving_request.py --image_file=testdata/fsns_train_00.png
    

    这是结果

    Prediction: Rue de la Gare░░░░░░░░░░░░░░░░░░░░░░░
    Confidence: 0.899479449
    

    代码如下:

    send_serving_request.py

    from absl import app
    from absl import flags
    import base64
    import json
    import os
    from PIL import Image
    import numpy as np
    import requests
    import tensorflow as tf
    
    flags.DEFINE_string('image_file', None,
                        'Name of file containing image to request.')
    
    
    def create_serialized_tf_example(image):
      """Create a serialized tf.Example proto for feeding the model."""
      example = tf.train.Example()
      example.features.feature['image/encoded'].float_list.value.extend(
          list(np.reshape(image, (-1))))
      return example.SerializeToString()
    
    
    def main(_):
      pil_image = Image.open(flags.FLAGS.image_file)
      encoded_string = base64.b64encode(
          create_serialized_tf_example(np.asarray(pil_image)))
      predict_request = (
          b'{"instances": [{"inputs": {"b64": "%s"}}]}') % encoded_string
      r = requests.post(
          'http://localhost:8501/v1/models/aocr:predict', data=predict_request)
      data = json.loads(r.text)
      print('Prediction:', data['predictions'][0]['predicted_text'])
      print('Confidence:', data['predictions'][0]['normalized_seq_conf'])
    
    
    if __name__ == '__main__':
      flags.mark_flag_as_required('image_file')
      app.run(main)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2021-03-03
      • 2021-04-27
      • 2021-07-18
      • 2017-07-30
      • 1970-01-01
      • 2021-02-08
      • 2017-08-02
      相关资源
      最近更新 更多