Развернул Gemma 4 31B на одной 4090 48GB — и проверил, нужен ли Q8
В прошлой статье я собрал бенчмарк под свою работу, и в практике победила Gemma 4 31B — мгновенный отклик, дёшево, почти как у 744-миллиардного гиганта. Логичный следующий шаг: поднять её у себя в контуре и ответить на два вопроса, которые все задают и никто не меряет.
→ Нужен ли «честный» Q8, или хватает 4-бит? → Переживает ли нормально tool-calling квантизацию?
Спойлер: Q8 не дал ничего, а tool-calling держится — но не из-за кванта. Дальше — как разворачивал, на чём споткнулся, и цифры.
Железо и стек
Одна RTX 4090 на 48 ГБ (спот), llama.cpp, GGUF от Unsloth. Никакого vLLM/SGLang: для одного пользователя на одной карте llama.cpp сейчас — король, а их continuous batching и RadixAttention выстреливают только под конкурентной нагрузкой, которой у меня нет.
Грабли при развёртывании, без них никуда:
→ -hf не качает. Сборка llama.cpp на споте была без SSL — встроенный загрузчик с HuggingFace падает на HTTPS is not supported. Пересобирать ради одного флага глупо: скачал GGUF обычным curl и указал --model на локальный файл. → systemd вместо nohup. Спот + флакающая сеть = nohup & не переживал обрыв SSH. systemd-run --unit=gemma4 --collect отвязывает процесс полностью — сервер живёт независимо от моей сессии. → Флаг сменил синтаксис. В свежем llama.cpp --flash-attn теперь требует значение: --flash-attn on, а не голый флаг.
Квант: Q4-dynamic vs Q8
Ключевая деталь — это не наивный Q4. Unsloth Dynamic 4-bit (UD-Q4_K_XL) держит чувствительные слои в большей точности, а 4-бит уходит только туда, где это безопасно; по их KL-дивергенции это near-lossless. Прогнал обе квантизации на тех же 50 задачах, тем же 3-судейным ансамблем:
Q4-dynamic | Q8 | |
|---|---|---|
Балл | 0.735 | 0.742 |
Прошло задач | 45/50 | 42/50 |
Tool-calling | 1.00 | 1.00 |
tok/s | 39.8 | 25.4 |
VRAM | 27 ГБ | 40 ГБ |
Q8 дал +0.007 — это шум. За него: в 1.6 раза медленнее, +13 ГБ видеопамяти (меньше места под контекст), и при этом Q4 прошёл задач даже больше. Прирост Q8 — микроскопический и только на доках/стратегии (+0.02–0.03). Все объективные задачи (код, SQL, инфра, tool-calling) — идентичны.
Вывод: на 48 ГБ можно влепить Q8 — но не нужно. Dynamic-4bit = та же точность, вдвое меньше памяти, полный контекст, быстрее. «Честный Q8» здесь — самообман.
Tool-calling: дело было не в кванте
Главный рычаг надёжности tool-calling оказался не в квантизации, а в одном флаге сервера: --jinja. Он включает родной chat-template модели, который и форматирует, и парсит вызовы инструментов. Без него tool-calling ломается хоть на Q4, хоть на Q8. С ним — 1.00 на обеих квантизациях.
То есть «4-бит ломает инструменты» — миф для наивного Q4 без правильного шаблона. Dynamic-4bit + --jinja держит вызовы идеально.
Неожиданный бонус: локально — надёжнее, не только дешевле
Тот же бенчмарк через облачный API на 50 задачах развалился: 33% вызовов упали с APIConnectionError — прокси не пережил длинный прогон. Локальные прогоны — ноль ошибок. Причина простая: при self-host кандидат отвечает напрямую, через прокси идут только судьи, то есть вдвое меньше точек отказа.
Суверенный деплой выигрывает не только в цене и задержке. Он выигрывает в воспроизводимости — а для бенчмарка это и есть всё.
Что в итоге запускать
→ Gemma 4 31B, Dynamic-4bit, llama.cpp + --jinja, на одной 48 ГБ карте. Мгновенный отклик (TTFT 0.39 с — быстрее облака), полностью в контуре, ноль внешних вызовов в рантайме. Это рабочая лошадь под ежедневный поток. → GLM-5.2 (744B) остаётся короной качества для самых тяжёлых решений — но это «отправь и жди» на чужих картах.
«Лучшая модель под мою работу» оказалась моделью, которую я держу на одной карте у себя — и которая на 4-битах отвечает не хуже, чем на 8.





















