TensorFlow: как и почему использовать SavedModel

У меня есть несколько вопросов относительно API SavedModel, чья документация, которую я нахожу, оставляет много деталей необъяснимым.

Первые три вопроса о том, чтобы перейти к аргументам add_meta_graph_and_variables() метод tf.saved_model.builder.SavedModelBuilder, а четвертый вопрос о том, почему использовать SavedModel API над tf.train.Saver.

  1. Каков формат аргумента signature_def_map? Должен ли я обычно устанавливать этот аргумент при сохранении модели?

  2. Аналогично, Каков формат аргумента assets_collection?

  3. Почему вы сохраняете список тегов с помощью metagraph, а не просто присваиваете ему имя (т.е. Прикрепляете к нему только один уникальный тег)? Почему я должен добавить несколько тегов в данный метаграф? Что делать, если я пытаюсь загрузить metagrpah из pb определенным тегом, но несколько metagraphs в этом pb соответствуют этому тегу?

  4. В документации утверждается, что рекомендуется использовать SavedModel для сохранения целых моделей (в отличие от переменных) только в автономных файлах. Но tf.train.Saver также сохраняет граф в дополнение к переменным в файле .meta. Итак, каковы преимущества использования SavedModel? В документации говорится:

Когда вы хотите сохранять и загружать переменные, график и метаданные графика - в основном, когда вы хотите сохранить или восстановить свою модель, мы рекомендуем использовать SavedModel. SavedModel - это нейтральный по языку, восстанавливаемый, герметичный формат сериализации. SavedModel позволяет системам и инструментам более высокого уровня производить, потреблять и преобразовывать модели TensorFlow.

но это объяснение довольно абстрактно и на самом деле не помогает мне понять, каковы преимущества SavedModel. Какие конкретные примеры, где SavedModel (в отличие от tf.train.Saver) лучше использовать?

Обратите внимание, что мой вопрос не является дубликатом этого вопроса. Я не спрашиваю, как сохранить модель, я SavedModel очень конкретные вопросы о свойствах SavedModel, который является лишь одним из множества механизмов, которые TensorFlow обеспечивает для сохранения и загрузки моделей. Ни один из ответов в связанном вопросе не затрагивает API SavedModel (который, опять же, не совпадает с tf.train.Saver).

Ответ 1

Я пытаюсь использовать tf.saved_model а также нашел те же tf.saved_model (тоже) абстрактные. Здесь мой удар по полному ответу на ваши вопросы:

1. signature_def_map:

а. Формат См. Ответ Tom для Tensorflow: как сохранить/восстановить модель. (Ctrl-F для "tf.saved_model" - в настоящее время в его ответе используются только фразы по этому вопросу).

б. Мне нужно понять, что вам это обычно нужно. Если вы собираетесь использовать модель, вам необходимо знать входы и выходы графика. Я думаю, что это сродни сигнатуре функции C++: если вы намереваетесь определить функцию после ее вызова или в другом файле C++, вам нужна подпись в вашем основном файле (т.е. Прототип или в файле заголовка).

2. assets_collection:

format: Не удалось найти четкую документацию, поэтому я пошел в исходный код компоновщика. Похоже, что аргумент является итерабельным из dtype=tf.string, где каждый Тензор - это путь к каталогу активов. Таким образом, коллекция TensorFlow Graph должна работать. Я предполагаю, что это тег параметров, но из исходного кода я ожидал бы, что list Python тоже будет работать.

(Вы не спросили, нужно ли вам установить его, но, судя по ответам Зои " Что такое активы в тензорном потоке" и iga, ответьте на касательно касающуюся Tensorflow, обслуживающую: "Нет ресурсов для сохранения/записи" при экспорте моделей, обычно требуется установить.)

3. Метки:

а. Почему список я не знаю, почему вы должны передать список, но вы можете передать список с одним элементом. Например, в моем текущем проекте я использую только тег [tf...tag_constants.SERVING].

б. Когда использовать несколько слов, вы используете явное размещение устройств для операций. Возможно, вы хотите сохранить версию процессора и версию графического процессора вашего графического процессора. Очевидно, что вы хотите сохранить обслуживающую версию каждого и сказать, что хотите сохранить контрольные точки обучения. Вы можете использовать тег CPU/GPU и тег тренировки/обслуживания для управления всеми случаями. Документы подсказывают:

Каждый MetaGraphDef, добавленный в SavedModel, должен быть аннотирован указанными тегами. Теги предоставляют средство для идентификации конкретного MetaGraphDef для загрузки и восстановления вместе с общим набором переменных и активов. Эти теги обычно аннотируют MetaGraphDef с его функциональностью (например, службой или обучением) и, необязательно, с конкретными аппаратными аспектами (например, графическим процессором).

с. Столкновение Слишком ленив, чтобы заставить столкновение себя - я вижу два случая, которые нужно было бы адресовать - я пошел в исходный код загрузчика. Внутри def load вы увидите:

saved_model = _parse_saved_model(export_dir)
found_match = False
for meta_graph_def in saved_model.meta_graphs:
  if set(meta_graph_def.meta_info_def.tags) == set(tags):
    meta_graph_def_to_load = meta_graph_def
    found_match = True
    break

if not found_match:
  raise RuntimeError(
      "MetaGraphDef associated with tags " + str(tags).strip("[]") +
      " could not be found in SavedModel. To inspect available tag-sets in"
      " the SavedModel, please use the SavedModel CLI: 'saved_model_cli'"
  )

Мне кажется, что он ищет точное совпадение. Например, у вас есть metagraph с тегами "GPU" и "Serving" и metagraph с тегом "Обслуживание". Если вы загрузите "Обслуживание", вы получите последний абзац. С другой стороны, скажем, у вас есть metagraph "GPU" и "Serving" и metagraph "CPU" и "Serving". Если вы попытаетесь загрузить "Обслуживание", вы получите сообщение об ошибке. Если вы попытаетесь сохранить два метка с одинаковыми тегами в одной папке, я ожидаю, что вы перезапишете первый. Это не похоже, что код сборки обрабатывает такое столкновение каким-либо особым образом.

4. SavedModel или tf.train.Saver:

Это тоже смутило меня. Ответ wicke: Должны ли пользователи TensorFlow использовать SavedModel через контрольную точку или GraphDef? прояснил это для меня. Я брошу свои два цента:

В области локального Python + TensorFlow вы можете сделать tf.train.Saver делать все. Но это будет стоить вам. Позвольте мне изложить пример использования save-a-training-model-and-deploy. Вам понадобится ваш объект-хранитель. Легче всего настроить его, чтобы сохранить полный график (каждая переменная). Вероятно, вы не хотите сохранять .meta все время, пока работаете со статическим графиком. Вы должны указать это в своем учебном крюке. Вы можете прочитать об этом на cv-трюках. Когда ваше обучение закончится, вам понадобится преобразовать файл контрольной точки в файл pb. Это обычно означает очистку текущего графика, восстановление контрольной точки, замораживание переменных до констант с помощью tf.python.framework.graph_util и запись его с помощью tf.gfile.GFile. Вы можете прочитать об этом на среде. После этого вы хотите развернуть его на Python. Вам понадобятся входные и выходные имена тензоров - имена строк в графе def. Вы можете прочитать об этом на метафлоу (на самом деле очень хорошее сообщение в блоге для метода tf.train.Saver). Некоторые операционные узлы позволят вам легко загружать данные в них. Некоторые не так много. Я обычно отказывался от поиска подходящего узла и добавлял tf.reshape который на самом деле не переписывал ничего в def. Это был мой входной узел ad ad hoc. То же самое для вывода. И, наконец, вы можете развернуть свою модель, по крайней мере, локально в Python.

Или вы можете использовать ответ, который я связал в пункте 1, чтобы выполнить все это с SavedModel API SavedModel. Меньше головных болей благодаря ответу Тома. В будущем вы получите больше поддержки и функций, если они когда-либо будут документированы соответствующим образом. Похоже, что проще использовать командную строку (средние ссылки покрывают это с помощью Saver - выглядит жестко, удачи!). Он практически запекался к новым Оценщикам. И согласно Документам,

SavedModel - это нейтральный по языку, восстанавливаемый, герметичный формат сериализации.

Акцент мой: Похоже, вы можете гораздо легче получить свои обученные модели в растущий API C++.

То, как я это вижу, похоже на API Datasets. Это просто проще, чем по-старому!

Что касается конкретных примеров SavedModel tf.train.Saver: если "в принципе, когда вы хотите сохранить или восстановить свою модель" недостаточно ясно для вас: правильное время для его использования в любое время облегчает вашу жизнь, Для меня это выглядит как всегда. Особенно, если вы используете Оценщики, развертывание в C++ или использование командной строки.

Так что мои исследования по вашему вопросу. Или четыре перечисленных вопроса. Эрр, восемь вопросительных знаков. Надеюсь это поможет.