Один из самых простых способов начать использовать TensorFlow Serving — использовать Docker .
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker 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 APIcurl -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 , но несколько быстрых ссылок мы даем здесь:
- Докер для MacOS
- Docker для Windows для Windows 10 Pro или более поздней версии
- Docker Toolbox для более старых версий macOS или версий Windows до Windows 10 Pro.
Обслуживание с 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 , вам потребуется:
- Обновленные драйверы NVIDIA для вашей системы.
-
nvidia-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» .