Решения

llama.cpp: INT4/INT8 и компактный сервинг LLM

Задача страницы. Показать, как запускать модели в формате GGUF через llama.cpp на тонких инстансах: квантизация INT4/INT8, гибридный режим CPU↔GPU, настройка контекста, стриминг и базовые профили производительности/стоимости.

TL;DR

  • GGUF + INT4/INT8 сильно сокращают память модели и стоимость запуска; хороший выбор для edge/тонких серверов и внутренних инструментов.
  • Гибридный режим: часть слоёв на GPU (-ngl), остальное на CPU — компромисс между p95‑латентностью и ценой.
  • Для чатов включайте стриминг и ограничивайте длину ответа/контекста; для массовых задач — используйте оффлайн‑скрипты main, для API — server.

Когда выбирать llama.cpp

  • Нужен лёгкий сервинг на недорогих инстансах (CPU‑only или 1 тонкий GPU).
  • Требуется максимальная экономия памяти за счёт INT4/INT8 и сжатых форматов весов (GGUF).
  • Важны простота деплоя (один бинарник) и низкие зависимые расходы (без тяжёлых фреймворков).

Альтернативы:
— максимум TPS при больших очередях → /solutions/llm-inference/vllm/
— минимальная p95‑латентность на H100 → /solutions/llm-inference/tensorrt-llm/
— универсальный REST‑сервинг с пулами моделей → /solutions/llm-inference/tgi/

Подготовка весов: HF → GGUF → квантизация

A) Конвертация HF‑весов в GGUF

				
					# Пример: путь к HF-весам в ./hf_model, выходной GGUF в f16
python3 convert-hf-to-gguf.py ./hf_model --outfile ./llama3-8b-f16.gguf

				
			

B) Квантизация GGUF

				
					# Сбалансированный профиль качества/памяти (Q4_K_M)
./quantize ./llama3-8b-f16.gguf ./llama3-8b-q4_k_m.gguf Q4_K_M

# Более высокое качество (Q5_K_M), ценой памяти/скорости
./quantize ./llama3-8b-f16.gguf ./llama3-8b-q5_k_m.gguf Q5_K_M

# Минимальный размер (например, Q2_K) — для самых тонких машин
./quantize ./llama3-8b-f16.gguf ./llama3-8b-q2_k.gguf     Q2_K

				
			

Практический ориентир по объёму (порядок величин):
• 7–8B в Q4_K_M ≈ 4–5 ГБ; Q5_K_M ≈ 6–7 ГБ.
• 13B в Q4_K_M ≈ 8–10 ГБ. Точные значения зависят от модели/словаря.

Запуск сервера (HTTP, стриминг)

Старт сервера

				
					./server \
  -m ./llama3-8b-q4_k_m.gguf \
  -c 4096 \
  -t 12 \
  -ngl 20 \
  --host 0.0.0.0 \
  --port 8081 \
  --timeout 120
# Опции по ситуации: --no-mmap, --mlock

				
			
  • -c — длина контекста (вход + выход);
  • -t — число потоков CPU;
  • -ngl — сколько слоёв выгрузить на GPU (0 = чистый CPU); повышайте до упора по VRAM;
  • —timeout — общий тайм‑аут запроса.

Пример запроса (OpenAI‑совместимый, стриминг SSE)

				
					curl -N http://localhost:8081/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3-8b-q4_k_m",
    "messages": [
      {"role":"system","content":"You are concise."},
      {"role":"user","content":"Объясни внимание в трансформерах за 3 пункта."}
    ],
    "stream": true,
    "max_tokens": 200,
    "temperature": 0.2
  }'

				
			

Профили эксплуатации (выберите под SLA/бюджет)

A) CPU‑only (минимальная стоимость)

  • Квантизация: Q4_K_M или Q2_K для совсем ограниченной памяти.
  • Команда: -ngl 0, -t = ядра CPU (подбирайте эмпирически).
  • Сценарии: оффлайн‑генерации, внутренние инструменты, RAG‑ретривер с небольшими ответами.

B) Гибрид CPU↔GPU (тонкий GPU)

  • Цель: снизить p95 за счёт переноса части слоёв на GPU.
  • Команда: -ngl 10–32 (в зависимости от VRAM), оставить разумное -t для CPU.
  • Сценарии: чат‑сервисы/ассистенты с умеренной нагрузкой.

C) GPU‑перевес (минимум CPU‑offload)

  • -ngl максимально возможный (влезает в VRAM); уменьшите -t до уровня токенизации/оркестрации.
  • Сценарии: строгие задержки при умеренном QPS на одном узле.

Контекст, KV‑кэш и лимиты

Память под KV‑кэш растёт ~линейно с длиной контекста и числом одновременных запросов. Практика:

  • Держите умеренный -c (например, 2–4 K), ограничивайте max_tokens на запрос.
  • Разделяйте трафик на короткие и длинные запросы (две реплики/пула).
  • Для чат‑сценариев используйте стриминг — пользователь видит ответ раньше даже при ограниченном TPS.

Подробнее про стриминг/пулы:
/solutions/llm-inference/streaming/, /solutions/llm-inference/multi-model/

Качество vs скорость: какие кванты выбрать

  • Q4_K_M — «золотая середина» для RU/EN‑чатов и многих задач.
  • Q5_K_M / Q6_K — лучше качество, выше задержки и память.
  • Q2_K / Q3_K — самый низкий след памяти для edge/CPU‑only, может страдать точность на сложных задачах.
  • INT8 (Q8_0) — близко к FP16 по качеству, но требует больше памяти; разумно для небольших моделей на мощных CPU/GPU.

Стоимость и планирование

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

Оценки:

				
					QPS ≈ B / T
Tokens_per_hour ≈ TPS_decode × 3600
Cost_per_1M_tokens ≈ (GPU_or_CPU_hour_price × Num_nodes) / (Tokens_per_hour / 1e6)

				
			

Снижаем цену за 1М токенов: квантизация «ниже», ограничение max_tokens, гибридный режим -ngl, стриминг, несколько лёгких реплик вместо одной «тяжёлой».

Дополнительно: /solutions/llm-inference/costs/, /solutions/cost-planner/

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

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

  • Latency p50/p95/p99, tokens/sec, доля timeouts.
  • CPU/GPU: загрузка, частота, температура, использование HBM/DRAM.
  • Кэш/контекст: текущий -c, одновременность, «хвосты» по длинным запросам.
  • Система: дисковые I/O (логи/веса), сеть (стрим).

Смотрите: /solutions/monitoring-logging/, /solutions/llm-inference/observability/

Траблшутинг

  • Высокая p95 на CPU‑only. Уменьшите -c и max_tokens, переходите на Q4_K_M (если было Q5/FP16), поднимите -ngl на тонком GPU.
  • GPU‑OOM при -ngl. Понизьте число слоёв на GPU, выберите более «лёгкий» квант (Q4_K_M → Q4_K_S), сократите контекст.
  • Низкий TPS. Проверьте конкуренцию CPU‑потоков, уменьшите температуру/стохастику для детерминированных задач, используйте несколько реплик за балансировщиком.
  • Нестабильный запуск/краши. Отключите —mlock/—no-mmap, проверьте права и лимиты ОС, храните GGUF на локальном NVMe.
  • Качество «плывёт» после квантизации. Поднимите уровень кванта (Q4→Q5/Q6) или ограничьте длины/сложность задач, держите промпт‑шаблоны стабильными.

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

  • Шаблон “llama.cpp‑Serve” в /solutions/templates/:
    – профили cpu‑only / hybrid / gpu‑first;
    – готовые скрипты конвертации в GGUF и квантизации;
    – сервис server с healthcheck и логами запросов.
  • Для сценариев с несколькими моделями или пиками трафика — смотрите /solutions/llm-inference/multi-model/.
  • Для расчёта стоимости и SLA — /solutions/llm-inference/costs/, /solutions/cost-planner/.

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

  • Весы в GGUF, протестированы уровни квантизации (качество/латентность).
  • Выбран профиль: cpu‑only / hybrid / gpu‑first, настроены -t, -ngl, -c.
  • В API ограничены max_tokens, включён стриминг.
  • Настроены метрики/логи/алерты; проверены «хвосты» p95/p99.
  • Продуман фоллбек: вторая реплика/модель, снижение контекста/кванта при перегрузе.

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