Обслуживание TensorFlow с помощью Docker

Один из самых простых способов начать использовать TensorFlow Serving — использовать Docker .

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

Дополнительные конечные точки обслуживания см. в разделе Client REST API .

Установить Докер

Общие инструкции по установке есть на сайте Docker , но несколько быстрых ссылок мы даем здесь:

Обслуживание с Docker

Получение изображения для показа

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

docker pull tensorflow/serving

Это приведет к созданию минимального образа Docker с установленным TensorFlow Serving.

Другие версии изображений, которые вы можете получить, см. в репозитории тензорного потока/обслуживания Docker Hub.

Запуск показа образа

Обслуживающие изображения (как ЦП, так и ГП) имеют следующие свойства:

  • Порт 8500 открыт для gRPC
  • Порт 8501 открыт для REST API.
  • Необязательная переменная среды MODEL_NAME (по умолчанию — model )
  • Необязательная переменная среды MODEL_BASE_PATH (по умолчанию /models )

Когда обслуживающий образ запускает ModelServer, он запускает его следующим образом:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

Для работы с Docker вам понадобится:

  • Открытый порт на вашем хосте для обслуживания
  • SavedModel для обслуживания
  • Имя вашей модели, на которое будет ссылаться ваш клиент.

Что вам нужно сделать, так это запустить контейнер Docker , опубликовать порты контейнера в портах вашего хоста и смонтировать путь вашего хоста к SavedModel туда, где контейнер ожидает модели.

Давайте посмотрим на пример:

docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

В этом случае мы запустили контейнер Docker, опубликовали порт 8501 REST API для порта 8501 нашего хоста, взяли модель, которую назвали my_model , и привязали ее к базовому пути модели по умолчанию ( ${MODEL_BASE_PATH}/${MODEL_NAME} = /models/my_model ). Наконец, мы заполнили переменную среды MODEL_NAME значением my_model и оставили для MODEL_BASE_PATH значение по умолчанию.

Это будет работать в контейнере:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_model

Если бы мы хотели опубликовать порт gRPC, мы бы использовали -p 8500:8500 . Вы можете одновременно открыть порты gRPC и REST API или выбрать открытие только одного или другого.

Передача дополнительных аргументов

tensorflow_model_server поддерживает множество дополнительных аргументов, которые вы можете передать обслуживающим контейнерам Docker. Например, если бы мы хотели передать файл конфигурации модели вместо указания имени модели, мы могли бы сделать следующее:

docker run -p 8500:8500 -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config

Этот подход работает для любых других аргументов командной строки, которые поддерживает tensorflow_model_server .

Создание собственного имиджа подачи

Если вам нужен обслуживающий образ, в контейнер которого встроена ваша модель, вы можете создать свой собственный образ.

Сначала запустите обслуживающий образ в качестве демона:

docker run -d --name serving_base tensorflow/serving

Затем скопируйте SavedModel в папку модели контейнера:

docker cp models/<my model> serving_base:/models/<my model>

Наконец, зафиксируйте контейнер, обслуживающий вашу модель, изменив MODEL_NAME , чтобы оно соответствовало имени вашей модели ` ':

docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>

Теперь вы можете serving_base

docker kill serving_base

В результате у вас останется образ Docker с именем <my container> , который вы можете развернуть, и загрузите свою модель для обслуживания при запуске.

Пример подачи

Давайте рассмотрим полный пример, в котором мы загружаем SavedModel и вызываем его с помощью REST API. Сначала извлеките изображение для показа:

docker pull tensorflow/serving

Это позволит получить последний образ обслуживания TensorFlow с установленным ModelServer.

Далее мы будем использовать игрушечную модель под названием Half Plus Two , которая генерирует 0.5 * x + 2 для значений x , которые мы предоставляем для прогнозирования.

Чтобы получить эту модель, сначала клонируйте репозиторий TensorFlow Serving.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

Затем запустите контейнер TensorFlow Serving, указав ему эту модель и открыв порт REST API (8501):

docker run -p 8501:8501 \
  --mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

Это запустит докер-контейнер и запустит сервер обслуживающей модели TensorFlow, свяжет порт REST API 8501 и сопоставит желаемую модель с нашего хоста с ожидаемыми моделями в контейнере. Мы также передаем имя модели в качестве переменной среды, что будет важно при запросе модели.

Чтобы запросить модель с помощью API прогнозирования, вы можете запустить

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

Это должно вернуть набор значений:

{ "predictions": [2.5, 3.0, 4.5] }

Более подробную информацию об использовании RESTful API можно найти здесь .

Работа с Docker с использованием вашего графического процессора

Установите нвидиа-докер

Перед использованием графического процессора, помимо установки Docker , вам потребуется:

Запуск образа обслуживания графического процессора

Запуск образа обслуживания графического процессора идентичен запуску образа ЦП. Дополнительные сведения см. в разделе Запуск показа изображения .

Пример обслуживания графического процессора

Давайте рассмотрим полный пример, в котором мы загружаем модель с операциями, привязанными к графическому процессору, и вызываем ее с помощью REST API.

Сначала установите nvidia-docker . Затем вы можете получить последний образ докера TensorFlow Serving GPU, выполнив:

docker pull tensorflow/serving:latest-gpu

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

Далее мы будем использовать игрушечную модель под названием Half Plus Two , которая генерирует 0.5 * x + 2 для значений x , которые мы предоставляем для прогнозирования. Эта модель будет иметь операции, привязанные к устройству графического процессора, и не будет работать на процессоре.

Чтобы получить эту модель, сначала клонируйте репозиторий TensorFlow Serving.

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

Затем запустите контейнер TensorFlow Serving, указав ему эту модель и открыв порт REST API (8501):

docker run --gpus all -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &

Это запустит докер-контейнер, запустит сервер обслуживающей модели TensorFlow, свяжет порт REST API 8501 и сопоставит желаемую модель с нашего хоста с ожидаемыми моделями в контейнере. Мы также передаем имя модели в качестве переменной среды, что будет важно при запросе модели.

СОВЕТ: Прежде чем запрашивать модель, обязательно подождите, пока не увидите сообщение, подобное следующему, указывающее, что сервер готов принимать запросы:

2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...

Чтобы запросить модель с помощью API прогнозирования, вы можете запустить

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

Это должно вернуть набор значений:

{ "predictions": [2.5, 3.0, 4.5] }

СОВЕТ: Попытка запустить модель графического процессора на машине без графического процессора или без работающей сборки графического процессора сервера моделей TensorFlow приведет к ошибке, которая выглядит следующим образом:

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

Более подробную информацию об использовании RESTful API можно найти здесь .

Разработка с помощью Docker

Инструкции по созданию и разработке сервиса Tensorflow см. в руководстве «Разработка с помощью Docker» .