Я пытаюсь сделать подачу большой (размером 1,2 ГБ) моделью с Tensorflow Serving, но получаю:
2017-12-02 21:55:57.711317: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:236] Loading SavedModel from: ...
[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:193] A protocol message was rejected because it was too big (more than 1073741824 bytes). To increase the limit (or to disable these warnings), see CodedInputStream::SetTotalBytesLimit() in google/protobuf/io/coded_stream.h.
2017-12-02 21:55:58.563507: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:284] Loading SavedModel: fail. Took 852178 microseconds.
2017-12-02 21:55:58.563567: E tensorflow_serving/util/retrier.cc:38] Loading servable: {name: 2 version: 2} failed: Data loss: Can't parse .../saved_model.pb as binary proto
Я прочитал несколько связанных с этим проблем на Github несколько лет назад, но в конечном итоге это оказалось не связанным, поскольку Serving использует версию protobuf для C ++. Существует мало информации о развертывании больших моделей с обслуживанием, поэтому любой информации будет достаточно.
Tensorflow Serving был скомпилирован на хост-машине, как и модель, но с использованием python3 (интересно, связано ли это вообще с чем-либо).
Есть ли быстрое решение для этого, или мне нужно покопаться в источниках Serving C ++ и увеличить размер сообщения?
Редактировать по запросу в комментариях:
Я сохраняю модель в соответствии с официальным руководством. Причина, по которой модель такая большая, заключается в том, что у меня сохранен слой внедрения. Вот код сохранения в любом случае:
export_path = 'model/1'
builder = saved_model_builder.SavedModelBuilder(export_path)
signature = predict_signature_def(inputs={'input': input},
outputs={'sent': output})builder.add_meta_graph_and_variables(sess=session,
tags=[tag_constants.SERVING],
signature_def_map={'predict': signature})
builder.save()
Модель читается скомпилированным TF Serving из GitHub на хосте Ubuntu 16.04.
Надеюсь, это кому-нибудь поможет, но я «нашел» решение.
Основная проблема была очевидна; Это модель НЛП, поэтому у нее большой словарный запас. Если оставить словарный запас в определении графа, то разметьте metagraphdef, а protobuf выдает ошибку, когда сталкивается с таким большим протоколом.
Решение было бы поместить словарь в assets_collection. Существует мало документации о том, что вы на самом деле должны делать, но, глядя на saved_model_test.py на официальном репо стоит посмотреть.
Что касается использования ресурсов с Tensorflow Serving, необходимо создать настраиваемый Servable, как описано в Создание нового вида работоспособного официальная документация. Не могу привести конкретный пример, потому что я пока просто упаковал модель в контейнер.
Если у кого-то есть примеры или лучшая стратегия развертывания моделей NLP, я был бы рад обсудить это дальше.
Других решений пока нет …