В этом руководстве показано, как использовать компоненты 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 тестовых изображений. Это подтверждает, что сервер загружает и успешно запускает обученную модель!