如何从提供的TensorFlow模型中获取元数据?

问题描述 投票:0回答:1

我有一些使用TensorFlow服务运行的模型,我希望这些模型可以自我描述,这样我们调用它们的服务不需要直接嵌入输入大小之类的东西。 (例如,我们希望能够交换模型而不更新下游系统。)

当我使用元数据API时,我得到一个具有签名定义的响应,但是显然这是无法解释的。该模型有效,所以我很确定这不是模型本身的问题。我还尝试了TensorFlow模型上的saved_model_cli工具,它返回了可靠的签名定义。

编辑:如果我调用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"

我有一些使用TensorFlow服务运行的模型,我希望这些模型可以自我描述,这样我们调用它们的服务不需要直接嵌入输入大小之类的东西。 (例如,...

python tensorflow tensorflow-serving
1个回答
1
投票

我终于自己弄清楚了。可能有一种更优雅的方法来执行此操作,该方法只需要解析我想要的响应部分,而无需转换为JSON然后转换为Python对象来获取所需部分。但这有效,所以我将其发布。

© www.soinside.com 2019 - 2024. All rights reserved.