- PVSM.RU - https://www.pvsm.ru -

Привет! Меня зовут Антон, я DevOps-инженер в команде Data/ML-продуктов Selectel. В этой статье расскажу про наш новый продукт — Inference-платформу Selectel [1], а также вызовы, с которыми мы столкнулись при ее разработке без разработчиков.
Почему без разработчиков? Рынок ML все еще молодой. В его российском сегменте не так много решений, связанных с Inference‑платформами. Перед началом создания полноценного продукта наша команда сначала проверяет технологические гипотезы, не растрачивая существенные ресурсы на разработку. Все делается силами небольшой команды Ops‑инженеров. Мы используем сервисы с открытым исходным кодом на базе инфраструктуры облака Selectel — тем самым достаточно быстро и недорого тестируем предположения, а в случае успеха легко масштабируем до готового продукта. Дальнейшее развитие уже определяется обратной связью от наших клиентов.
Используйте навигацию, если не хотите читать текст полностью:
→ Требования к Inference‑платформе [2]
→ Как мы начинали разработку платформы [3]
→ Что такое Inference‑платформа Selectel [4]
→ Заключение [5]
Статья дополняет мое выступление на конференции HighLoad 2024 и является частью серии. Сегодня поговорим больше про концептуальные идеи, требования к платформе, почему пришлось отказаться от Seldon и о том, что получилось в итоге. Про техническую составляющую, воплощении главных пяти фичей нашей платформы — в следующей публикации.
Мы не станем заострять внимание на деталях администрирования — например, развертывании своей Inference-платформы. Для этого существуют инструкции и документация. Вместо этого рассмотрим подробнее трудности, которые появляются на пути каждого, кто проектирует и разрабатывает собственные решения или опирается на open-source. Совокупность всех наших исследований за последний год и стала основой для создания платформы.
С другими работами можно ознакомиться в моем Telegram‑канале [6].
Для начала обозначим требования к платформе — именно они определили весь путь.
К будущей Inference‑платформе сформировались определенные запросы. Мы хотели добиться следующего.
Наша задача — перенести на себя Ops‑часть Inference‑сервисов, чтобы заказчики спокойно занимались своими профильными задачами, не отвлекаясь на, скажем, рутину администрирования. Например, ML‑инженер работает с данными и обучает модели. Нет смысла делать из него DevOps‑инженера или бэкенд‑разработчика, который конфигурирует и пишет веб-сервисы.

Картина из идеального мира.
В безупречном варианте хотелось бы прийти к схеме, когда ML‑инженер кладет модель в S3 (или другое объектное хранилище данных) и получает endpoint для работы. При этом вся магия Ops‑составляющей, которую мы раскроем в других требованиях, происходит под капотом платформы.
Обновление моделей — частый кейс. На этом этапе закладываются новые фичи, что очень важно для сохранения конкурентоспособности на рынке. Появляется задача: доставить модели до конечного клиента с наименьшим time to market. Возникает требование — максимально бесшовное обновление моделей в коммерческой эксплуатации с предварительным тестированием на трафике. Для этого как нельзя лучше подходит стратегия развертывания, получившая название Canary Deploy.
Canary Deployment — метод развертывания ПО, который позволяет выпускать новые версии продукта постепенно и контролируемо. Название «канарейка» пришло из тех времен, когда шахтеры брали этих птиц в шахты для получения предупреждения об опасных газах.
В контексте DevOps такой подход предусматривает выпуск новой версии сначала для небольшой части клиентов (обычно от 1% до 10% трафика). Только после выявления и устранения всех дефектов приложение или сервис передается всей пользовательской базе.
Нагрузка на наши inference‑сервисы может значительно меняться даже в течение дня. В этом нет каких‑то отличий от функционирования обычных веб-сервисов, особенно с учетом использования облачных технологий. Применение горизонтального масштабирования возможно, но приходится принимать во внимание использование GPU‑ресурсов. В статье «Как справиться с нагрузкой в черную пятницу? Автоскейлинг инференса на GPU в Kubernetes [7]» подробно разбирается пример ChatGPT в новогодний ажиотаж.
OpenAI задействует 3617 серверов HGX A10ааааа0 [8] для обеспечения MAU (Monthly Active Users) численностью около 100 млн. И даже с такой мощной инфраструктурой SLA в 99,999% остается недостижимым, что видно на панели статуса [9].
Inference Graph представляет последовательность операций или вычислений, которые выполняются для получения предсказаний от обученной модели. Граф описывает, как данные проходят через различные этапы обработки: предварительную подготовку, применение модели, а также завершающую доводку и коррекцию результатов.
Такая функциональность сейчас не пользуется большим спросом. Интервью с компаниями и клиентами показали, что все хотят просто организовать последовательную цепочку обработки данных моделью — например, preprocessing, processing и postprocessing. Закладывать inference-граф в архитектуру стоит с учетом развития рынка ML.

Пример цепочки моделей в inference‑графе: Whisper транскрибирует аудио в промпт, Stable Diffusion из промта генерирует картинку.
Необходимость в подобной визуализации возрастает при составлении цепочек из LLM‑моделей. Такие вычислительные процессы требуют достаточно много ресурсов на видеокартах. Бывает, что нескольким моделям одной GPU не хватает — тогда в случае использования Kubernetes их приходится размещать на разных нодах. Например, для реализации цепочки audio-to-image можно использовать Whisper [10] и Stable Diffusion [11], которые без дополнительного сжатия не поместятся даже на TeslaT4 16Gb.
Есть три пути разработки нового решения.

Три пути.
Облачные SaaS нам не подходят по очевидным причинам — мы сами хотим к такому прийти. Однако можно выделить интересные аналоги, к которым стоит присмотреться:
Разрабатывать собственное решение лишь для proof of concept слишком дорого. Да, можно в целом «обернуть» нашу модель во Flask/Fast API и получить заветный endpoint. Но как удовлетворить все требования без реализации дополнительной функциональности?
Создание своего inference‑сервиса — отнюдь нетривиальная задача, что подтверждает и Nvidia в одной из своих инструкций [15].

Посмотрите, сколько фичей нужно вложить в inference.
Использовать решения с открытым исходным кодом — тоже достаточно трудозатратно. Потребуется разобраться в коде, документации, и убедиться в том, что все необходимые требования удовлетворяются. При этом важно, чтобы основные фичи, которые закладываются в платформу, не нуждались в дополнительной разработке.
И мы нашли этот путь. О нем и рассказываем.

Для построения своей платформы мы рассмотрели множество существующих решений, взвешивали все «за» и «против». Хотелось и задуманные стратегические цели достигнуть, и соблюсти реалистичные сроки их воплощения. Существенно многое: зрелость компонентов, наличие детальной технической документации, активность разработчиков и ясные перспективы проектов. В конце‑концов остановились на двух.
Основные возможности Triton Inference Server [16] и его настройка хорошо описаны в документации [17]. Мы расскажем о фишках, которые запросто можно пропустить, но которые сильно помогают при автоматизации настройки.
Итак, за основу платформы мы выбрали Triton, так как без дополнительной настройки он уже имеет внушительные характеристики.
При этом в базовой функциональности все же не хватает.
Чтобы удовлетворить требования, которые не охватывает Nvidia Triton Inference Server, мы изучили рынок инструментов и решили попробовать Seldon Core.
Seldon [18] — один из самых популярных инструментов для управления deploy‑моделями. Разработчики сосредоточили много функций, которые сильно упрощают жизнь ML-разработчикам.
Важно заметить, что в Seldon отсутствуют серверы для моделей: он использует как привычные внешние решения, так и позволяет подключить свое. Фактически, Seldon — это deploy‑оркестратор в Kubernetes.
Мы разворачивали seldon-core-operator [19] в Kubernetes, который позволяет с помощью CRD создавать необходимые сущности Seldon Deployment, в которых и описываются наши inference’ы.
CRD (Custom Resource Definition) дает пользователям механизм расширения API Kubernetes, позволяя добавлять свои типы ресурсов. Так можно создавать собственные объекты, которые будут храниться в etcd и управляться практически как и предопределенные: Pods, Services и Deployments.

Схема работы Seldon. Выглядит приятно, но на деле…
Особенности Seldon
Получилось идеальное решение, которое удовлетворило всем нашим требованиям, да еще и в формате одного продукта! Мы так и думали мы, пока не начали внедрять его.
Первая проблема, с которой мы столкнулись, описана в issue #5279 — Triton inference server metrics are not supported [20].
Суть в том, что в манифесте Seldon Deployment с имплементацией Triton порт с метриками не пробрасывается наружу. Даже если использовать этот манифест с переопределением componentSpecs, то сгенерированный Deployment для Kubernetes не отображает порт метрик 8002. И это несмотря на то, что мы его явно указываем.
Манифест (значимая часть):
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
name: multi
namespace: seldon-triton
spec:
predictors:
- componentSpecs:
- spec:
containers:
- name: multi
image: nvcr.io/nvidia/tritonserver:23.10-py3
args:
- /opt/tritonserver/bin/tritonserver
- '--grpc-port=9500'
- '--http-port=9000'
- '--metrics-port=8002'
- '--model-repository=/mnt/models'
ports:
- name: grpc
containerPort: 9500
protocol: TCP
- name: http
containerPort: 9000
protocol: TCP
- name: metrics
containerPort: 8002
protocol: TCP
graph:
implementation: TRITON_SERVER # проблемная имплементация
logger:
mode: all
modelUri: gs://seldon-models/triton/multi
name: multi
type: MODEL
name: default
replicas: 1
protocol: v2
Сгенерированный Deployment (лишняя часть удалена):
apiVersion: apps/v1
kind: Deployment
metadata:
name: multi-default-0-multi
namespace: seldon-triton
spec:
template:
spec:
containers:
- name: multi
image: nvcr.io/nvidia/tritonserver:23.10-py3
ports:
- name: grpc
containerPort: 9500
protocol: TCP
- name: http
containerPort: 9000
protocol: TCP
Без порта 8002 мы не можем собирать в Prometheus метрики из Triton, что перечеркивает реализацию автомасштабирования наших ресурсов.
Можно убрать implementation: TRITON_SERVER и определить порты явно. Переадресация портов начинает работать, но тогда мы теряем доступ к нашему endpoint по протоколу V2 из‑за нарушения логики работы с Istio. Единственная возможность — переписать CRD для манифеста Triton. Это тоже не выход: вести целую параллельную ветку сложного проекта ради исправления одной особенности неразумно.
Есть и еще одна, пусть и менее критическая проблема — неполная и запутанная документация. Seldon подразделяется на открытый Seldon Core [18] и проприетарный Seldon Enterprise [21]. Упор в разработке делается на поддержку корпоративной версии — для бесплатной же, по‑видимому, не всегда находятся силы, чтобы поддерживать справочные материалы в актуальном состоянии. Например, для деплоя Triton в документации в 2024 года используется версия контейнера 21 года, которая с тех пор претерпела значительные изменения.

Пример Values в чарте Seldon с отсылкой на 21.08 версию Triton.
Seldon оказался для нас достаточно проблемным и громоздким продуктом. С одной стороны, он отвечает всем пожеланиям от Inference‑платформы. С другой — обременителен в изучении и внедрении.
Мы решили упростить нашу схему: выбросить из нее Seldon и оставить Istio для регулирования трафика между inference’ми и Triton, который остается ядром нашего сервиса.

Упрощенная схема платформы.
В итоге сформировалась следующая концепция платформы:

Отличие от картины из идеального мира в том, что нужно применять манифест Helm‑чарта.
Манифест мы взяли из открытого репозитория Nvidia [22] и дополнили его своими пятью основными фичами платформы. Получившийся манифест доступен в нашем открытом репозитории [23], где указаны все необходимые справочные материалы по работе с Inference‑платформой. Подробнее о репозитарии мы расскажем в следующей статье.
Инфраструктура платформы собрана из продуктов Selectel.

Схема платформы из продуктов Selectel.
Сейчас мы доставляем клиенту платформу таким же образом, как и ML‑платформу [24]. Процесс организован с помощью пайплайна GitLab CI/CD, где каждый инфраструктурный элемент оборачивается Terraform-модулем и версионируется. Также Terraform устанавливает в Kubernetes необходимые Helm‑чарты. Подробнее про такой способ автоматизации развертывания и доставки можно почитать в статье «Как мы ускорили деплой облачной платформы в 20 раз и избавились от панических атак [25]».

Деплой платформы занимает около 20 минут.
В будущем мы хотим перейти к нашей модели PaaS [26] и пересобрать доставку платформы для клиентов в пользу GitOps‑подхода.
В первую очередь мы разрабатываем API для нашей платформы, чтобы клиентам не приходилось разворачивать манифесты в Kubernetes самостоятельно. Деплой платформы и inference‑сервисов будет доступен в панели управления. Доставку платформы мы собираемся реализовывать с помощью FluxCD.
Без разработчика мы не справимся. Если кого‑то заинтересовал наш продукт и у вас есть опыт программирования на Go — откликайтесь на нашу вакансию [27]. Давайте разрабатывать ML‑проекты вместе!
Также мы собираемся упростить работу с inference‑графом: правильнее для этого использовать интерфейс, а не прибегать к SDK и написанию кода на Python. Здесь тоже потребуется собственная разработка, так как на рынке готовых решений мы, к сожалению, не нашли.
Еще хотим добавить больше опций по организации безопасности платформы — например, работу с JSON Web Tokens и интеграцией таких готовых решений, как Keycloak [28].
В конце хотелось бы сказать, что разработка продуктов — особенно тех, у которых нет или мало аналогов — достаточно рискованное занятие. Представить на рынок MVP (Minimum Viable Product, минимально жизнеспособный продукт) без крупных затрат — это очень здорово. Использовать готовое решение, которое решает задачу клиента, — еще лучше. Мы так и сделали: выпустили наш проект в бета‑тестирование, и теперь вы можете подключиться на тест. Заполняйте заявки на сайте и знакомьтесь с Inference‑платформой Selectel [1].
Автор: antonaleks605
Источник [29]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/oblachny-e-servisy/405528
Ссылки в тексте:
[1] Inference-платформу Selectel: https://selectel.ru/services/cloud/inference-platform/?utm_source=habr.com&utm_medium=referral&utm_campaign=inference-platform_161224
[2] Требования к Inference‑платформе: #1
[3] Как мы начинали разработку платформы: #2
[4] Что такое Inference‑платформа Selectel: #3
[5] Заключение: #4
[6] Telegram‑канале: https://t.me/+RLDcdfRY16ZlZmQ6
[7] Как справиться с нагрузкой в черную пятницу? Автоскейлинг инференса на GPU в Kubernetes: https://habr.com/ru/companies/selectel/articles/844026/
[8] 3617 серверов HGX A10ааааа0: https://www.tooltester.com/en/blog/chatgpt-statistics/
[9] на панели статуса: https://status.openai.com/
[10] Whisper: https://huggingface.co/openai/whisper-large-v3
[11] Stable Diffusion: https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0
[12] Hugging Face: https://ui.endpoints.huggingface.co/
[13] Run AI: https://www.run.ai/
[14] BentoML Cloud: https://bentoml.com/
[15] инструкций: https://github.com/triton-inference-server/tutorials/blob/main/Migration_Guide/migration_guide.md
[16] Triton Inference Server: https://developer.nvidia.com/triton-inference-server
[17] в документации: https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/getting_started/quickstart.html
[18] Seldon: https://www.seldon.io/solutions/seldon-core
[19] seldon-core-operator: https://docs.seldon.io/projects/seldon-core/en/latest/charts/seldon-core-operator.html
[20] #5279 — Triton inference server metrics are not supported: https://github.com/SeldonIO/seldon-core/issues/5279
[21] Seldon Enterprise: https://www.seldon.io/solutions/enterprise-platform
[22] Nvidia: https://github.com/triton-inference-server/server/tree/main/deploy/k8s-onprem
[23] в нашем открытом репозитории: https://github.com/selectel/inference-platform-tutorials/tree/main/demo-inferp
[24] ML‑платформу: https://selectel.ru/services/cloud/mlops/?utm_source=habr.com&utm_medium=referral&utm_campaign=inference-platform_161224
[25] Как мы ускорили деплой облачной платформы в 20 раз и избавились от панических атак: https://habr.com/ru/companies/selectel/articles/803883/
[26] к нашей модели PaaS: https://selectel.ru/services/cloud/?utm_source=habr.com&utm_medium=referral&utm_campaign=inference-platform_161224
[27] на нашу вакансию: https://selectel.ru/careers/all/vacancy/1051/?utm_source=habr.com&utm_medium=referral&utm_campaign=inference-platform_161224
[28] Keycloak: https://www.keycloak.org/
[29] Источник: https://habr.com/ru/companies/selectel/articles/866256/?utm_source=habrahabr&utm_medium=rss&utm_campaign=866256
Нажмите здесь для печати.