Инференс LLM в продакшене: 4 точки отказа и скрипты для их диагностики
Инференс LLM (inference, этап, когда обученная модель обрабатывает запросы пользователей) в демо-среде и в продакшене ведёт себя по-разному, и Стас Погоржельский, технологический евангелист VK Cloud, разобрал четыре конкретных механизма деградации с воспроизводимыми скриптами и порогами для алертов.

Демо-запуск модели всегда быстрый, но реальная нагрузка за неделю превращает стабильный сервис в непредсказуемый: растёт p99, утекает память, а запрос, который проходил вчера, сегодня роняет систему по OOM (out of memory, нехватка оперативной памяти GPU).
Материал VK Cloud фиксирует разрыв между «поставил модель и прогнал пару запросов» и «сервис неделю живёт под реальной нагрузкой». Погоржельский описывает четыре точки отказа: фрагментацию KV-кэша (промежуточной памяти, где модель хранит контекст разговора), OOM на длинных контекстах, блокировку очереди внутри батча и расхождение метрик p50 и p99 (время отклика для «средних» и «самых медленных» запросов). Скрипты для воспроизведения собраны в отдельном репозитории, числа сняты со стенда VK Cloud.
Что понадобится
- GPU-сервер с картой A100 40 Гб или аналогичной (можно арендовать в VK Cloud или другом облаке)
- Установленный vLLM или TensorRT-LLM
- Модель для тестирования (в примерах используется Llama 2 13B)
- Python 3.10+ с библиотеками
csv,time - Репозиторий-харнес со скриптами из статьи VK Cloud
- Около 2 часов на воспроизведение основных сценариев
Память важнее вычислений: почему инференс LLM деградирует?
Продакшен-инференс упирается в память GPU сильнее, чем в вычислительные ядра. Причина в двух этапах работы модели.
Префилл (обработка промпта) нагружает вычислительные ядра. Декодирование (когда модель выдаёт токены по одному) постоянно читает и пишет память, и упирается именно в её пропускную способность.
По мере роста контекста основной поток обращений к памяти смещается с весов модели на KV-кэш. По данным интеграторов, которые приводит Погоржельский, KV-кэш в продакшене часто начинает превышать по объёму сами веса модели.
Конкретные цифры из статьи VK Cloud. Модель на 13 млрд параметров на A100 40 Гб занимает примерно 26 Гб под веса. Остаётся около 14 Гб на KV-кэш. При расходе порядка 1 Мб на токен (токен, минимальная единица текста для модели, примерно часть слова) это примерно 14 тысяч токенов на всю карту:
- При длине последовательности 512 токенов в батч помещается около 28 запросов
- При длине 2048 токенов помещается только 7 запросов
Для моделей на 70 млрд параметров масштаб проблемы ещё больше. У старых архитектур с multi-head attention KV-кэш для контекста 8K доходит до примерно 20 Гб на запрос, по данным introl.com. Но у моделей с grouped-query attention (Llama 3) 8 KV-голов вместо 64, и расход памяти падает примерно в 8 раз: около 2,6 Гб на запрос при 8K и около 10 Гб при 32K, по данным Symphony.
Пошаговая инструкция: как найти и устранить деградацию
1. Проверьте фрагментацию KV-кэша
Классическая реализация резервирует непрерывный кусок памяти под максимальную длину последовательности заранее. Запрос генерирует 100 токенов, а max_len выставлен в 2048, значит, около 1948 слотов простаивают. По замерам авторов vLLM на реальных нагрузках, существовавшие на тот момент системы теряли 60-80% памяти KV-кэша на фрагментацию и избыточное резервирование, по данным blog.vllm.ai.
2. Включите PagedAttention
PagedAttention выделяет память не одним куском, а блоками по требованию, по аналогии с виртуальной памятью в операционной системе. Логические позиции токенов сопоставляются физическим блокам через block table (таблицу соответствий). По данным SOSP 2023, потери на фрагментацию падают до менее 4%, а пропускная способность растёт в 2-4 раза при том же уровне задержки по сравнению с FasterTransformer и Orca. Против HuggingFace Transformers прирост доходит до 24-кратного, по данным blog.vllm.ai.
3. Отслеживайте занятость пула блоков во времени
PagedAttention смещает проблему, но не устраняет полностью. При постоянных аллокациях, вытеснениях и повторном использовании блоков фактическая доступная ёмкость под новые запросы начинает колебаться. В TensorRT-LLM KV-кэш организован иерархически: блок как единица аллокации, пул (primary на GPU, secondary с выгрузкой на CPU), менеджер состояний блоков.
Скрипт из репозитория-харнеса снимает занятость KV-кэша во времени:
# kv_usage_probe.py
from vllm import LLM
import time, csv
llm = LLM(
model="meta-llama/Llama-2-13b-hf",
gpu_memory_utilization=0.9
)
with open("kv_usage.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["ts", "gpu_cache_usage", "free_blocks"])
for _ in range(3600): # час наблюдения под нагрузкой
m = llm.llm_engine.stat_logger.stats
# далее запись gpu_cache_usage_sys, free_blocks
4. Настройте алерты на расхождение p50 и p99
Если p99 latency (время отклика для 1% самых медленных запросов) начинает расходиться с p50 (медианным временем), это сигнал приближающейся деградации. Погоржельский указывает: инференс LLM редко выходит из строя сразу; как правило, его работа постепенно ухудшается, оставаясь незаметной до достижения критического состояния.
5. Запустите скрипты на своём железе
Числа из статьи сняты со стенда VK Cloud. Чтобы получить актуальные пороги для ваших алертов, запустите скрипты из репозитория-харнеса на своей конфигурации. Универсальных чисел здесь нет: разница между архитектурами моделей может составлять порядок.
Погоржельский приводит такой пример: модель 13B на A100 40 Гб, при max_len=2048 и реальной средней генерации в 100 токенов, без PagedAttention теряет около 95% зарезервированной памяти KV-кэша впустую. После включения PagedAttention потери падают до менее 4%, а в батч при той же карте помещается кратно больше одновременных запросов. Но спустя несколько часов работы под нагрузкой с разнообразными длинами контекста занятость пула блоков начинает «плыть», и именно эту динамику нужно ловить скриптом мониторинга.
- Доверять демо-бенчмаркам. Пара запросов покажет отличный TTFT (time to first token, время до первого ответного символа). Реальная деградация проявляется через часы и дни под постоянной нагрузкой.
- Ставить фиксированный
max_len«с запасом». Каждый лишний слот, до которого запрос не доживает, это мёртвая память. Если архитектура позволяет, используйте PagedAttention или аналогичное динамическое выделение. - Смотреть только p50 (медиану). Медиана выглядит стабильной, пока p99 уже ползёт вверх. Расхождение p50 и p99 это ранний индикатор проблем с очередью или памятью.
- Считать, что PagedAttention решает всё. Внешняя фрагментация пулов блоков и механизм вытеснения со временем снижают реальную доступную ёмкость. Мониторинг занятости кэша во времени обязателен.
- Не пересчитывать под свою архитектуру. Разница между 64 KV-головами и 8 (как в Llama 3) это разница в 8 раз по расходу памяти. Числа из чужих бенчмарков не переносятся напрямую.
Что делать с этим прямо сейчас, по ролям
Инженеру, который разворачивает LLM в продакшене. Возьмите скрипт kv_usage_probe.py из харнеса VK Cloud и запустите на своём стенде под реальной или имитированной нагрузкой на час. Посмотрите, как ведёт себя занятость KV-кэша. Настройте алерт на расхождение p50 и p99.
Автору Дзена или маркетологу, который пользуется ИИ-сервисами. Если ваш чат-бот или генератор текста начинает «тупить» к вечеру или после нескольких дней работы, это может быть не «модель устала», а именно деградация инференса. Понимание механизма помогает грамотно сформулировать запрос к поставщику.
Предпринимателю в РФ. VK Cloud предоставляет GPU-инфраструктуру на территории России. Если вы строите LLM-сервис и выбираете между облачными провайдерами, скрипты из статьи позволяют объективно сравнить, как инференс LLM ведёт себя на разных платформах под нагрузкой, до того как вы заплатите за месяц аренды.
Я вижу, что большинство туториалов по запуску LLM заканчиваются на моменте «ура, модель ответила». Материал VK Cloud ценен тем, что начинается ровно там, где другие заканчиваются: что происходит через неделю. Скрипты воспроизводимые, числа привязаны к конкретному железу, пороги можно пересчитать. Это редкость.
Честная оговорка: статья описывает поведение конкретных движков (vLLM, TensorRT-LLM) на конкретном оборудовании. Если вы используете другой стек, механизмы деградации могут отличаться. Кроме того, числа в статье сняты со стенда VK Cloud, а не с вашего сервера, поэтому запуск скриптов локально обязателен, а не факультативен.
Разберитесь в архитектуре ИИ-сервисов
Если вы строите контент-стратегию на основе нейросетей, начните с понимания, как они работают под нагрузкой. В dzen.guru мы разбираем практические аспекты работы с ИИ для авторов и маркетологов.
Узнать большеМатериал Погоржельского фиксирует неочевидную вещь: инференс LLM ломается не громко, а тихо, по миллисекунде за час, по блоку памяти за запрос. Кто не мониторит, тот узнаёт последним, обычно от пользователя, который написал в поддержку «ваш бот опять завис».

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Открытые модели ИИ догоняют лидеров
Открытые модели ИИ набрали мощность, но не научились отказывать: китайская GLM-5.2 выполнила все опасные запросы, тогда как Claude не позволил завершить ни…

ИИ-агенты для локальной установки: LFM2.5 работает без GPU и выдаёт 113 токенов в секунду
Компания Liquid AI выпустила LFM2.5-2.6B, компактную открытую модель для запуска ИИ-агентов прямо на компьютере или смартфоне, и впервые показала скорость 113…

DeepSeek, ИИ, который «уничтожил» OpenAI и Nvidia, спровоцировал ответ: 120 компаний собрали альянс OSAA
Nvidia и 120+ компаний объединились в альянс по защите ИИ-агентов: что это за OSAA и как применить их инструменты уже сейчас Nvidia вместе со 120 с лишним…
Комментарии