【发布时间】:2018-06-15 06:09:32
【问题描述】:
一旦我有一个服务于多个模型的 TF 服务器,有没有办法查询这样的服务器以了解服务的模型?
那么是否有可能获得有关每个此类模型的信息,例如名称、接口,甚至更重要的是,服务器上存在哪些模型版本并且可能提供服务?
【问题讨论】:
标签: tensorflow tensorflow-serving
一旦我有一个服务于多个模型的 TF 服务器,有没有办法查询这样的服务器以了解服务的模型?
那么是否有可能获得有关每个此类模型的信息,例如名称、接口,甚至更重要的是,服务器上存在哪些模型版本并且可能提供服务?
【问题讨论】:
标签: tensorflow tensorflow-serving
确实很难找到有关此的一些信息,但有可能获得一些模型元数据。
request = get_model_metadata_pb2.GetModelMetadataRequest()
request.model_spec.name = 'your_model_name'
request.metadata_field.append("signature_def")
response = stub.GetModelMetadata(request, 10)
print(response.model_spec.version.value)
print(response.metadata['signature_def'])
希望对你有帮助。
可以从 REST API 获取这些信息。刚刚得到
http://{serving_url}:8501/v1/models/{your_model_name}/metadata
结果是json,在这里你可以很容易地找到模型规范和签名定义。
【讨论】:
可以获得模型状态以及模型元数据。在另一个答案中,仅请求元数据并且响应 response.metadata['signature_def'] 仍需要解码。
我发现解决方案是使用内置的protobuf方法MessageToJson()转换为json字符串。然后可以将其转换为带有json.loads()的python字典
import grpc
import json
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
from tensorflow_serving.apis import model_service_pb2_grpc
from tensorflow_serving.apis import get_model_status_pb2
from tensorflow_serving.apis import get_model_metadata_pb2
from google.protobuf.json_format import MessageToJson
PORT = 8500
model = "your_model_name"
channel = grpc.insecure_channel('localhost:{}'.format(PORT))
request = get_model_status_pb2.GetModelStatusRequest()
request.model_spec.name = model
result = stub.GetModelStatus(request, 5) # 5 secs timeout
print("Model status:")
print(result)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = get_model_metadata_pb2.GetModelMetadataRequest()
request.model_spec.name = model
request.metadata_field.append("signature_def")
result = stub.GetModelMetadata(request, 5) # 5 secs timeout
result = json.loads(MessageToJson(result))
print("Model metadata:")
print(result)
【讨论】:
要继续解码过程,可以按照 Tyler 的方法将消息转换为 JSON,或者更本机地解包到 SignatureDefMap 并从那里获取
signature_def_map = get_model_metadata_pb2.SignatureDefMap()
response.metadata['signature_def'].Unpack(signature_def_map)
print(signature_def_map.signature_def.keys())
【讨论】:
要使用 REST API 请求数据,对于所服务的特定模型的附加数据,您可以发出(通过 curl、Postman 等):
GET http://host:port/v1/models/${MODEL_NAME}
GET http://host:port/v1/models/${MODEL_NAME}/metadata
【讨论】: