Определение подписи:
Я собирался написать свой собственный пример, но вот такой замечательный пример, предоставленный @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, но это немного выходит за рамки моих возможностей.
Надеюсь, этого достаточно, чтобы помочь вам.