Автоматизируйте цикл обучения-развертывания модели машинного обучения, сборку мусора и откаты — и все это на Python с помощью пакета PyPi с открытым исходным кодом на основе Cortex.

Что управлять конечными точками?

Все началось с модернизации проекта категоризации продуктов. Цель состояла в том, чтобы заменить сложные низкоуровневые команды Docker очень простой и удобной утилитой развертывания под названием Cortex. Решение в виде пакета Python оказалось пригодным для повторного использования, поскольку мы успешно использовали его как часть нашего проекта механизма рекомендаций. Мы планируем развернуть все проекты машинного обучения таким образом. Поскольку GLAMI в значительной степени зависит от программного обеспечения с открытым исходным кодом, мы хотели внести свой вклад и решили сделать пакет открытым, назвав его Cortex Serving Client. Так что теперь вы можете использовать его, а также.

Архитектура диспетчера моделей

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

Мы решили сохранить эту архитектуру и внедрить ее также в проект механизма рекомендаций. В этом проекте развертывания должны были иметь возможность непрерывно получать прогнозные запросы и выполнять горячую замену при наличии новой переобученной модели. Это контрастировало с пакетными операциями классификатора продуктов.

Кортекс это что?

Cortex — это утилита командной строки с открытым исходным кодом, которая управляет созданием кластера Amazon EKS (Kubernetes), развертыванием, масштабированием, обслуживанием и балансировкой нагрузки конечных точек модели в кластере. Основной абстракцией в Cortex является API. У API есть имя, масштабирование, требования к вычислениям и модуль Python с классом PythonPredictor. После развертывания каждый API обслуживает одну конечную точку HTTP POST. Когда вы вызываете эту конечную точку, полезные данные JSON передаются в виде словаря экземпляру PythonPredictor.

Клиент обслуживания Cortex

Это все хорошо, но как вы управляете развернутыми моделями из Python? Cortex предоставляет только клиент командной строки, реализованный в Go! Естественным решением стала оболочка Python для исполняемого файла Cortex. Оператор Python «with» даже позволял нам автоматически удалять развернутые конечные точки, когда они больше не нужны.

Банановая оболочка AWS

Но тут мы вспомнили знаменитую банановую кожуру AWS: стоимость забытого инстанса! Что делать, если конечная точка случайно застряла на дорогостоящем экземпляре? Мы добавили таблицу базы данных, позволяющую Cortex Serving Client сохранять время ожидания для каждой конечной точки. Затем сборщик мусора периодически удаляет из кластера все просроченные или неизвестные API.

Откат Как?

Секундочку, а как насчет отката модели? Откат — хороший вариант использования для нашего клиента. Мы реализовали простую стратегию возврата к предыдущей версии модели в диспетчере моделей механизма рекомендаций. Мы перехватили исключения, вызванные клиентом во время развертывания, и повторно развернули их из резервной копии, вызвав методы клиента.

Получить клиента

Если вы ищете решение для своих MLOps, мы рекомендуем обратить внимание на Cortex или BentoML. Cortex — это продуманное комплексное решение, в то время как BentoML является более универсальным с точки зрения развертывания, поскольку поддерживает больше платформ. Однако BentoML также кажется более сложным в настройке. С другой стороны, BentoML реализован на Python и имеет возможность упаковки моделей. Если вы выберете Cortex, как и мы, рассмотрите возможность использования Cortex Serving Client. Подробнее об этом читайте на Github.

Какую архитектуру вы используете? Сталкивались ли вы с подобными проблемами?

Подпишитесь, чтобы получать больше сообщений в блоге!

Вы заинтересованы в работе в GLAMI? Ознакомьтесь с нашими списками вакансий!

Обновление 2021–07–20
Cortex развивается очень быстро. В версии v0.21.0 Cortex добавлен официальный клиент Python, вдохновленный нашим проектом. Наш клиент Cortex Serving по-прежнему предлагает некоторые дополнительные функции, такие как временное развертывание, тайм-ауты, сборка мусора, которых нет в ваниле, поэтому мы продолжаем его использовать и поддерживать.

Автор Вацлав Кошарж