Обслуживать обученную модель Tensorflow с REST API с помощью Flask?
У меня есть обученная модель Tensorflow, и я хочу использовать метод прогнозирования с REST API. Я могу подумать о том, чтобы использовать Flask для создания простого REST API, который получает JSON в качестве входных данных, а затем вызывает метод предиката в Tensorflow и затем возвращает предсказанный результат на стороне клиента.
Я хотел бы знать, есть ли беспокойство, чтобы сделать это таким образом, особенно в производственной среде?
Большое спасибо!
3 ответа
Первое, что приходит мне в голову, это производительность.
Команда TensorFlow, похоже, разработала использование сервера / клиента. Вы можете посмотреть на подачу тензорного потока. По умолчанию он использует gRPC для протокола связи.
Мы используем Flask + TensorFlow, служащий на работе. Наша установка может быть не самым оптимальным способом обслуживания моделей, но она выполняет свою работу и до сих пор хорошо работает для нас.
Настройка следующая:
- Поскольку сборка tfserving занимает вечность, мы создали образ докера (не для поддержки графического процессора или чего-либо еще, но он работает только для обслуживания модели, и это быстрее и лучше, чем обслуживание напрямую из огромного монолита Python/Flask). Образ сервера модели можно найти здесь: https://hub.docker.com/r/epigramai/model-server/
- Затем Flask используется для настройки API. Чтобы отправлять запросы на сервер модели, нам нужен клиент для прогнозирования grcp, поэтому мы создали его в Python, который можно импортировать непосредственно в API фляги, https://github.com/epigramai/tfserving_predict_client/.
Хорошо, что модель не обслуживается приложением Flask API. Сервер модели образов Docker может быть легко заменен сервером моделей, работающим на графическом процессоре, скомпилированном для аппаратного обеспечения машин вместо контейнера Docker.
Я думаю, что одной из ваших главных проблем может быть пакетирование запросов. Например, предположим, что ваша модель представляет собой обученный CNN, такой как VGG, Inception или аналогичный. Если вы внедряете обычную веб-службу с Flask, для каждого полученного вами запроса на прогнозирование (при условии, что вы работаете на графическом процессоре) вы будете делать прогноз одного изображения в графическом процессоре, что может быть неоптимальным, так как вы можете пакетировать подобные запросы, для пример.
Это одна из вещей, которые TensorFlow Serving стремится предложить: возможность объединять запросы для одной и той же модели / подписи в один пакет перед отправкой в графический процессор, более эффективно использовать ресурсы и (потенциально) пропускную способность. Вы можете найти больше информации здесь: https://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching
Тем не менее, это зависит от сценария очень сильно. Но группировка прогнозов - это то, что важно помнить.