TensorFlow поставляется с предварительно собранной обширной библиотекой операций и ядер операций (реализаций), настроенных для различных типов оборудования (ЦП, графический процессор и т. д.). Эти операции автоматически связываются с двоичным файлом TensorFlow Serving ModelServer, без каких-либо дополнительных действий со стороны пользователя. Однако есть два варианта использования, которые требуют от пользователя явного связывания операций с ModelServer:
- Вы написали свою собственную операцию (например, используя это руководство ).
- Вы используете уже реализованную операцию, которая не поставляется с TensorFlow.
Независимо от того, реализовали вы операцию или нет, чтобы обслуживать модель с помощью пользовательских операций, вам необходим доступ к источнику операции. В этом руководстве рассказывается, как использовать источник, чтобы сделать пользовательские операции доступными для обслуживания. Рекомендации по реализации пользовательских операций см. в репозитории tensorflow/custom-op .
Предварительное условие: после установки Docker вы клонировали репозиторий TensorFlow Serving, и ваш текущий рабочий каталог является корнем репозитория.
Скопируйте исходный код в обслуживающий проект.
Чтобы создать сервис TensorFlow с вашими пользовательскими операциями, вам сначала необходимо скопировать исходный код операции в ваш проект обслуживания. В этом примере вы будете использовать tensorflow_zero_out из репозитория пользовательских операций, упомянутого выше.
В репозитории обслуживания создайте каталог custom_ops
, в котором будут храниться все ваши пользовательские операции. В этом примере у вас будет только код tensorflow_zero_out .
mkdir tensorflow_serving/custom_ops
cp -r <custom_ops_repo_root>/tensorflow_zero_out tensorflow_serving/custom_ops
Создайте статическую библиотеку для операции
В файле BUILD tensorflow_zero_out вы видите цель, создающую общий объектный файл ( .so
), который вы загрузите в Python, чтобы создать и обучить свою модель. Однако TensorFlow Serving статически связывает операции во время сборки и требует файла .a
. Поэтому вы добавите правило сборки, которое создает этот файл, в tensorflow_serving/custom_ops/tensorflow_zero_out/BUILD
:
cc_library(
name = 'zero_out_ops',
srcs = [
"cc/kernels/zero_out_kernels.cc",
"cc/ops/zero_out_ops.cc",
],
alwayslink = 1,
deps = [
"@org_tensorflow//tensorflow/core:framework",
]
)
Создайте ModelServer со связанной операцией.
Чтобы обслуживать модель, использующую пользовательскую операцию, вам необходимо создать двоичный файл ModelServer со связанной с ней операцией. В частности, вы добавляете цель сборки zero_out_ops
, созданную выше, в файл BUILD
ModelServer.
Отредактируйте tensorflow_serving/model_servers/BUILD
чтобы добавить свою собственную цель сборки операции в SUPPORTED_TENSORFLOW_OPS
, которая включена в цель server_lib
:
SUPPORTED_TENSORFLOW_OPS = [
...
"//tensorflow_serving/custom_ops/tensorflow_zero_out:zero_out_ops"
]
Затем используйте среду Docker для создания ModelServer:
tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server
Подайте модель, содержащую вашу пользовательскую операцию
Теперь вы можете запустить двоичный файл ModelServer и начать обслуживать модель, содержащую эту пользовательскую операцию:
tools/run_in_docker.sh -o "-p 8501:8501" \
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \
--rest_api_port=8501 --model_name=<model_name> --model_base_path=<model_base_path>
Отправьте запрос на вывод для проверки вручную
Теперь вы можете отправить запрос на вывод на сервер модели, чтобы протестировать свою пользовательскую операцию:
curl http://localhost:8501/v1/models/<model_name>:predict -X POST \
-d '{"inputs": [[1,2], [3,4]]}'
Эта страница содержит более полный API для отправки запросов REST на сервер модели.