TF Keras 模型服务于 REST API JSON 输入格式

TF Keras Model Serving REST API JSON Input Format

所以我尝试遵循 this guide 并使用 docker tensorflow 服务图像部署模型。假设有 4 个特征:feat1、feat2、feat3 和 feat4。我试图用这个 JSON body:

来达到预测端点 {url}/predict
{
"instances": 
[
    {
        "feat1": 26,
        "feat2": 16, 
        "feat3": 20.2, 
        "feat4": 48.8
    }
]}

我得到了 400 响应代码:

{
"error": "Failed to process element: 0 key: feat1 of 'instances' list. Error: Invalid argument: JSON object: does not have named input: feat"
}

这是传递给 model.save() 的签名:

signatures = {
      'serving_default':
          _get_serve_tf_examples_fn(model,
                                    tf_transform_output).get_concrete_function(
                                        tf.TensorSpec(
                                            shape=[None],
                                            dtype=tf.string,
                                            name='examples')),
  }

我从这个签名中了解到,在每个实例元素中,唯一被接受的字段是“examples”,但是当我试图只用空字符串传递这个时:

{
    "instances": 
    [
        {
            "examples": ""
        }
    ]
}

我也收到了错误的请求:{"error": "Name: <unknown>, Feature: feat1 (data type: int64) is required but could not be found.\n\t [[{{node ParseExample/ParseExampleV2}}]]"}

我在指南中找不到如何以正确的方式构建 JSON 正文请求,如果有人能指出这一点或提供有关此事的参考,那将非常有帮助。

saved_model_cli show --dir /path/to/model --all 的输出是什么?您应该按照输出序列化您的请求。

我试图通过更改服务输入的签名来解决这个问题,但它引发了另一个异常。这个问题已经解决了,看看.

在该示例中,服务函数需要一个序列化的 tf.train.Example 原型作为输入。 page 解释了如何将二进制数据作为字符串传递给已部署的模型(解释了为什么签名需要字符串张量)。因此,您需要做的是构建一个包含您的功能的示例原型并将其发送过来。它可能看起来像这样:

import base64
import tensorflow was tf

features = {'feat1': 26,, 'feat2': 16, "feat3": 20.2, "feat4": 48.8}

# Create an Example proto from your feature dict.
feature_spec = {
  k: tf.train.Feature(float_list=tf.train.FloatList(value=[float(v)]))
  for k, v in features.items()
}
example = tf.train.Example(
  features=tf.train.Features(feature=feature_spec)).SerializeToString()

# Encode your serialized Example using base64 so it can be added into your
# JSON payload.
b64_example = base64.b64encode(example).decode()
result = [{'examples': {'b64': b64_example}}]