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

Один из самых простых способов , чтобы начать использовать TensorFlow сервировки с Докер .

# 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] }

Для дополнительных обслуживающих конечных точек, см API клиента REST .

Установить Docker

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

Работа с Docker

Вытягивание обслуживающего изображения

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

docker pull tensorflow/serving

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

См Docker концентратор tensorflow / служащий репо для других версий изображений , которые можно тянуть.

Запуск обслуживающего изображения

Обслуживающие образы (как CPU, так и GPU) имеют следующие свойства:

  • Порт 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 вам понадобятся:

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

Что вы будете делать это запустить 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, опубликовали REST API порта 8501 к порту нашего хозяина 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

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

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

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

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

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

Чтобы запросить модель с помощью 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 с использованием вашего графического процессора

Установите nvidia-docker

Перед подачей на стол с GPU, в дополнение к установке Docker , вам потребуется:

Запуск графического процессора, обслуживающего образ

Запуск образа, обслуживающего GPU, идентичен запуску образа CPU. Для получения более подробной информации см работают обслуживающее изображение .

Пример обслуживания GPU

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

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

docker pull tensorflow/serving:latest-gpu

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

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

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

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

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 Model Server приведет к ошибке, которая выглядит следующим образом:

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

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

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

Инструкции о том , как строить и развивать Tensorflow Отбывание, пожалуйста , обратитесь к разработке с Докер руководства .