[英]Serving a trained object detection model with tensorflow serve
我很難為 tensorflow 模型提供服務,我已經使用 tensorflow 的對象檢測 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 ...
所以服務似乎有效。
問題是,我正在努力使用 python 客戶端連接到服務器。 我已經修改了 tensorflow serve inception 示例附帶的客戶端文件,如下所示:
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
腳本失敗。
在這種情況下,有人知道如何正確設置客戶的請求嗎?
似乎您正在調用 gRPC 端口而不是 REST API 端口。 https://www.tensorflow.org/tfx/serving/docker
Port 8500 exposed for gRPC
Port 8501 exposed for the REST API
我在處理代碼庫時遇到了完全相同的問題。 我發現的解決方案是該模型是使用錯誤的輸入類型導出的。 在 exporter.py 腳本中,輸入的不同選項是['image_tensor', 'encoded_image_string_tensor', 'tf_example']
。 當我導出模型時,我設置了INPUT_TYPE=image_tensor
。 使用INPUT_TYPE=encoded_image_string_tensor
導出相同的模型后,客戶端和服務器通信就好了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.