我很难为张量流模型提供服务,这是我使用张量流的对象检测API从预训练的模型中训练得到的。
我已经使用model_main.py
脚本训练了一个模型(Resnet101),性能似乎已经准备好用于生产。因此,我创建了一个运行tensorflow-serve的docker容器。我设法提供了在培训过程结束时创建的模型。我猜该功能是一个安静的新功能,但看来model_main.py
脚本在训练结束时会创建一个servable
。 (我在“ train_dir”中找到了一个名为“ export”的新文件夹,其中包含一个saved_model.pb
以及一个variables variables.data-00000-of-00001
和variables.index
)。但是,我设法为该模型提供服务,并且tensorflow_model_server
的输出看起来像这样:
2018-08-29 07:47:50.268810: I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: my_model version: 123}
2018-08-29 07:47:50.271480: I tensorflow_serving/model_servers/main.cc:327] Running ModelServer at 0.0.0.0:8500 ...
所以服务似乎很有效。
Porblem是,我正在努力用python客户端连接到服务器。我已经修改了tensorflow服务启动示例附带的客户端文件,如下所示:
from __future__ import print_function
# This is a placeholder for a Google-internal import.
import grpc
import tensorflow as tf
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
tf.app.flags.DEFINE_string('server', 'localhost:9000',
'PredictionService host:port')
tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format')
FLAGS = tf.app.flags.FLAGS
def main(_):
channel = grpc.insecure_channel(FLAGS.server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
# Send request
with open(FLAGS.image, 'rb') as f:
# See prediction_service.proto for gRPC request/response details.
data = f.read()
request = predict_pb2.PredictRequest()
request.model_spec.name = 'my_model'
request.model_spec.signature_name = 'serving_default'
request.inputs['serialized_example'].CopyFrom(
tf.contrib.util.make_tensor_proto(data, shape=[1]))
result = stub.Predict(request, 10.0) # 10 secs timeout
print(result)
if __name__ == '__main__':
tf.app.run()
如果我使用正确设置的端口运行此脚本,则会从模块服务器内部收到错误消息:
2018-08-29 08:32:48.426016: W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1275] OP_REQUIRES failed at example_parsing_ops.cc:240 : Invalid argument: Could not parse example input, value: '����
客户端返回一些随机的二进制字符串。但是显然存在连接,请求到达服务器。
在我看来,客户端的请求有问题,但是我不知道如何正确设置它。我没有找到有关默认签名密钥的任何信息,model_main.py
脚本用于导出经过训练的模型并尝试通过使用训练检查点来创建新的可服务对象,而修改后的exporter.py
脚本失败。 / p>
在这种情况下,有人知道如何正确设置客户的请求吗?
答案 0 :(得分:1)
在我的代码库上工作时遇到了完全相同的问题。我发现的解决方案是使用错误的输入类型导出模型。在exporter.py脚本中,用于输入的不同选项是['image_tensor', 'encoded_image_string_tensor', 'tf_example']
。导出模型时,我已经设置了INPUT_TYPE=image_tensor
。使用INPUT_TYPE=encoded_image_string_tensor
导出相同的模型后,客户端和服务器可以正常通信。
答案 1 :(得分:0)
似乎您在调用gRPC端口而不是REST API。 https://www.tensorflow.org/tfx/serving/docker
Port 8500 exposed for gRPC
Port 8501 exposed for the REST API