Инференс-рантайм
Как думать про production-инференс для LLM, STT, embeddings и rerankers.
Проблема
Запустить модель - не то же самое, что построить инференс как возможность платформы.
Симптомы
- Пропускная способность хорошая в бенчмарке, но TTFT плохой в продукте.
- Загрузка GPU высокая, но стоимость успешной задачи хуже, чем на MaaS.
- Новые модели запускаются копированием флагов из истории чата.
Ментальная модель
Инференс-рантайм - это связка модели, железа, планировщика, batching, памяти, кеша, маршрутизации и формы нагрузки.
Архитектура
Слой рантайма включает OpenAI-compatible API, воркеры моделей, batching, KV-cache, prefix cache, квантование, speculative decoding, multi-GPU запуск, autoscaling, планирование мощности и не только LLM: STT, embeddings, rerankers.
Метрики
Отслеживай TTFT, TPOT, общую задержку, токены в секунду, время в очереди, размер batch, долю попаданий в кеш, память GPU, загрузку, ошибки, cold start и стоимость принятого результата.
Мощность - это не сумма GPU
Кластер может выглядеть достаточным по пропускной способности, но проваливаться по p99, если разные профили запросов живут в одном пуле.
fast
Быстрый чат
Стабильный TTFT и короткий контекст.
long
Длинный контекст
Отдельный prefill, память KV-cache и контроль качества.
batch
Пакетная обработка
Очередь, backlog и стоимость важнее интерактивности.
critical
TTFT-critical
Выделенный пул, лимиты очереди и свой SLO.
Общий пул часто оптимизирует среднюю загрузку, но ломает p99 и TTFT для сценариев, где первая задержка критична.
Выделенный пул дороже в инфраструктуре, но дешевле, чем лечить p99 общими настройками, которые конфликтуют с другими профилями нагрузки.
Context window - не рабочий контекст
Заявленный max context отвечает только на вопрос "сколько токенов модель может принять". В production важнее другое: сколько контекста влезает на выбранном железе, сколько prefill latency это создаёт и сохраняется ли качество на длинном окне.
1M токенов в спецификации не означает 1M полезного контекста в сценарии. Для длинных окон нужен отдельный eval: качество по длинам, задержка prefill, память под KV-cache и стоимость принятого результата. См. публичный разбор: Почему миллион токенов не решает проблему контекста.
Компромиссы
Более высокая пропускная способность может увеличить задержку. Квантование снижает потребление памяти и стоимость, но может ухудшить качество. Больший контекст уменьшает обрезание, но увеличивает prefill и давление на кеш.
Анти-паттерны
- Считать флаги vLLM фольклором вместо версионированных рецептов.
- Выбирать железо по спорам о брендах, а не по профилю нагрузки.
- Запускать LLM и игнорировать embeddings, STT и rerankers как полноценные платформенные компоненты.
Чеклист
- ✓Каждый рецепт запуска версионирован и воспроизводим.
- ✓Запуск модели включает железо, флаги, ожидаемую пропускную способность и задержку.
- ✓Планирование мощности использует реальную форму трафика сценария.
- ✓Бюджет кеша рассчитан на рабочий набор, а не только на максимальный контекст.
- ✓Есть отдельные профили для short-context, long-context и agentic workload.
- ✓Latency-critical сценарии не смешиваются с batch-heavy и long-context нагрузкой без явного решения.
- ✓Максимальный context window не используется как дефолтный путь.
- ✓Планирование мощности учитывает prefill, KV-cache и ожидаемое повторное использование префикса.
- ✓Выкатка имеет резервный маршрут и сравнение качества с предыдущим алиасом.
Пример
Рецепт vLLM должен фиксировать модель, tensor parallelism, максимальный контекст, лимиты batching, флаги парсера инструментов, ожидаемую VRAM и заметки про пропускную способность против задержки, чтобы следующий запуск не собирался по памяти.
Шаблон решения
Запиши модель, железо, рантайм, флаги запуска, нагрузку, SLO по задержке, контроль качества, поведение кеша, границы мощности и путь отката.