gpt4 book ai didi

rest - TensorFlow Serving REST API 的正确负载

转载 作者:行者123 更新时间:2023-12-02 04:05:02 28 4
gpt4 key购买 nike

我已将 Keras 模型转换为 Tensorflow 估计器,将 Tensorflow Transform 添加到图表中,然后导出模型以供服务。

当我检查模型签名时,我可以看到以下信息:

signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['examples'] tensor_info:
dtype: DT_STRING
shape: (-1)
name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
outputs['specialities'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 154)
name: specialities/Softmax:0
Method name is: tensorflow/serving/predict

我使用 tf.estimator.export.build_parsing_serving_input_receiver_fn 转换了功能规范,因此签名中输入节点的名称为 example。我的模型中输入节点的名称是“procedures”。

然后我使用 saved_model_cli 手动测试导出的模型,一切看起来都很好(我得到了概率列表)

!saved_model_cli run --dir=/model_dir/1533849825 
--tag_set serve
--signature_def serving_default
--input_examples 'examples=[{"procedures": ["99214,17000,17000,13121,99203"]}]'

现在,我将此模型加载到 TF Serving 中,模型服务器启动正常。

当我使用下面的 json 负载 (application/json) 请求模型预测时,出现以下错误:

{
"signature_name":"serving_default",
"instances":[
{
"examples":["99214,17000,17000,13121,99203"]
}
]
}

错误:

"error": "Expected serialized to be a vector, got shape: [1,1]

不同的有效负载结构会导致此错误

{
"signature_name":"serving_default",
"examples":[
{
"procedure":["99214,17000,17000,13121,99203"]
}
]
}

错误:

"error": "JSON Value: {\n    \"signature_name\": \"serving_default\",\n    
\"examples\": [\n {\n \"procedures\":
["99214,17000,17000,13121,99203"]]\n }\n ]\n} not formatted
correctly. Expecting object with \'instances\' key and a list/array as the value."

在此预测案例中,TensorFlow Serving 请求的正确负载格式是什么?

有效负载是否需要格式化为 tf.Example 结构?

最佳答案

我在这里给出了一个Estimator api的例子,希望它可以帮助那些遇到类似问题的人。

要使用 Estimator 导出 SavedModel,您需要一个 input_receiver_fn 来在服务时接受输入。我的应用程序中的 input_receiver_fn 如下:

def _serving_input_receiver_fn():
serialized_tf_sample = tf.placeholder(dtype=tf.string,
shape=None, name='input_example_tensor')
receiver_tensors = {'example': serialized_tf_sample}
# example_proto: {'feature_name': tf.VarLenFeature(tf.int64),}
features = tf.parse_example(serialized_tf_sample, example_proto)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

您可以将以下代码放在train_and_evaluate下以导出SavedModel

estimator.export_savedmodel(model_export_path, _serving_input_receiver_fn)

要为模型提供服务,您可以拉取 tensorflow/serving docker 镜像,您可以引用https://www.tensorflow.org/serving/docker求助。 (我建议你用 devel 标签拉取镜像,这样调试起来更好)

只需运行以下命令即可开始服务

/usr/local/bin/tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=my_model --model_base_path my_model_path

客户端代码很简单,但是要小心。因为序列化的示例应该使用base64编码并添加b64 key 。

import requests
resp = requests.post('http://host:8501/v1/models/my_model:predict', json={
'instances': [
{'example': {'b64':base64.b64encode(single_example.SerializeToString())}}
]})
resp.json()

如果您有任何疑问,请在下面评论。

关于rest - TensorFlow Serving REST API 的正确负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com