我有一些使用TensorFlow服务运行的模型,我希望这些模型能够自我描述,这样我们调用它们的服务就不需要直接嵌入输入大小之类的东西。(例如,我们希望能够交换模型而无需更新下游系统。)
当使用元数据API时,我会返回一个具有签名定义的响应,但是显然这是无法解释的。该模型有效,所以我很确定这不是模型本身的问题。我还在saved_model_cli
TensorFlow模型上试用了该工具,它返回了一个合理的签名定义。
编辑:如果我调用REST API,元数据API也可以正常工作。但是我真的更想弄清楚如何使用gRPC来工作。
编辑,2019年10月21日:我意识到响应中的数据是协议缓冲区编码的消息。如果我理解正确,这意味着我需要使用协议缓冲区数据进行解析。我试过了
from google.protobuf import text_format
text_format.Parse(result.metadata['signature_def'].value,
get_model_metadata_pb2.SignatureDefMap)
但是,这现在返回错误:
ParseError: 2:1 : '>': Expected identifier or number, got >.
较旧的代码:
$ saved_model_cli show --dir mymodel.pb/ --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['input_data'] tensor_info:
dtype: DT_FLOAT
shape: (-1, -1, 286339)
name: input:0
The given SavedModel SignatureDef contains the following output(s):
outputs['output/Softmax:0'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 286338)
name: output/Softmax:0
Method name is: tensorflow/serving/predict
和:
from tensorflow_serving.apis import get_model_metadata_pb2
import grpc
import tensorflow as tf
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
from tensorflow.contrib import util
MODEL_URI = '10.100.55.9:8500'
channel = grpc.insecure_channel(MODEL_URI)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = get_model_metadata_pb2.GetModelMetadataRequest()
request.model_spec.name = 'themodel'
request.model_spec.signature_name = 'serving_default'
request.metadata_field.append('signature_def')
result = stub.GetModelMetadata(request, 1.0)
哪个返回
In [5]: result.metadata['signature_def']
Out[5]:
type_url: "type.googleapis.com/tensorflow.serving.SignatureDefMap"
value: "\n>\n\025__saved_model_init_op\022%\022#\n\025__saved_model_init_op\022\n\n\004NoOp\032\002\030\001\n\271\001\n\017serving_default\022\245\001\nJ\n\007input_1\022?\n\031serving_default_input_1:0\020\001\032 \022\013\010\377\377\377\377\377\377\377\377\377\001\022\013\010\377\377\377\377\377\377\377\377\377\001\022\004\010\224\261\021\022;\n\005dense\0222\n\031StatefulPartitionedCall:0\020\001\032\023\022\013\010\377\377\377\377\377\377\377\377\377\001\022\004\010\223\261\021\032\032tensorflow/serving/predict"
我终于自己弄明白了。可能有一种更优雅的方法来执行此操作,该方法只需要解析我想要的响应部分,而无需转换为JSON然后转换为Python对象来获取所需部分。但这有效,因此我将其发布。
通过对REST API代码进行反向工程,我发现Protocol Buffer库中有一个不错的实用程序功能,可以将Protocol Buffer格式转换为JSON,然后可以通过您选择的Python JSON解析器对其进行解析。
from google.protobuf.json_format import MessageToJson
import simplejson as json
parsed = json.loads(MessageToJson(result))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句