Set Up Autoscaling for Inference Services with KEDA
Introduction
Развертывание моделей машинного обучения в продуктивной среде представляет собой уникальные задачи, и одна из самых важных — обеспечить, чтобы ваш сервис вывода мог эффективно и надежно обрабатывать различные уровни нагрузки. Непредсказуемый характер AI-нагрузок — когда трафик может резко возрасти, а потребности в ресурсах колеблются в зависимости от таких факторов, как длина входных последовательностей, длина генерации токенов или количество одновременных запросов — часто означает, что традиционные методы автоскейлинга оказываются недостаточными.
Опора только на метрики CPU или памяти может привести либо к избыточному выделению ресурсов и их трате, либо к недостаточному выделению и ухудшению пользовательского опыта. Аналогично, использование GPU может свидетельствовать как об эффективном использовании, так и о состоянии насыщения. Лучшие практики индустрии для автоскейлинга LLM поэтому сместились в сторону более специфичных для нагрузки метрик.
В этом руководстве описывается настройка автоскейлинга KServe с использованием KEDA (Kubernetes Event-driven Autoscaling) и пользовательских метрик, экспортируемых vLLM. Такое сочетание позволяет сервисам вывода масштабироваться на основе реальных сигналов нагрузки, а не общих инфраструктурных метрик.
KEDA расширяет стандартный Kubernetes Horizontal Pod Autoscaler (HPA), позволяя приложениям масштабироваться от нуля до N экземпляров и обратно на основе широкого спектра источников событий — включая метрики Prometheus. Она вводит открытую и расширяемую архитектуру, благодаря чему KServe может масштабироваться практически по любому сигналу, важному для производительности вашей AI-модели.
Prerequisites
- Установлен плагин оператора
Alauda AI. - Установлен плагин оператора
KEDA. InferenceService, использующий режимStandardс runtime vLLM.- Установлен и доступен в кластере
Prometheus.
Предоставление KServe доступа к ресурсам KEDA
Перед продолжением примените следующие RBAC-ресурсы, чтобы kserve-controller-manager мог управлять объектами KEDA (ScaledObject, TriggerAuthentication и др.):
Если KEDA была установлена после Alauda AI, перезапустите pod kserve-controller-manager (в namespace kserve) после применения вышеуказанных RBAC, чтобы он обнаружил CRD KEDA:
Steps
Остановите запущенный InferenceService
Перед внесением изменений остановите запущенный InferenceService, чтобы избежать конфликтов между существующим HPA и новым скейлером, управляемым KEDA. Добавьте следующую аннотацию для остановки:
Если у запущенного InferenceService уже есть ресурс HPA, переключение на KEDA без предварительной остановки вызовет конфликт ресурсов.
Создайте TriggerAuthentication для Prometheus
KEDA требует ресурс TriggerAuthentication в том же namespace, что и ваш InferenceService, для аутентификации в Prometheus.
Учетные данные Prometheus хранятся в секретах платформы kube-prometheus-alertmanager-basic-auth в namespace cpaas-system. Выполните следующую команду, чтобы скопировать их в ваш namespace:
Затем создайте TriggerAuthentication, ссылающийся на этот секрет:
Следующие имена должны быть согласованы во всех ресурсах:
prom-basic-auth-secret— имяSecret, должно совпадать сsecretTargetRef.nameвнутриTriggerAuthentication.prom-basic-auth— имяTriggerAuthentication, должно совпадать сauthenticationRef.authenticationRef.nameв спецификацииInferenceService.
Настройте InferenceService для KEDA
После остановки сервиса обновите манифест InferenceService, добавив конфигурацию автоскейлинга KEDA:
- Отключает встроенный HPA KServe и передает масштабирование KEDA.
- Устанавливает максимальное количество реплик. Чтобы сервис мог автоматически масштабироваться при увеличении трафика, убедитесь, что значение больше 1 (например, 2).
- Ссылается на ресурс
TriggerAuthentication, содержащий учетные данные для аутентификации в Prometheus. Заменитеprom-basic-authна имя вашего фактическогоTriggerAuthentication. - Запрос PromQL, возвращающий текущую нагрузку в виде одного числового значения. Замените
<your-model-name>и<your-namespace>на ваши реальные значения. - Внутренний адрес вашего экземпляра Prometheus, например,
http://prometheus-operated.cpaas-system.svc.cluster.local:9090. - Целевое значение на реплику. KEDA вычисляет
ceil(metricValue / value), чтобы определить желаемое количество реплик.
Метрики vLLM для автоскейлинга
Метрики vLLM автоматически собираются платформой. Выбор правильной метрики — пожалуй, самая важная часть настройки: запрос Prometheus должен возвращать одно числовое значение, точно отражающее текущую нагрузку на вашу модель.
Часто используемые метрики vLLM для автоскейлинга:
Используйте функцию агрегации sum(), чтобы запрос возвращал одно значение по всем pod-ам вашего развертывания. Например, для масштабирования по количеству ожидающих запросов:
Это суммирует все ожидающие запросы по всем pod-ам предиктора, давая KEDA единый агрегированный сигнал для масштабирования.
Проверьте настройку
После применения обновленного InferenceService KServe автоматически создаст KEDA ScaledObject от вашего имени. Проверьте, что всё работает:
Вывод HPA покажет текущее значение метрики, порог масштабирования и текущее/желаемое количество реплик. По мере роста трафика на вывод значение TARGETS будет увеличиваться, и количество реплик будет автоматически масштабироваться вверх.