TensorFlow: как заморозить модель и обслужить ее с помощью API Python

Мы собираемся изучить две части использования модели машинного обучения в производстве:

  • Как экспортировать модель и получить для нее простой самодостаточный файл
  • Как создать простой сервер Python (с использованием фляги), чтобы обслуживать его с помощью TF

Примечание: если вы хотите увидеть, какой график я сохраняю / загружаю / замораживаю, вы можете здесь

Как заморозить (экспортировать) сохраненную модель

Если вам интересно, как сохранить модель с помощью TensorFlow, прочтите, пожалуйста, мою предыдущую статью, прежде чем продолжить.

Давайте начнем с папки, содержащей модель, она, вероятно, выглядит примерно так:

Здесь важны файлы .chkp, . Если вы хорошо помните, для каждой пары на разных временных шагах одна содержит веса («.data»), а другая («.meta» ) содержит график и все его метаданные (чтобы вы могли его переобучить и т. д.)

Но когда мы хотим использовать модель в производстве, нам не нужны какие-либо специальные метаданные, чтобы загромождать наши файлы, мы просто хотим, чтобы наша модель и ее веса были красиво упакованы в один файл. Это упрощает хранение, управление версиями и обновление ваших различных моделей.

К счастью, в TF мы можем легко создать для этого нашу собственную функцию. Давайте рассмотрим различные шаги, которые нам нужно выполнить:

  • Получите наш сохраненный график: нам нужно загрузить ранее сохраненный мета-график в график по умолчанию и получить его graph_def (определение ProtoBuf нашего графика)
  • Восстановить веса: мы запускаем сеанс и восстанавливаем веса нашего графа внутри этого сеанса.
  • Удалите все метаданные, бесполезные для вывода: здесь TF помогает нам с помощью красивой вспомогательной функции, которая захватывает то, что необходимо на вашем графике для выполнения вывода, и возвращает то, что мы назовем нашим новым «замороженным graph_def».
  • Сохраните его на диск: наконец, мы сериализуем наш замороженный граф_def ProtoBuf и выгружаем его на диск

Обратите внимание, что первые два шага такие же, как и при загрузке любого графика в TF, единственной сложной частью на самом деле является «замораживание» графика, и TF имеет встроенную функцию для этого!

Я предлагаю немного другую версию, более простую и удобную. Исходная функция freeze_graph, предоставляемая TF, установлена ​​в вашем bin каталоге и может быть вызвана напрямую, если вы использовали PIP для установки TF. Если нет, вы можете вызвать его прямо из папки (см. Прокомментированный импорт в сути).

Итак, давайте посмотрим:

Теперь мы видим новый файл в нашей папке: «frozen_model.pb».

Как и ожидалось, его размер больше, чем размер файла весов, и меньше, чем сумма размеров файлов двух контрольных точек.

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

Как использовать замороженную модель

Естественно, зная, как заморозить модель, можно задаться вопросом, как ее использовать.

Небольшая хитрость, которую следует иметь в виду, - это понять, что мы сбросили на диск файл graph_def ProtoBuf. Итак, чтобы импортировать его обратно в скрипт Python, нам необходимо:

  • Сначала импортируйте Graph_def ProtoBuf
  • Загрузите этот graph_def в реальный график

Для этого мы можем создать удобную функцию:

Теперь, когда мы создали нашу функцию для загрузки замороженной модели, давайте создадим простой скрипт, чтобы наконец ее использовать:

Примечание: при загрузке замороженной модели все операции начинались с префикса «префикс». Это связано с параметром «name» в функции «import_graph_def», по умолчанию он ставит перед всем префикс «import».

Это может быть полезно, чтобы избежать конфликтов имен, если вы хотите импортировать свой graph_def в существующий график.

Как создать (очень) простой API

В этой части я позволю коду говорить сам за себя. В конце концов, это серия TF о TF, а не столько о том, как построить сервер на python. Тем не менее, без этого он казался незавершенным, так что вот и последний рабочий процесс:

Примечание. В этом примере мы используем колбу

Серия лучших практик TensorFlow

Эта статья является частью более полной серии статей о TensorFlow. Я еще не определил все различные темы этой серии, поэтому, если вы хотите увидеть какую-либо область исследования TensorFlow, добавьте комментарий! Пока что я хотел изучить эти предметы (этот список может быть изменен и не имеет определенного порядка):

Примечание. TF сейчас быстро развивается, эти статьи в настоящее время написаны для версии 1.0.0.

использованная литература