Решения

TensorRT‑LLM: компиляция и FP8‑оптимизация

Задача страницы. Показать, как собрать движок TensorRT‑LLM под вашу LLM, включить FP8/BF16‑оптимизацию, добиться низкой p95‑латентности и посчитать стоимость.

TL;DR

  • Компиляция графа в TensorRT‑движок (per‑модель, per‑конфиг) даёт минимальную латентность и предсказуемость.
  • FP8 (Hopper) и BF16/FP16 (Ampere/Hopper) — ключ к высокой утилизации Tensor Cores при приемлемом качестве.
  • Тонкая настройка профилей (max seq len, max batch, beam width), KV‑кэш и tensor parallel критичны для p95.
  • Для строгого SLA держите жёсткие лимиты длины и раздельные пулы под короткие/длинные запросы.

Когда выбирать TensorRT‑LLM

  • Жёсткие требования по p95/p99‑латентности (онлайн‑чат, ассистенты в продуктах, интерактивный UX).
  • Статичная или предсказуемая матрица сценариев (модель(и) + фиксированный контекст), где компиляция окупается.
  • Наличие H100/A100/L40S и желание выжать максимум из Tensor Cores.

Альтернативы: для максимально высокой цены/производительности по токенам смотрите /solutions/llm-inference/vllm/; для универсального REST‑сервинга — /solutions/llm-inference/tgi/.

Архитектура запуска (в общих чертах)

  1. Чекпоинт модели (HF‑совместимый) →
  2. Сборка движка (builder): выбор точности, профилей (длины, батчи), плагинов;
  3. Сервер TensorRT‑LLM: HTTP/gRPC‑эндпоинты, управление KV‑кэшем, телеметрия;

Шлюз/балансировщик (по желанию): роутинг трафика, аутентификация, rate‑limits.

Быстрый старт: сборка и сервер

Сборка движка (пример)

				
					# 1) Подготовьте чекпоинт (весы и токенайзер) в ./ckpt
# 2) Соберите движок под вашу целевую длину контекста и точность
trtllm-build \
  --checkpoint-dir ./ckpt \
  --output-dir ./engines/llama3-8b-fp8 \
  --max-seq-len 8192 \
  --dtype bfloat16 \
  --fp8 \
  --gemm-plugin auto

				
			

Пояснения:

  • —max-seq-len — проектная длина контекста (вход+выход), от неё зависят память и ядра.
  • —dtype — базовая точность весов/активаций; bf16/fp16 на Ampere/Hopper.
  • —fp8 — включает режимы FP8 на H100 (веса/активации в FP8, аккумулирование в bf16/fp16).
  • —gemm-plugin auto — выбор высокопроизводительных GEMM‑плагинов под вашу платформу.

Запуск сервера

				
					trtllm-server \
  --engine-dir ./engines/llama3-8b-fp8 \
  --http-port 8000 \
  --grpc-port 50051 \
  --world-size 1

				
			

Если токенайзер хранится отдельно, передайте путь в параметрах сервера. Для нескольких GPU увеличьте —world-size и настройте tensor parallel (см. ниже).

Профили и формы запросов: как снимать «хвосты» p95

Профиль сборки задаёт рамки, в которых движок работает без деградаций: максимальные длины (max seq len), максимальный батч и опции декодирования (beam width и т.п.). Рекомендации:

  • Делайте раздельные движки на короткий и длинный контекст (например, 4K и 8–16K).
  • Если сценарии различаются по длинам — заведите два пула серверов и маршрутизируйте запросы по «коротким» и «длинным».
  • Фиксируйте жёсткие лимиты на max_tokens в API, чтобы не «блокировать» GPU длинными генерациями.
  • Для оффлайн‑пакетной генерации собирайте отдельный профиль с большим батчем.

FP8 и точность вычислений

  • H100 (Hopper): FP8 даёт максимум пропускной способности; аккумулирование обычно идёт в BF16/FP16. В интерфейсе сборки (см. выше) включайте —fp8.
  • Ampere (A100/L40S): используйте BF16/FP16.
  • Практика: после переключения формата обязательно сравните качество (перплексия/валид‑набор). Если видите деградацию — оставьте чувствительные узлы (например, выходные проекции) в BF16/FP16 при FP8‑основе.

KV‑кэш и память

KV‑кэш растёт линейно с длиной контекста и числом одновременных сессий.
Прикидка (упрощённо):

KV_bytes ≈ 2 × L_layers × (L_in + L_out_avg) × H_heads × d_head × bytes_per_elem

Как уменьшить:

  • Снизить max seq len, ограничить max_tokens на запрос.
  • Использовать более лёгкий dtype для KV (если доступен в вашей сборке).
  • Развести «длинные» и «короткие» запросы по разным пулам.
  • Держать общий системный префикс коротким и однотипным (prefill дешевле).

Tensor parallel и многогпу

  • Tensor parallel (TP) — делит веса слоя по нескольким GPU одного узла; уменьшает пиковую память на GPU и ускоряет крупные матрицы.
  • Рекомендации: размещайте TP внутри узла (NVLink), не смешивайте очень большие max seq len с высоким TP в одном движке без измерений.
  • Шеринг кэша: следите, чтобы KV‑память не стала новым узким местом при росте одновременности.

Настройка под цель: три профиля

A) Минимальная латентность (строгий SLA)

  • Раздельные движки 4K/8K.
  • Низкие лимиты max_tokens в API.
  • BF16/FP8 (на H100), небольшой TP (1–2), несколько реплик.
  • Стриминг токенов включён, короткие ответы — отдельный pool приоритета.

B) Сбалансированный

  • Один движок 8K, BF16/FP16.
  • Ограничение max_tokens, средний TP, 1–2 реплики.
  • Параллельные очереди: «короткие» получают приоритет.

C) Максимальный throughput (офлайн/батч)

  • Отдельный движок с увеличенным max batch, BF16/FP16.
  • Нет стриминга, бачинговый планировщик.
  • Отдельный пул GPU, чтобы не влиять на онлайн‑SLA.

Стоимость и расчёты

Обозначим: TPS_decode — токены/с на декоде (на весь батч), B — фактический батч на декоде, T — латентность запроса.

QPS (приближённо): QPS ≈ B / T
Tokens/hour: TPS_decode × 3600
Цена за 1M токенов:

Cost_per_1M ≈ (GPU_hour_price × Num_GPU) / (Tokens_per_hour / 1e6)

Для планирования снимите реальные prefill_rate и TPS_decode на вашей модели и целях длины, затем отмасштабируйте под пул и p95‑запас.

См. также: /solutions/llm-inference/costs/, /solutions/cost-planner/.

Наблюдаемость и эксплуатация

Минимум метрик:

  • Latency p50/p95/p99, timeouts, errors.
  • Throughput: tokens/sec на decode/prefill, занятость GPU.
  • Память: использование HBM, размер и hit‑rate KV‑кэша.
  • Система: CPU (токенизация), сеть (стриминг/ответы), диск (логи).

Подробнее: /solutions/llm-inference/observability/, /solutions/monitoring-logging/.

Траблшутинг

  • Высокая p95 после сборки. Проверьте соответствие реальных запросов профилю (seq len, batch), уменьшите max_tokens, вынесите длинные запросы в отдельный пул/движок.
  • GPU‑OOM. Снизьте max seq len, уменьшите gpu memory utilization сервера, используйте TP, пересоберите движок под более короткие формы или лёгкий dtype KV.
  • Нестабильная скорость decode. Ограничьте смешение сильно разных длин в одном батче; проверьте CPU‑узкие места (токенизация/JSON).
  • Деградация качества на FP8. Оставьте чувствительные узлы в BF16/FP16; проверьте валидацию (перплексия/оценки) перед переключением трафика.
  • Долгая «холодная» загрузка. Храните движки на локальном NVMe, используйте прогрев (warm‑up) при деплое.

Как запускать это в cloudcompute.ru

Чек‑лист перед продом

  • Зафиксированы SLA (p95, TPS/QPS) и лимиты max_tokens.
  • Собраны движки под целевые длины (4K/8K/…); проверены на синтетике и тест‑трафике.
  • Выбрана точность: BF16/FP16 (Ampere/Hopper) или FP8 (H100) с проверкой качества.
  • Настроены пулы (короткие/длинные), TP и количество реплик.
  • Включены метрики/трейсы, алерты на латентность/ошибки/память.
  • Описан фоллбек‑план (второй движок/модель, ограничения длины, деградация параметров).

Навигация по разделу «Инференс LLM»