Тензор не найден с пустым именем при обслуживании модели - PullRequest
0 голосов
/ 17 сентября 2018

Системная информация

  • Linux Ubuntu 16.04 :
  • TensorFlow Serving установлен из пункта (1.10.1):
  • Версия обслуживания TensorFlow 1.10.1 :

Опишите проблему

Я обнаружил сообщение об ошибке при подключении к собственной модели, я протестировал файл .pb с save_model.load, и все хорошо, но когда я отправляю запрос через клиента, появляется следующая ошибка:

<_ Рандеву РПЦ, которое заканчивается: status = StatusCode.INVALID_ARGUMENT details = "Тензор: 0, указанный в feed_devices или fetch_devices, не найден в графике" debug_error_string = "{" созданный ":" @ 1537040456.210975912 "," описание ":" Ошибка, полученная от узла "," файл ":" src / core / lib / surface / call.cc "," file_line ": 1099," grpc_message ":" <strong>Тензор: 0 , указанный в feed_devices или fetch_devices, не найден в графике "," grpc_status ": 3}" >

Проводная часть, о которой сообщается, что Тензор не найден, не имеет имени, которое, я думаю, вызвано тем, что клиент просит ввести этот пустой тензор. Но я просто не понимаю, откуда может произойти эта операция.

Точные шаги для воспроизведения

Я создаю обслуживание на основе примера кода клиента mnist и начального клиента. Экспортированная модель .pb была успешно протестирована путем перезагрузки через tf.saved_model.loader.load, поэтому я думаю, что проблема вызвана запросом.

Это часть кода клиента:

channel = grpc.insecure_channel(FLAGS.server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'chiron'
request.model_spec.signature_name = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
collector = _Result_Collection()
for batch_x,seq_len,i,f,N,reads_n in data_iterator(FLAGS.raw_dir):
    request.inputs['signals'].CopyFrom(
        tf.contrib.util.make_tensor_proto(batch_x, shape=[FLAGS.batch_size, CONF.SEGMENT_LEN]))
    request.inputs['seq_length'].CopyFrom(
        tf.contrib.util.make_tensor_proto(seq_len, shape=[FLAGS.batch_size]))
    result_future = stub.Predict.future(request, 5.0)  # 5 seconds
    result_future.add_done_callback(_post_process(collector,i,f))

1 Ответ

0 голосов
/ 19 сентября 2018

Я нашел причину, потому что при создании TensorProto для SparseTensor ему не присваивается имя. Смотрите здесь также: https://github.com/tensorflow/serving/issues/1100 Таким образом, решение было бы построить TensorProto для разреженного тензора отдельно:

import tensorflow as tf
signal =  tf.constant([[[1]]])
sequence_length = tf.constant([1])
output,log_prob = tf.nn.ctc_beam_search_decoder(signal,sequence_length)
indices = output[0].indices
values = output[0].values
dense_shape = output[0].dense_shape
indices_tensor_proto = tf.saved_model.utils.build_tensor_info(indices)
values_tensor_proto = tf.saved_model.utils.build_tensor_info(values)
dense_shape_tensor_proto = tf.saved_model.utils.build_tensor_info(dense_shape)
...