Обслуживание модели TensorFlow

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

В этом руководстве показано, как использовать компоненты TensorFlow Serving для экспорта обученной модели TensorFlow и использования стандартного tensorflow_model_server для ее обслуживания. Если вы уже знакомы с TensorFlow сервировки, и вы хотите узнать больше о том , как работает сервер Внутренность см TensorFlow сервировки продвинутого учебника .

В этом руководстве используется простая модель регрессии Softmax, которая классифицирует рукописные цифры. Он очень похож на тот , введенной в TensorFlow учебник по классификации изображений с использованием набора данных моды MNIST .

Код этого руководства состоит из двух частей:

  • Python , файл, mnist_saved_model.py , что поезд и экспорт модель.

  • ModelServer бинарный файл , который может быть либо установлен с помощью Кв, или собран из C ++ файла ( main.cc ). В TensorFlow сервировки ModelServer открывает новый экспортироваться модели и запускают КПГРЫ сервиса для обслуживания их.

Перед тем, как начать, первая установка Докер .

Обучить и экспортировать модель TensorFlow

Для фазы обучения, TensorFlow график запущен в TensorFlow сессии sess , с тензором ввода (изображения) в качестве x и выходного тензора (Софтмакс балла) , как y .

Затем мы используем TensorFlow в модуль SavedModelBuilder экспортировать модели. SavedModelBuilder сохраняет «снимок» обученная модель надежного хранения , так что он может быть загружен позже для вывода.

Для получения дополнительной информации о формате SavedModel, обратитесь к документации по SavedModel README.md .

Из mnist_saved_model.py , следующий короткий фрагмент кода , чтобы проиллюстрировать общий процесс сохранения модели на диск.

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
    sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__ принимает следующий аргумент:

  • export_path путь каталога экспорта.

SavedModelBuilder создаст каталог , если он не существует. В этом примере мы сцепить аргумент командной строки и FLAGS.model_version получить каталог для экспорта. FLAGS.model_version определяет версию модели. При экспорте новой версии той же модели следует указать большее целое число. Каждая версия будет экспортирована в отдельный подкаталог по заданному пути.

Вы можете добавить мета граф и переменный строителю , используя SavedModelBuilder.add_meta_graph_and_variables() со следующими аргументами:

  • sess является TensorFlow сессии , которая содержит обученную модель экспортируемую.

  • tags является набор тегов , с помощью которых можно сохранить мета граф. В этом случае, так как мы намерены использовать график в обслуживании, мы используем serve тег из предопределенных констант тегов SavedModel. Для получения более подробной информации см tag_constants.py и связанное с ними TensorFlow документации по API .

  • signature_def_map определяет карту предоставленного пользователем ключа для подписи к tensorflow :: SignatureDef добавить в мета - графике. Подпись указывает, какой тип модели экспортируется, и тензоры ввода / вывода, с которыми нужно связываться при выполнении вывода.

    Специальный ключ подписи serving_default определяет по умолчанию служит подпись. Ключ определения сигнатуры по умолчанию, наряду с другими константами, относящимися к сигнатурам, определяется как часть констант сигнатуры SavedModel. Для получения более подробной информации см signature_constants.py и связанное с ними TensorFlow документации по API .

    Кроме того, чтобы помочь построить подписи DEFS легко, то SavedModel API предоставляет подписные DEF утилиты .. В частности, в первоначальном mnist_saved_model.py файле, мы используем signature_def_utils.build_signature_def() для сборки predict_signature и classification_signature .

    В качестве примера , как predict_signature определен, Util принимает следующие аргументы:

    • inputs={'images': tensor_info_x} определяют данные входного тензора.

    • outputs={'scores': tensor_info_y} определяет результаты тензорных информации.

    • method_name является методом , используемым для вывода. Для запросов Prediction, он должен быть установлен в tensorflow/serving/predict . Для других имен методов см signature_constants.py и связанное с ними TensorFlow документации по API .

Обратите внимание , что tensor_info_x и tensor_info_y имеют структуру tensorflow::TensorInfo протокола буфера определяется здесь . Чтобы легко построить тензорные Infos, то TensorFlow SavedModel API также предоставляет utils.py с соответствующей документацией TensorFlow API .

Кроме того , обратите внимание , что images и scores являются имена псевдонимов тензорные. Они могут быть любой уникальной строки , которые вы хотите, и они станут логические имена тензора x и y , что вы имеете в виду для тензора связывания при отправке запросов предсказания позже.

Например, если x относится к тензору с именем «long_tensor_name_foo» и y относится к тензору с именем «generated_tensor_name_bar», builder будет хранить тензорное логическое имя реального имя отображения ( «изображения» -> «long_tensor_name_foo») и ( 'оценки '->' created_tensor_name_bar '). Это позволяет пользователю ссылаться на эти тензоры по их логическим именам при выполнении вывода.

Давай запустим!

Во-первых, если вы еще этого не сделали, клонируйте этот репозиторий на свой локальный компьютер:

git clone https://github.com/tensorflow/serving.git
cd serving

Очистите каталог экспорта, если он уже существует:

rm -rf /tmp/mnist

Теперь обучим модель:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

Это должно привести к выводу, который выглядит так:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

Теперь давайте посмотрим на каталог экспорта.

$ ls /tmp/mnist
1

Как упоминалось выше, будет создан подкаталог для экспорта каждой версии модели. FLAGS.model_version имеет значение по умолчанию 1, поэтому соответствующий подкаталог 1 создается.

$ ls /tmp/mnist/1
saved_model.pb variables

Подкаталог каждой версии содержит следующие файлы:

  • saved_model.pb является сериализованной tensorflow :: SavedModel. Он включает одно или несколько определений графа модели, а также метаданные модели, такие как подписи.

  • variables представляют собой файлы , которые содержат сериализованные переменные график.

После этого ваша модель TensorFlow экспортирована и готова к загрузке!

Загрузить экспортированную модель с помощью стандартного TensorFlow ModelServer

Используйте образ обслуживания Docker, чтобы легко загрузить модель для обслуживания:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

Протестируйте сервер

Мы можем использовать предоставленную mnist_client утилиту для тестирования сервера. Клиент загружает тестовые данные MNIST, отправляет их в виде запросов на сервер и вычисляет частоту ошибок вывода.

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

Это должно вывести что-то вроде

    ...
    Inference error rate: 11.13%

Мы ожидаем около 90% точности для обученной модели Softmax и получаем частоту ошибок вывода 11% для первых 1000 тестовых изображений. Это подтверждает, что сервер загружает и успешно запускает обученную модель!