Перейти к основному содержимому

Чтобы получить чистое Markdown-содержимое этой страницы, добавьте .md к этому URL. Полный индекс документации см. на https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая справочник API и примеры SDK, см. на https://docs.nvidia.com/dynamo/llms-full.txt.

Planner

Почему для инференса LLM нужен другой автомасштабировщик​

Масштабировать традиционный веб-сервис просто: отслеживать CPU или частоту запросов, добавлять реплики при высокой нагрузке и удалять их при низкой. Такие инструменты, как HPA и KEDA, хорошо подходят для этого, потому что связь между нагрузкой и задержкой примерно линейна: вдвое больше запросов означает примерно вдвое больше нагрузки на CPU, поэтому простая пороговая политика удерживает время ответа стабильным.

Инференс LLM нарушает эти предположения:

  • Задержка зависит от содержимого запроса, а не только от числа запросов. Один запрос с промптом на 32K токенов потребляет на порядки больше вычислений, чем короткий запрос. Два запроса в секунду могут означать совершенно разную нагрузку на GPU в зависимости от длин входной и выходной последовательностей.
  • Prefill и decode имеют разные характеристики масштабирования. В дезагрегированном обслуживании prefill ограничен вычислениями (масштабируется с длиной входа), а decode ограничен памятью (масштабируется с числом параллельных последовательностей и использованием KV-кэша). Одно число реплик не отражает оба фактора.
  • Важные метрики не являются стандартными. SLA, которые важны пользователям, — Time to First Token (TTFT) и Inter-Token Latency (ITL) — плохо отображаются на загрузку CPU или пропускную способность запросов. HPA не может целиться в «держать P95 TTFT ниже 500 мс», потому что для этого нужно понимать связь между длинами последовательностей, давлением на память GPU и задержкой.
  • Решения о масштабировании дороги. Запуск GPU worker занимает минуты, а не секунды. Избыточное масштабирование расходует GPU-часы по облачным ценам; недостаточное масштабирование нарушает SLA. Автомасштабировщик должен прогнозировать спрос, а не только реагировать на него.

Dynamo Planner — это автомасштабировщик, специально созданный для этих ограничений. Он понимает данные профилирования движков, отслеживает использование GPU по каждому worker, прогнозирует шаблоны трафика и принимает решения о масштабировании, напрямую ориентированные на SLA по TTFT и ITL, а не на косвенные метрики.

Начало работы: цели оптимизации​

Planner предлагает три настройки optimization_target, которые управляют тем, как принимаются решения о масштабировании:

ЦельОписаниеТребует SLA?Требует профилирования?
throughput (по умолчанию)Максимизирует пропускную способность за счет масштабирования на основе глубины очереди и использования KV-кэша. Масштабируется вверх, когда движки насыщены, и вниз, когда использование падает.НетНет
latencyМинимизирует задержку, агрессивно масштабируясь, чтобы очереди оставались короткими. Масштабируется вверх при более низких порогах использования.НетНет
slaНацеливается на конкретные значения SLA для TTFT/ITL с помощью регрессионных моделей производительности. Самый точный вариант, но требует настройки.Да (ttft_ms, itl_ms)Рекомендуется

Рекомендуем начинать с цели throughput по умолчанию — она работает сразу, без какой-либо настройки. Переключайтесь на latency, если ваша рабочая нагрузка чувствительна к задержке, или на sla, когда вам нужно точное соблюдение SLA с профилированием перед развертыванием.

Только начинаете работать с Planner? Начните с руководства по Planner, где описан полный рабочий процесс, включая профилирование и развертывание.

Нужна координация нескольких DGD? См. руководство по Global Planner для координации с общей политикой между несколькими DGD и развертываний с несколькими пулами за одной конечной точкой.

Режимы масштабирования​

Planner поддерживает два режима масштабирования, которые могут работать независимо или вместе:

  • Масштабирование на основе пропускной способности: использует данные о производительности движка перед развертыванием (из self-benchmark или profiler) и прогноз трафика, чтобы вычислить число реплик, необходимое для достижения целей TTFT и ITL. Корректировки выполняются с более длинным интервалом (по умолчанию 180 с). Это основной режим для производственных развертываний.
  • Масштабирование на основе нагрузки: использует ForwardPassMetrics (FPM) из плоскости событий Dynamo и подбирает онлайн-линейную регрессию для принятия решений о масштабировании. Данные перед развертыванием и KV Router не требуются. Корректировки выполняются с коротким интервалом (по умолчанию 5 с), чтобы быстро реагировать на всплески.

Когда включены оба режима, масштабирование на основе пропускной способности задает нижнюю границу емкости (долгосрочное планирование), а масштабирование на основе нагрузки обрабатывает корректировки в реальном времени выше этой границы.

Матрица возможностей​

ВозможностьНа основе пропускной способностиНа основе нагрузки
Развертывание
ДезагрегированноеПоддерживаетсяПоддерживается
АгрегированноеПоддерживаетсяПоддерживается
LLM-фреймворк
SGLangПоддерживаетсяПоддерживается
TensorRT-LLMПоддерживаетсяПоддерживается
vLLMПоддерживаетсяПоддерживается
Требует данных перед развертываниемДа (self-benchmark или profiler)Нет
Предикторы нагрузкиARIMA, Prophet, Kalman, ConstantН/Д
Router
Любой (round-robin, random и т. д.)ПоддерживаетсяНе поддерживается
KV RouterПоддерживаетсяПоддерживается
Коннекторы
KubernetesConnectorПоддерживаетсяПоддерживается
VirtualConnectorПоддерживаетсяПоддерживается

Когда использовать тот или иной режим​

  • Масштабирование на основе пропускной способности следует включать всегда, когда доступны данные о производительности движка (через self-benchmark или профилирование перед развертыванием). Оно обеспечивает стабильное планирование емкости на основе прогноза.
  • Масштабирование на основе нагрузки следует включать, когда трафик имеет всплески или его трудно прогнозировать. Оно быстро реагирует на изменения нагрузки в реальном времени и не требует данных перед развертыванием.
  • Оба режима вместе: чтобы получить преимущества обоих подходов, включите оба. Масштабирование на основе пропускной способности задает нижнюю границу (долгосрочную емкость), а масштабирование на основе нагрузки обрабатывает всплески выше этой границы. Когда включены оба режима, используйте более длинный --adjustment-interval для масштабирования на основе пропускной способности.

Быстрый старт​

Предварительные требования​

Режим по умолчанию (без настройки)​

Planner работает сразу и не требует настройки. По умолчанию optimization_target установлен в throughput, что использует статические пороги глубины очереди и использования KV-кэша — SLA и профилирование не требуются:

# Minimal planner config — uses throughput optimization by default
features:
planner:
mode: disagg
backend: vllm

Для рабочих нагрузок, чувствительных к задержке:

features:
planner:
mode: disagg
backend: vllm
optimization_target: latency

Масштабирование на основе SLA (расширенный режим)​

Для точного нацеливания на SLA с профилированием перед развертыванием задайте optimization_target: sla:

features:
planner:
optimization_target: sla
enable_throughput_scaling: true
enable_load_scaling: true
ttft_ms: 500.0
itl_ms: 50.0
pre_deployment_sweeping_mode: rapid

Самый быстрый путь к масштабированию на основе SLA — через DynamoGraphDeploymentRequest, который автоматически профилирует вашу модель. См. примеры Planner с готовыми для копирования манифестами DGDR.

Полный рабочий процесс см. в руководстве по Planner.

Текущие ограничения​

Масштабирование на основе нагрузки​

Масштабирование на основе нагрузки имеет следующие известные ограничения. Масштабирование на основе пропускной способности ими не затрагивается.

Требует ForwardPassMetrics (FPM). Масштабирование на основе нагрузки использует метрики по каждому движку и каждой итерации, доставляемые через плоскость событий Dynamo (ForwardPassMetrics). KV Router не требуется для масштабирования на основе нагрузки. Доступность FPM по backend:

  • vLLM — поддерживается. Автоматически включается, когда движок использует InstrumentedScheduler и задан DYN_FORWARDPASS_METRIC_PORT.
  • TensorRT-LLM — поддерживается для worker без attention-DP (attention_dp_size == 1); отключается при attention_dp_size > 1 до появления выдачи FPM по каждому rank.
  • SGLang — pipeline подключен в Dynamo, но upstream-модуль FPM SGLang не включен в текущий runtime-образ SGLang 1.2.0. Предварительное требование к runtime-образу см. в разделе SGLang FPM.

Общие​

Активные запросы во время масштабирования вниз. Когда Planner масштабирует worker вниз, worker завершается без ожидания завершения активных запросов. Запросы, которые находились в середине prefill на завершенном worker, завершатся ошибкой. В дезагрегированных развертываниях это также может затронуть decode worker, ожидавшие передачи KV-кэша от завершенного prefill worker. Обходной путь: задайте --min-endpoint таким значением, которое не позволит масштабироваться ниже вашего устойчивого базового уровня трафика, и используйте более низкое значение --loadbased-scaling-down-sensitivity, чтобы снизить частоту событий масштабирования вниз.

Документация​

ДокументОписание
Руководство по PlannerРазвертывание, настройка, интеграция
Дизайн PlannerАрхитектура и внутреннее устройство алгоритмов
Примеры PlannerПримеры YAML для DGDR, образцы конфигураций, расширенные паттерны
Руководство по Global PlannerКоординация нескольких DGD, общие GPU-бюджеты, развертывания с несколькими пулами за одной конечной точкой

Справочник конфигурации​

Основные аргументы​

АргументПо умолчаниюОписание
Общие
--namespace$DYN_NAMESPACE или dynamoЛогическое пространство имен Dynamo
--backendvllmBackend-фреймворк (sglang, trtllm, vllm)
--modedisaggРежим Planner (disagg, prefill, decode, agg)
--optimization-targetthroughputЦель масштабирования: throughput (пороги очереди/использования), latency (агрессивная низкая задержка), sla (нацеливание на SLA на основе регрессии)
--environmentkubernetesСреда развертывания
ttft_ms500.0Целевое Time To First Token (мс)
itl_ms50.0Целевая Inter-Token Latency (мс)
--max-gpu-budget8Максимальное число GPU по всем worker
--min-endpoint1Минимальное число реплик для каждого типа worker
--decode-engine-num-gpu1GPU на decode engine
--prefill-engine-num-gpu1GPU на prefill engine
advisoryfalseРежим только рекомендаций. Planner вычисляет и сообщает рекомендуемое число реплик, но не выполняет действия масштабирования и не меняет развертывание.
Масштабирование на основе пропускной способности
--enable-throughput-scalingtrueВключить масштабирование на основе пропускной способности
--adjustment-interval180Секунды между решениями масштабирования на основе пропускной способности
--profile-results-dirprofiling_resultsПуть к данным профилирования (NPZ/JSON)
--load-predictorarimaМодель прогнозирования (arima, prophet, kalman, constant)
Масштабирование на основе нагрузки
--enable-loadbased-scalingfalseВключить масштабирование на основе нагрузки
--loadbased-adjustment-interval5Секунды между обновлениями регрессии FPM и решениями масштабирования на основе нагрузки
--max-num-fpm-samples64Максимальное число сохраняемых наблюдений FPM для регрессии
--fpm-sample-bucket-size16Число buckets для удаления наблюдений (должно быть полным квадратом)
--loadbased-scaling-down-sensitivity80Чувствительность масштабирования вниз 0-100 (0=никогда, 100=агрессивно)
--loadbased-metric-samples10Число выборок метрик на интервал корректировки
--loadbased-min-observations5Минимальное число наблюдений перед активацией регрессии

Переменные окружения​

ПеременнаяПо умолчаниюОписание
DYN_NAMESPACEdynamoЛогическое пространство имен Dynamo
DYN_PARENT_DGD_K8S_NAME(обязательно)Имя родительского ресурса DGD K8s
PROMETHEUS_ENDPOINThttp://prometheus-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090URL Prometheus
PLANNER_PROMETHEUS_PORT0 (отключено)Порт для собственных метрик Prometheus у planner

Мониторинг​

Дашборд Grafana​

Разверните дашборд planner:

kubectl apply -n monitoring -f deploy/observability/grafana-planner-dashboard-configmap.yaml

Дашборд показывает:

  • Число worker и использование GPU во времени
  • Наблюдаемые TTFT, ITL, частоту запросов, длины последовательностей
  • Прогнозируемую нагрузку и рекомендуемое число реплик
  • Состояние регрессионной модели FPM

Метрики Prometheus​

Когда задан PLANNER_PROMETHEUS_PORT, planner обслуживает собственную конечную точку метрик. Экспортируемые ряды используют соглашение именования dynamo_planner_* (подчеркивания и стандартные суффиксы единиц измерения), заменяя старые имена в стиле planner:*.

Масштабирование на основе пропускной способности получает метрики трафика из общего для кластера сервера Prometheus:

  • Число и длительность запросов
  • Распределения TTFT и ITL
  • Длины входных/выходных последовательностей

Planner может читать эти сигналы трафика либо из публичного Frontend, либо из локального для пула LocalRouter. Используйте throughput_metrics_source: "frontend" для развертывания с одним DGD. Используйте throughput_metrics_source: "router" для GlobalPlanner / развертываний с несколькими пулами, чтобы Planner каждого пула читал трафик собственного router, а не общей публичной конечной точки.

Вход PlannerИсточник FrontendИсточник Router
Число запросовdynamo_frontend_requests_totaldynamo_component_router_requests_total
TTFTdynamo_frontend_time_to_first_token_secondsdynamo_component_router_time_to_first_token_seconds
ITLdynamo_frontend_inter_token_latency_secondsdynamo_component_router_inter_token_latency_seconds
Длительность запросаdynamo_frontend_request_duration_secondsdynamo_component_request_duration_seconds до появления метрик длительности, специфичных для router
Длина входной последовательности / ISLdynamo_frontend_input_sequence_tokensdynamo_component_router_input_sequence_tokens
Длина выходной последовательности / OSLdynamo_frontend_output_sequence_tokensdynamo_component_router_output_sequence_tokens
Доля попаданий KVНедоступна из источника frontenddynamo_component_router_kv_hit_rate

Planner для пропускной способности использует число запросов, ISL, OSL и необязательную долю попаданий KV как основные входы прогноза трафика. TTFT, ITL и длительность запросов также собираются и экспортируются как наблюдаемая диагностика.

Масштабирование на основе нагрузки использует ForwardPassMetrics (FPM) из плоскости событий Dynamo:

  • Wall time по каждой итерации, запланированные токены prefill/decode и состояние запросов в очереди
  • Доставляется через FpmEventSubscriber с автоматическим обнаружением движков и отслеживанием жизненного цикла
  • Scraping /metrics у router не требуется

FPM наблюдает запланированную работу и очереди на стороне движка. Он не включает запросы, которые еще находятся в очереди LocalRouter до назначения движка.

Основные gauges на порту planner включают число реплик (dynamo_planner_num_prefill_replicas, dynamo_planner_num_decode_replicas), наблюдаемый трафик (dynamo_planner_observed_*), рекомендации по репликам (dynamo_planner_predicted_num_prefill_replicas, dynamo_planner_predicted_num_decode_replicas) и накопленную метрику dynamo_planner_gpu_hours.

Gauges прогноза пропускной способности dynamo_planner_predicted_requests_per_second, dynamo_planner_predicted_input_sequence_tokens и dynamo_planner_predicted_output_sequence_tokens подключены к прогнозу трафика для масштабирования на основе пропускной способности и экспортируются рядом с наблюдаемыми метриками длины последовательностей.

Режим advisory​

Задайте advisory: true, чтобы запустить локальный Planner в режиме только рекомендаций. Это рекомендуется, когда вы оцениваете новую конфигурацию Planner, проверяете цели SLA или анализируете, как Planner реагировал бы на production-трафик, прежде чем разрешить ему масштабировать worker.

В режиме advisory Planner по-прежнему наблюдает трафик и данные FPM, вычисляет рекомендуемое число реплик prefill и decode, записывает сводки рекомендаций в логи, экспортирует метрики прогнозируемых реплик и включает рекомендации в диагностические отчеты. Рекомендации не применяются как решения о масштабировании: Planner не выполняет действия масштабирования, не отправляет изменения реплик в Kubernetes или GlobalPlanner и не изменяет развертывание.

Диагностические метрики​

Дополнительные ряды поддерживают дашборды и офлайн-анализ:

  • Оценки задержки на основе регрессии: dynamo_planner_estimated_ttft_ms и dynamo_planner_estimated_itl_ms отражают максимальные оценочные TTFT и ITL из онлайн-регрессии по всем движкам.
  • Емкость движка: dynamo_planner_engine_prefill_requests_per_second и dynamo_planner_engine_decode_requests_per_second сообщают емкость одного движка для prefill и decode при настроенном SLA.
  • Причины решений о масштабировании: dynamo_planner_load_scaling_decision и dynamo_planner_throughput_scaling_decision — это Enum gauges, в которых метки состояний кодируют, почему каждый режим выбрал масштабирование, удержание или пропуск (например, scale_up, no_fpm_data, set_lower_bound).
  • Глубины очередей FPM по движкам: dynamo_planner_engine_queued_prefill_tokens, dynamo_planner_engine_queued_decode_kv_tokens и dynamo_planner_engine_inflight_decode_kv_tokens помечаются worker_id и dp_rank для каждого движка.

Диагностические HTML-отчеты​

Planner может создавать периодические автономные диагностические HTML-файлы с интерактивными графиками Plotly.

Настройте это в PlannerConfig (или в эквивалентной YAML / привязке конструктора, которую использует ваше развертывание):

  • report_interval_hours: интервал в симулированном времени между отчетами (по умолчанию 24.0 часа); задайте None, чтобы отключить.
  • report_output_dir: каталог, в который записываются HTML-файлы (по умолчанию ./planner_reports).
  • live_dashboard_port: порт для HTTP-дашборда реального времени (по умолчанию 8080). Задайте 0, чтобы отключить. Сервер aiohttp запускается на указанном порту и отдает текущие накопленные данные snapshot как интерактивный отчет Plotly по адресу http://<host>:<port>/. В отличие от периодических отчетов, live dashboard не очищает snapshots — он всегда показывает все данные, накопленные с последнего периодического отчета (или с запуска, если периодические отчеты отключены).

Отчеты агрегируют snapshots по каждому tick и используют TickInput.now_s для временных меток, поэтому ведут себя одинаково в live-запусках (wall clock) и в replay с симулированными часами. Типичные графики охватывают число worker, рекомендуемое число реплик, наблюдаемые и оценочные задержки в сравнении с целями SLA, частоту запросов, емкость движков, временные линии решений о масштабировании и длины входных/выходных последовательностей. На графике Replica Counts фактические реплики показаны линиями, а рекомендованное Planner число реплик prefill и decode показано дискретными маркерами в тех tick, где были сформированы рекомендации. Это особенно полезно с advisory: true, потому что такие рекомендации являются только предложениями.