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}}]
所以我尝试遵循 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}}]