3 неочевидных способа сэкономить на инференсе ML-модели в облаке кроме автоскейлинга 💸💸💸

Привет! Сегодня хотим поделиться тремя полезными способами сэкономить на инференсе, которые работают в облаке, причем, не только у нас (что? да!).
А то ведь как бывает: запустишь свою крутую LLM-ку в продакшен, а счет прилетает такой, что хочется отключить обратно. Горизонтальный скейлинг не всегда выход. Но дешевле — не значит менее производительно. Мы приведем алгоритмы для сервиса Evolution ML Inference, но их можно адаптировать для любого провайдера.
Способ 1. Использовать Sleep Mode vLLM 🔧
Способ работает только для языковых моделей (LLM), таких как Qwen, LLaMA, Mistral и других, запускаемых через vLLM. С диффузионными моделями, CV и временными рядами фокус не прокатит. Sleep Mode временно выгружает веса модели из GPU в RAM, освобождая до 90% видеопамяти. А раз GPU-ресурс не используется, то и не тарифицируется. «Разбудить» модель можно за секунды и без полной перезагрузки.
Что делать:
1. Запустите модель в ML Inference с runtime vLLM.
2. Включите режим разработки:
VLLM_SERVER_DEV_MODE=1
3. Добавьте флаг:
--enable-sleep-mode
4. Управляйте через HTTP:
⦁ POST /sleep?level=1 — выгрузить веса, сохранить возможность быстрого запуска.
⦁ POST /wake_up — вернуть модель в активное состояние.
Когда применять:
В сценариях с неравномерной нагрузкой (например, днём активность, ночью — нет).
Между итерациями RLHF, когда нужно освободить GPU.
Способ 2. Serverless + Scale to Zero 🔧
Способ подходит вообще для всего. Суть в том, что контейнер с моделью останавливается при отсутствии запросов, освобождая все выделенные ресурсы (GPU, RAM, CPU). Кеш модели сохраняется, но тоже не тарифицируется в период простоя — PROFIT! При поступлении нового запроса модель запускается из кеша — и тут, мы, конечно, имеем проблему с задержкой при «холодном старте». Но пара секунд ожидания экономит нам сотни тысяч.
Что делать:
1. При создании инференса в ML Inference:
⦁ Установите min_replicas = 0.
⦁ Выберите тип масштабирования: RPS или Concurrency.
2. Убедитесь, что Idle-таймаут = 40 сек.
Когда применять:
Для MVP, демо, внутренних API.
Сценариев с нерегулярной нагрузкой (например, 100 запросов в день).
Моделей, где допустима небольшая задержка при первом запросе.
Способ 3. Time Slicing GPU 🔧
Способ работает в рамках Managed Kubernetes (MK8s), при условии, что в кластере создана группа узлов с GPU NVIDIA Tesla V100. Суть в том, что одна физическая GPU делится между несколькими подами (например, 5 подов по 1 GPU): каждый получает свою долю времени, как если бы у него была выделенная карта.
Что делать:
1. Создайте кластер Managed Kubernetes с узлом, где:
⦁ GPU: NVIDIA Tesla V100.
⦁ Количество GPU: 1.
2. Настройте Time-Slicing. Создайте ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
namespace: gpu-operator
data:
tesla-v100: |-
version: v1
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 5
Примените: kubectl apply -f cloudru-time-slicing.yaml
3. Установите NVIDIA GPU Operator. В Личном кабинете Cloud.ru:
⦁ Перейдите в кластер → Плагины → Добавить.
⦁ Выберите NVIDIA GPU Operator.
⦁ В расширенной конфигурации укажите:
devicePlugin:
config:
name: time-slicing-config
default: tesla-v100
4. Проверьте работу. Запустите Deployment с 5 репликами:
resources:
limits:
nvidia.com/gpu: 1
Все 5 подов должны перейти в статус Running.
Когда применять:
Для тестовых и демо-сценариев, стартапов или MVP.
Для низконагруженных задач — инференс небольших моделей, дообучение, RLHF.
Для команд разработки, чтобы работать в одном кластере и делить ресурсы.
А какие нестандартные методы оптимизации бюджета используете вы? Собираем коллекцию советов для экономных в комментариях!












