CUDA Graphs, модели рассуждений и разобщённый сервинг

Современная ИИ-инфраструктура доводит производительность до физических пределов кремния и кластеров за счёт устранения накладных расходов CPU, циклов рассуждений во время инференса и маршрутизации GPU-кластеров со специализацией по фазам. Эти три техники обеспечивают работу самых быстрых и умных производственных ИИ-систем сегодняшнего дня.
1. CUDA Graphs и слияние ядер: устранение накладных расходов CPU и памяти
По мере того как современные GPU (вроде H100 и B200) становились экспоненциально быстрее, выполнение одного лёгкого ядра GPU может занимать всего от 2 до 5 микросекунд. Однако CPU часто тратит от 10 до 20 микросекунд только на подготовку, проверку и запуск этого ядра через драйвер PCIe — оставляя многомиллионный GPU полностью простаивать в ожидании инструкций CPU.
- Слияние ядер (объединение операций для экономии памяти и запусков).
- Узкое место без слияния. Стандартный слой Transformer последовательно выполняет десятки мелких операций (например, LayerNorm → Linear → Add Residual → GeLU). Без слияния GPU запускает отдельные ядра для каждого шага, записывая промежуточные тензоры в медленную HBM (VRAM) и сразу же считывая их обратно для следующего шага.
- Слитное выполнение. Компиляторы вроде torch.compile (TorchInductor) и TensorRT-LLM сливают несколько поэлементных и редукционных операций в одно пользовательское ядро CUDA/Triton. Значения загружаются из HBM один раз, преобразуются внутри сверхбыстрых внутрикристальных регистров/SRAM и записываются обратно в HBM только в самом конце — резко сокращая и трафик пропускной способности памяти, и количество запусков ядер.
- CUDA Graphs (воспроизведение целых конвейеров выполнения за один раз).
- Запись и воспроизведение. Даже после слияния ядер прямой проход LLM всё ещё требует сотен запусков ядер на каждый генерируемый токен. CUDA Graphs решают это, захватывая целую последовательность операций GPU — ядра, копии памяти и зависимости — во время прогревочного запуска и компилируя их в статический граф выполнения, хранящийся непосредственно в памяти GPU.
- Нулевое вмешательство CPU. Во время инференса в реальном времени вместо того, чтобы CPU запускал 300 отдельных ядер одно за другим, CPU выдаёт один единственный вызов API (cudaGraphLaunch), который автономно запускает весь прямой проход на GPU.
- Работа с динамическими формами. Поскольку CUDA Graphs требуют статических адресов памяти и форм тензоров, движки инференса дополняют входящие батчи до фиксированных размеров корзин (например, размеры батчей 1, 2, 4, 8, 16) и обновляют указатели входных данных на месте перед воспроизведением заранее захваченного графа.
2. Вычисления во время тестирования и модели рассуждений (o1/o3 и DeepSeek-R1)
Исторически ИИ-лаборатории масштабировали интеллект строго за счёт увеличения вычислений на предобучение (более крупные модели, обученные на большем объёме интернет-текста). Модели рассуждений вроде OpenAI o1/o3 и DeepSeek-R1 открыли вторую ось масштабирования: вычисления во время тестирования (масштабирование во время инференса), позволяя моделям «думать» дольше перед ответом.
- Обучение с подкреплением для цепочки рассуждений (CoT).
- Вместо того чтобы полагаться исключительно на написанные людьми примеры пошаговых рассуждений, эти модели обучаются с помощью крупномасштабного обучения с подкреплением (RL) (такого как GRPO — Group Relative Policy Optimization в DeepSeek-R1) на проверяемых областях вроде математики, программирования и формальной логики.
- Модель генерирует множество кандидатных путей рассуждения, получает объективные награды только когда её итоговый ответ проходит модульные тесты или математическую проверку, и самостоятельно открывает эмерджентные когнитивные поведения — включая самопроверку, откат при достижении тупика и разбиение сложных задач на подцели.
- Как масштабируются вычисления инференса.
- При получении сложного промпта модель генерирует тысячи внутренних «токенов размышления» в скрытом блокноте, прежде чем выдать финальный ответ. Точность улучшается логарифмически по мере того, как модель тратит больше токенов инференса на исследование гипотез.
- Сдвиг вычислительного компромисса. В традиционных LLM инференс дёшев и быстр (генерация ~50 выходных токенов). В моделях рассуждений один запрос может генерировать от 10 000 до 50 000 токенов размышления, превращая инференс в массивную, продолжительную нагрузку пакетной генерации, где доминируют рост KV-кэша и эффективность attention на длинном контексте.
3. Разобщённые Prefill и Decode
Обслуживание LLM состоит из двух принципиально противоположных вычислительных фаз. Выполнение обеих фаз на одном и том же GPU создаёт серьёзные конфликты планирования и недоиспользование оборудования.
| Фаза | Характер нагрузки | Аппаратное узкое место | Метрика задержки |
|---|---|---|---|
| Prefill (обработка промпта) | Обрабатывает все токены промпта (например, 10 000 токенов) параллельно за один прямой проход. | Ограничена вычислениями (насыщает тензорные ядра GPU огромными матричными умножениями). | TTFT (Time-To-First-Token) |
| Decode (генерация токенов) | Генерирует выходные токены по одному последовательно, считывая весь KV-кэш на каждом шаге. | Ограничена пропускной способностью памяти (тензорные ядра в основном простаивают в ожидании чтений из VRAM). | TPOT (Time-Per-Output-Token) |
- Проблема интерференции при совместном размещении.
- При традиционном едином сервинге, если один пользователь отправляет огромный документ на 32 000 токенов на Prefill, пока 50 других пользователей находятся в середине потоковой генерации Decode, массивная матричная математика prefill монополизирует тензорные ядра GPU — вызывая заметные зависания и всплески задержки («заикания») у всех 50 потоковых пользователей.
- Более того, Prefill требует высокой вычислительной мощности во FLOPS, тогда как Decode требует огромной пропускной способности и ёмкости памяти HBM для хранения больших пакетных KV-кэшей.
- Разделение кластера (разобщённая архитектура).
- Современные гипермасштабные системы инференса (такие как Mooncake, DistServe и NVIDIA Dynamo) делят GPU-кластер на два выделенных пула:
- 1. Пул Prefill: Оптимизирован под сырую вычислительную пропускную способность (высокая загрузка тензорных ядер, меньший тензорный параллелизм), чтобы быстро обрабатывать длинные промпты и достигать агрессивных целей Time-To-First-Token (TTFT).
- 2. Пул Decode: Оптимизирован под высокую пропускную способность памяти и большую ёмкость KV-кэша (более широкий тензорный/экспертный параллелизм, большие размеры батчей), чтобы плавно транслировать токены на пиковом значении токенов в секунду.
- Высокоскоростная передача KV-кэша. Как только GPU Prefill завершает обработку промпта и строит начальный KV-кэш, он передаёт этот KV-кэш напрямую по сверхбыстрым соединениям NVLink или InfiniBand RDMA в VRAM GPU Decode, который немедленно принимает генерацию токенов без какой-либо интерференции.