Часть 2 - Как использовать модель в качестве API в Kubernetes?

TL; DR

Эта статья является второй частью серии, в которой мы рассмотрим процесс регистрации моделей с использованием Mlflow, их обслуживания в качестве конечной точки API и, наконец, их масштабирования в соответствии с потребностями нашего приложения. Мы рекомендуем вам прочитать нашу предыдущую статью, в которой мы показываем, как развернуть экземпляр отслеживания на k8s, и проверять предварительные условия (секреты, переменные среды ...) поскольку мы продолжим развивать их здесь.
Далее мы покажем, как обслуживать модель машинного обучения, которая уже зарегистрирована в Mlflow, и предоставлять ее в качестве конечной точки API на k8s.

Введение

Очевидно, что отслеживание и оптимизация производительности моделей является важной частью создания моделей машинного обучения. После этого следующая задача - интегрировать их в приложение или продукт, чтобы использовать их прогнозы. Это то, что мы называем обслуживанием моделей или выводом. Существуют различные структуры и методы, которые позволяют нам это делать. Тем не менее, здесь мы сосредоточимся на Mlflow и покажем, насколько эффективным и простым он может быть.

Создайте и разверните обслуживающий образ

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

1. Подготовьте образ обслуживающего докера Mlflow и поместите его в реестр контейнеров на GCP.

cd mlflow-serving-example
docker build --tag ${GCR_REPO}/mlflow_serving:v1 --file docker_mlflow_serving .
docker push ${GCR_REPO}/mlflow_serving:v1

2. Подготовьте файл развертывания Kubernetes, изменив раздел контейнера и сопоставив его с изображением докера, которое ранее было отправлено в GCR, путь к модели и порт обслуживания.

3. Выполните команды развертывания

kubectl create -f deployments/mlflow-serving/mlflow_serving.yaml

4. Предоставьте развертывание для внешнего доступа
С помощью следующей команды будет создан новый ресурс для перенаправления внешнего трафика на наш API.

kubectl expose deployment mlflow-serving --port 8082 --type="LoadBalancer"

5. Проверьте развертывание и запросите конечную точку.
Если развертывание прошло успешно, mlflow-serve должен быть включен и один модуль должен быть доступен. Вы можете проверить это, набрав kubectl get pods.

Последним шагом является проверка внешнего IP-адреса, назначенного балансировщику нагрузки, перенаправляющему трафик в наш контейнер API с помощью kubectl get services, и проверка ответа на несколько запросов.

Пример кода для выполнения этих запросов можно найти в следующей записной книжке, в которой мы загружаем несколько строк данных, выбираем функции, конвертируем их в формат JSON и отправляем их в пост-запросе к API.

Теперь, объединив шаги, сделанные в наших предыдущих и текущих статьях, наша окончательная архитектура будет выглядеть следующим образом:

Заключение

В этой статье мы показали, что можем легко развернуть модели машинного обучения в качестве конечной точки API, используя модуль обслуживания Mlflow.

Как вы могли заметить, в нашем текущем развертывании для обслуживания модели был создан только один модуль. Хотя это хорошо работает для небольших приложений, где мы не ожидаем нескольких параллельных запросов, он может быстро показать свои ограничения для других, поскольку один модуль имеет ограниченные ресурсы. Более того, таким образом приложение не сможет использовать вычислительную мощность более одного узла. В следующей и последней статье этой серии мы рассмотрим проблему масштабируемости. Сначала мы выделим узкие места и попытаемся решить их, чтобы получить масштабируемое приложение, которое использует возможности нашего кластера Kubernetes.