TensorFlow Обслуживание экспортной подписи без аргументов - PullRequest
1 голос
/ 06 марта 2020

Я хотел бы добавить дополнительную подпись в SavadModel, которая будет возвращать описание бизнеса и предоставлять его с помощью TensorFlow Serving.

@tf.function
def info():
    return json.dumps({
       'name':  'My model',
       'description': 'This is model description.',
       'project': 'Product ABCD',
       'type': 'some_type',
       ...
})

Как написано в руководстве TensorFlow Core https://www.tensorflow.org/guide/saved_model#identifying_a_signature_to_export Я могу легко экспортировать подпись, которая принимает аргументы, обеспечивающие tf.TensorSpe c.

Можно ли экспортировать подпись без аргументов и вызвать ее на сервере?


Добавлено после комментариев @EricMcLachlan:

Когда я пытаюсь вызвать функцию без определенного подпись (input_signature = []) с кодом, подобным следующему:

data = json.dumps({"signature_name": "info", "inputs": None})

headers = {"content-type": "application/json"}
json_response = requests.post('http://localhost:8501/v1/models/my_model:predict', data=data, headers=headers)

Я получаю следующую ошибку в ответе:

'_ content': b '{"error": "Не удалось получить карту ввода для подписи: info"}'

1 Ответ

1 голос
/ 06 марта 2020

Определение подписи:

Я собирался написать свой собственный пример, но вот такой замечательный пример, предоставленный @AntPhitlok в другом StackOverflow post :

class MyModule(tf.Module):
  def __init__(self, model, other_variable):
    self.model = model
    self._other_variable = other_variable

  @tf.function(input_signature=[tf.TensorSpec(shape=(None, None, 1), dtype=tf.float32)])
  def score(self, waveform):
    result = self.model(waveform)
    return { "scores": results }

  @tf.function(input_signature=[])
  def metadata(self):
    return { "other_variable": self._other_variable }

В данном случае они служат модулем, но это могла быть и модель Keras.


Использование сервировки:

Я не на 100% уверен, как получить доступ к порции (я сам еще этого не сделал), но я думаю, что вы сможете получить доступ к порции аналогично этому:

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = model_name
request.model_spec.signature_name = 'serving_default'
request.model_spec.version_label = self.version

tensor_proto = tf.make_tensor_proto(my_input_data, dtype=tf.float32)
request.inputs['my_signatures_input'].CopyFrom(tensor_proto)

try:
    response = self.stub.Predict(request, MAX_TIMEOUT)
except Exception as ex:
    logging.error(str(ex))
    return [None] * len(batch_of_texts)

Здесь я использую gRP C для доступа к серверу TensorFlow.

Возможно, вам придется заменить 'serve_default' на свое имя обслуживания. Аналогично, «my_signature_input» должен соответствовать вводу вашего tf.function (в вашем случае, я думаю, что оно пустое).

Это нормальное стандартное предсказание типа Keras и совмещенное в предикатеpregnt_pb2.PredictRequest. Возможно, потребуется создать собственный Protobuf, но это немного выходит за рамки моих возможностей.

Надеюсь, этого достаточно, чтобы помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...