Решения

Text Generation Inference (TGI): пулы моделей и шедулинг

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

TL;DR

  • TGI — универсальный REST‑сервинг LLM с динамическим батчингом и стримингом токенов.
  • Для строгости SLA настраивайте: лимиты контекста, макс. токены, очереди коротких/длинных запросов.
  • Пулы моделей (несколько TGI‑инстансов) позволяют разделять трафик по задачам, доменам и длинам; добавляйте горячие/тёплые модели и автомасштабирование.
  • Снижайте стоимость через квантизацию, батчинг, prefix‑кэш в стеке и грамотный KV‑кэш.

Когда выбирать TGI

  • Нужен стабильный REST‑API и готовые фичи операционного уровня: очереди, токен‑стриминг, профили производительности.
  • Один формат запуска для разных моделей (HF‑совместимые веса, шардирование, FP16/BF16/INT8/INT4).
  • Мульти‑модельная среда: несколько сервисов под разными моделями + внешний роутер/гейтвей.

Альтернативы и сравнение:
— максимум TPS/минимальная цена за 1М токенов: /solutions/llm-inference/vllm/
— минимальная p95‑латентность на H100: /solutions/llm-inference/tensorrt-llm/
— лёгкий стек/тонкие инстансы: /solutions/llm-inference/llama-cpp/

Архитектура: из чего состоит развёртывание

  1. Инициализация модели (веса + токенайзер).
  2. TGI‑процессы: планировщик/очередь, воркеры шардов, стриминг эндпоинтов.
  3. Гейтвей (NGINX/ingress/маршрутизатор) — разруливает пулы моделей и приоритеты.
  4. Мониторинг/логи — метрики latency/TPS, кэш, ошибки.

Быстрый старт (один узел)

Запуск сервера (одна модель, 1‑N шардов)

				
					text-generation-launcher \
  --model ./ckpt \
  --num-shard 1 \
  --max-input-length 8192 \
  --max-total-tokens 12288 \
  --port 8080

				
			

Пояснения по ключам

  • —num-shard — шардирование весов по нескольким GPU узла.
  • —max-input-length — предел суммы токенов во входе (prefill).
  • —max-total-tokens — предел на вход+выход, защищает от «длинных» генераций.
  • —port — HTTP‑порт сервера.

Запрос без стрима

				
					curl -s http://localhost:8080/generate \
  -X POST -H "Content-Type: application/json" \
  -d '{
    "inputs": "Объясни внимание в трансформерах простыми словами.",
    "parameters": {"max_new_tokens": 200, "temperature": 0.2, "top_p": 0.9}
  }'

				
			

Стриминг токенов (SSE)

				
					curl -N http://localhost:8080/generate_stream \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": "Сделай краткое резюме принципа внимания.",
    "parameters": {"max_new_tokens": 150, "temperature": 0.3}
  }'

				
			

Динамический батчинг и шедулинг

Как работает. Планировщик TGI формирует батчи запросов с учётом доступных GPU, ограничений длины и активных генераций. Это повышает утилизацию и снижает стоимость.

Практические настройки

  • Ограничивайте длины (—max-input-length, —max-total-tokens) — это главный рычаг p95.
  • Профили по длинам: разделите трафик на короткие и длинные очереди (см. пулы ниже).
  • Параметры генерации держите умеренными по умолчанию: max_new_tokens, temperature, top_p, repetition_penalty.
  • Стриминг включайте для пользовательских UI — он «ломает тишину» и сглаживает p99.

Пулы моделей: шаблон эксплуатации

Идея. Несколько TGI‑сервисов → единый гейтвей маршрутизирует запросы по модели, длине, приоритету или тенанту.

Организация пулов

  • По длине:
    Short‑pool (строгий SLA): max_total_tokens небольшое, агрессивный батчинг.
    Long‑pool (анализ/код): большие лимиты, отдельные GPU.
  • По доменам: «общая модель», «RU‑дообученная», «кодовая».
  • По средам: prod (только стабильные веса) и staging (экспериментальные).
				
					if model=="llama3-8b-ru" and estimated_total_tokens<=4096 -> short-pool
elif model=="llama3-8b-ru" -> long-pool
elif model=="code-7b" -> code-pool
else -> default-pool

				
			

Горячие/тёплые модели

  • Hot — загружены в VRAM постоянно (нулевая холодная задержка).
  • Warm — на диске/NVMe, поднимаются по сигналу спроса.
  • Cold — только в реестре, требуют времени на загрузку.

Шардирование и многогпу

  • —num-shard N делит веса между N GPU на одном узле (TP внутри узла).
  • Для нескольких узлов используйте слой оркестрации (несколько инстансов TGI за балансировщиком).
  • Планируйте KV‑кэш (ниже) — он быстро «съедает» HBM при больших очередях.

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

Прикидка памяти на KV‑кэш (упрощённо):

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

Как держать под контролем

  • Лимиты длины (вход/выход) и строгая политика max_total_tokens.
  • Изоляция длинных запросов в отдельный пул.
  • Квантизация и более лёгкий dtype для KV (если поддерживается сборкой).
  • Prefix‑кэш на уровне стека (общие системные подсказки).

Квантизация и адаптеры

  • INT8/INT4 и пост‑тренировочная квантизация снижают стоимость за 1М токенов и повышают плотность батча.
  • LoRA‑адаптеры: удобно держать несколько отраслевых адаптеров над одной базовой моделью; переключение — без полного рестарта пула.

Подробнее про экономию: /solutions/llm-inference/quantization/, /solutions/llm-inference/costs/.

SLA, производительность и стоимость

Обозначим: L_in — входные токены, L_out — выход, P — prefill ток/с, D — decode ток/с (на батч), B — фактический батч.

Латентность (приближённо):

T ≈ (L_in / P) + (L_out / (D / B)) + overhead

QPS:

QPS ≈ B / T

Цена за 1M токенов:

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

Tokens_per_hour ≈ TPS_decode × 3600
Рекомендация: измерьте P и D на пилоте, затем подберите лимиты контекста и размеры пулов до выполнения SLA.

Наблюдаемость и алерты

Минимальный набор:

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

См. /solutions/llm-inference/observability/ и /solutions/monitoring-logging/.

Типовые профили конфигураций

A) Short‑pool (строгий SLA)

  • -max-input-length 2048, —max-total-tokens 4096
  • Стриминг включён, небольшой num-shard, 2–4 реплики.
  • Приоритетная очередь, агрессивный батчинг.

B) Balanced‑pool

  • —max-input-length 4096, —max-total-tokens 8192
  • Квантизация INT8/INT4 для лучшей цены за 1М, 1–2 реплики.

C) Long‑pool

  • —max-input-length 8192+, —max-total-tokens 12000+
  • Отдельные GPU/узлы, более мягкие SLO, меньшая конкуренция.

Траблшутинг

  • Высокая p95. Ужесточите max_total_tokens, разделите трафик на short/long, увеличьте число реплик short‑pool.
  • GPU‑OOM. Снизьте лимиты длины, уменьшите одновременность, примените INT8/INT4, увеличьте num-shard.
  • Низкий TPS. Увеличьте размер батча/одновременность, проверьте CPU‑узкие места (токенизация), укоротите префиксы.
  • Длинные «холодные» старты. Держите ключевые модели горячими, используйте локальный NVMe‑кэш весов.
  • Скачки латентности. Проверьте contention по сети/диску, выведите long‑запросы в отдельный пул.

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

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

  • Зафиксирован SLA (p95, QPS/TPS) и лимиты max_total_tokens.
  • Спроектированы пулы (short/balanced/long), настроен гейтвей.
  • Проверены пилотные метрики P/D, рассчитана цена за 1М токенов.
  • Включены стриминг и алерты; есть дашборды latency/TPS/KV.
  • Продуман фоллбек: запасная модель/ограничение длины при перегрузе.