Обслуживание моделей TensorFlow с пользовательскими операциями

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 , чтобы добавить свою пользовательскую цель сборки op в 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 на сервер модели.