Чтобы получить чистое Markdown-содержимое этой страницы, добавьте .md к этому URL. Полный индекс документации см. на https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая справочник API и примеры SDK, см. на https://docs.nvidia.com/dynamo/llms-full.txt.
Бенчмаркинг Planner в DynoSim
В этом руководстве показано, как оценивать производительность Dynamo Planner на записанной трассе, запуская его внутри DynoSim. Используйте его, чтобы сравнивать топологии agg и disagg, настраивать целевые SLA и изучать, как особенности реального развертывания (время запуска engine, количество workers) влияют на поведение planner, и все это без запуска живого кластера.
Общие принципы запусков DynoSim (формат входных данных, ускорение поступления запросов, режимы router, синтетические нагрузки) см. в разделе Запуски DynoSim. Это руководство сосредоточено на пути с --planner-config.
1. Настройка
Сборка
Соберите Python bindings Dynamo, чтобы стала доступна команда python -m dynamo.replay:
cd lib/bindings/python
.venv/bin/maturin develop --release
Настоятельно рекомендуется использовать флаг --release. Выполнение DynoSim в основном однопоточное и ограничено CPU на ядре mocker engine; отладочная сборка может быть в 5-10 раз медленнее, и при sweep-запусках это замедление накапливается.
Ключевые параметры конфигурации Planner
Передаются в виде JSON через --planner-config. Используется та же схема, что и у live planner. Наиболее важные для бенчмаркинга поля:
| Поле | Назначение |
|---|---|
mode | "agg" или "disagg" — выбирает стратегию масштабирования и требуемые engine args. |
optimization_target | "sla" использует целевые TTFT/ITL; "throughput" использует статические пороги queue/KV. |
ttft_ms / itl_ms | Целевые SLA в мс. Определяют решения load-scaling. |
enable_throughput_scaling | Периодическое масштабирование на основе прогнозируемой steady-state нагрузки. |
enable_load_scaling | Реактивное масштабирование при краткосрочных всплесках трафика. |
throughput_adjustment_interval_seconds | Количество секунд между решениями throughput-scaling. |
load_adjustment_interval_seconds | Количество секунд между решениями load-scaling. Короткие интервалы дают более быструю реакцию, но больше колебаний. |
pre_deployment_sweeping_mode | "rapid" использует аналитическую модель AIC; оставьте значение незаданным, чтобы вернуться к записанным профильным данным. |
prefill_engine_num_gpu / decode_engine_num_gpu | GPU на реплику engine. Нужно задавать явно — по умолчанию оба поля равны None, а simulation adapter молча интерпретирует None как 0, из-за чего метрика накопленных GPU-часов в отчете становится нулевой. |
report_filename | Имя выходного HTML-файла в ./planner_reports/. |
Ключевые параметры Engine Args
Передаются в виде JSON через --extra-engine-args (agg) или --prefill-engine-args / --decode-engine-args (disagg). DynoSim использует mocker engine, поэтому "engine args" означают входные данные аналитической модели производительности:
| Поле | Назначение |
|---|---|
aic_backend | Backend, который должна эмулировать аналитическая модель, например "vllm", "trtllm", "sglang". |
aic_system | SKU GPU для модели производительности, например "h200_sxm", "h100_sxm", "b200". |
aic_model_path | Идентификатор модели HF, используемый моделью производительности. |
aic_tp_size | Размер tensor parallel для каждой реплики engine. |
startup_time | Симулируемое количество секунд между решением planner о scale-up и моментом, когда новый worker становится активным. Незаданное значение или 0 означает, что workers активируются мгновенно. |
Остальные поля следуют стандартному протоколу mocker engine (см. Запуски DynoSim).
2. Пример: Agg и Disagg на Mooncake Agentic Trace
Загрузите трассу:
mkdir -p traces/mooncake_fast25 && cd traces/mooncake_fast25
curl -sLO https://raw.githubusercontent.com/kvcache-ai/Mooncake/main/FAST25-release/traces/toolagent_trace.jsonl
Запустите agg (2 workers, TP=1):
.venv/bin/python -m dynamo.replay traces/mooncake_fast25/toolagent_trace.jsonl \
--planner-config '{
"mode": "agg",
"optimization_target": "sla",
"ttft_ms": 1500, "itl_ms": 50,
"enable_throughput_scaling": true, "enable_load_scaling": true,
"pre_deployment_sweeping_mode": "rapid",
"throughput_adjustment_interval_seconds": 300, "load_adjustment_interval_seconds": 10,
"prefill_engine_num_gpu": 1, "decode_engine_num_gpu": 1,
"report_filename": "dynosim_agg.html"
}' \
--extra-engine-args '{"aic_backend": "vllm", "aic_system": "h200_sxm", "aic_model_path": "nvidia/Llama-3.1-8B-Instruct-FP8", "aic_tp_size": 1}' \
--num-workers 2 --arrival-speedup-ratio 1.0
Запустите disagg (1P1D, TP=1):
.venv/bin/python -m dynamo.replay traces/mooncake_fast25/toolagent_trace.jsonl \
--planner-config '{
"mode": "disagg",
"optimization_target": "sla",
"ttft_ms": 1500, "itl_ms": 50,
"enable_throughput_scaling": true, "enable_load_scaling": true,
"pre_deployment_sweeping_mode": "rapid",
"throughput_adjustment_interval_seconds": 300, "load_adjustment_interval_seconds": 10,
"prefill_engine_num_gpu": 1, "decode_engine_num_gpu": 1,
"report_filename": "dynosim_disagg.html"
}' \
--prefill-engine-args '{"aic_backend": "vllm", "aic_system": "h200_sxm", "aic_model_path": "nvidia/Llama-3.1-8B-Instruct-FP8", "aic_tp_size": 1}' \
--decode-engine-args '{"aic_backend": "vllm", "aic_system": "h200_sxm", "aic_model_path": "nvidia/Llama-3.1-8B-Instruct-FP8", "aic_tp_size": 1}' \
--num-prefill-workers 1 --num-decode-workers 1 --arrival-speedup-ratio 1.0
Каждый запуск выводит сводную таблицу AIPerf в stdout и записывает диагностический HTML-отчет в ./planner_reports/<report_filename>. Для этой трассы с длинным ISL и коротким OSL топология agg лучше, чем disagg: disagg получает немного лучший ITL ценой заметно большего количества GPU-часов.
3. Пример: sweep времени cold start
Насколько достижение SLA чувствительно ко времени запуска engine? Выполните sweep startup_time от 0 до 300 секунд с шагом 10 секунд и записывайте TTFT/ITL/GPU-часы для каждого запуска.
#!/usr/bin/env bash
set -euo pipefail
TRACE=traces/mooncake_fast25/toolagent_trace.jsonl
OUT=planner_reports/sweep_startup
mkdir -p "$OUT"
run_one() {
local s=$1
local name=$(printf "dynosim_agg_startup_%03d.html" "$s")
local extra
if [[ "$s" -eq 0 ]]; then
extra='{"aic_backend":"vllm","aic_system":"h200_sxm","aic_model_path":"nvidia/Llama-3.1-8B-Instruct-FP8","aic_tp_size":1}'
else
extra=$(printf '{"aic_backend":"vllm","aic_system":"h200_sxm","aic_model_path":"nvidia/Llama-3.1-8B-Instruct-FP8","aic_tp_size":1,"startup_time":%d}' "$s")
fi
.venv/bin/python -m dynamo.replay "$TRACE" \
--planner-config "$(printf '{"mode":"agg","optimization_target":"sla","ttft_ms":1500,"itl_ms":50,"enable_throughput_scaling":true,"enable_load_scaling":true,"pre_deployment_sweeping_mode":"rapid","throughput_adjustment_interval_seconds":300,"load_adjustment_interval_seconds":10,"prefill_engine_num_gpu":1,"decode_engine_num_gpu":1,"report_filename":"%s"}' "$name")" \
--extra-engine-args "$extra" \
--num-workers 2 --arrival-speedup-ratio 1.0 \
--report-json "$OUT/startup_$(printf '%03d' "$s").json" \
>"$OUT/startup_$(printf '%03d' "$s").log" 2>&1
}
export -f run_one
# Run 12 sweeps in parallel; adjust -P for your machine.
seq 0 10 300 | xargs -n1 -P12 -I{} bash -c 'run_one "$@"' _ {}
Каждый запуск выводит таблицу метрик AIPerf (извлеките TTFT / ITL avg / p90) и свой HTML-отчет (найдите через grep GPU hours: <float>). Если построить эти значения относительно startup_time, получится:

Наблюдения по этому sweep (agg, TTFT SLA 1,500 мс, ITL SLA 50 мс, H200-SXM, Llama-3.1-8B-FP8, TP=1):
- Обрыв SLA около 100-120 с. Ниже этого порога planner масштабируется достаточно быстро, чтобы удерживать TTFT; выше него p99 TTFT расходится, и система постоянно остается перегруженной очередью.
- Количество событий масштабирования монотонно снижается (42 → 8) по мере роста startup — в запусках с долгим startup load planner должен ждать стабилизации перед следующим решением о масштабировании.
- ITL менее чувствителен, чем TTFT, пока очередь не насыщается. Ниже обрыва ITL растет умеренно (25 → 30 мс avg); выше него p90 ITL скачет примерно до 200 мс, поскольку decode requests испытывают нехватку ресурсов.