Головна / Статті / Qwen3.8-27B на одній RTX 3090: контекст 262K і 65–80 токенів за секунду

Qwen3.8-27B на одній RTX 3090: контекст 262K і 65–80 токенів за секунду

Рецепт запуску щільної 27B-моделі з повним контекстом на одній відеокарті з 24 ГБ: доопрацьований форк llama.cpp, квант на 14,5 ГБ, кеш Turbo3 і чернетки MTP.

1871 слів

Щільна модель на 27 мільярдів параметрів, повне вікно контексту в 262K, одна вже не нова споживча відеокарта і швидкість генерації, за якої здається, що розмовляєш з людиною. Ще нещодавно це звучало як рекламне гасло. З Qwen3.8-27B і спеціальною збіркою llama.cpp це тепер відтворювана конфігурація на одній RTX 3090.

Трохи контексту, чому це важливо. Qwen3.8-27B — сильна модель на щодень, помітно краща за попереднє покоління Qwen3.6. Але запускати її у добрій якості досі було дорого. Версія Q8, майже без втрат, потребує близько 28 ГБ відеопам'яті, тож жодна споживча карта її не вміщує. У багатьох домашніх збірках ставили дві RTX 3090 лише заради однієї такої моделі. Рецепт нижче дає змогу обійтися значно легшою конфігурацією на звичайній карті з 24 ГБ, що вийшла 2020 року.

Спершу цифри

Заміри на різних машинах, по одній моделі й одній відеокарті на кожній:

| GPU            | Decode Speed    | Prompt Prefill   |
|----------------|-----------------|------------------|
| RTX 3090       | 65–80 tok/s     | 1,000–1,300 t/s  |
| RTX 3090 Ti    | 70–100 tok/s    | 1,200–1,700 t/s  |
| RTX 5090       | 150–180 tok/s   | 3,000–4,000 t/s  |

Погляньте ще раз на перший рядок: від 65 до 80 токенів за секунду на одній RTX 3090. Це швидше, ніж читає більшість людей, і значно вище за приблизно 30 ток/с, з яких чат починає відчуватися природним. І все це на карті, яку NVIDIA випустила 2020 року, з щільною 27B-моделлю на повному контексті. 3090 Ti видає близько 100, а 5090 — від 150 до 180, що кілька років тому зійшло б за продуктивність дата-центру.

Це набагато більше, ніж давали попередні локальні конфігурації. То що ж змінилося?

Три кроки, щоб повторити

Крок 1: зібрати спеціальний форк llama.cpp

Форк llama.cpp під назвою llamAmpere розрахований на GPU Ampere і новіші та агресивно їх оптимізує:

git clone -b main https://github.com/JakeATX/llamAmpere.git
cd llamAmpere
cmake -S . -B build-sm86 -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA=ON \
      -DCMAKE_CUDA_ARCHITECTURES=86 -DGGML_NATIVE=ON
cmake --build build-sm86 -j8 --target llama-server

86 тут — код архітектури CUDA для карт серії RTX 30. Для новішого покоління його треба замінити: в Ada (серія 40) це 89, у Blackwell (серія 50) — 120. Сам форк працює на всіх них, відрізняється лише цей прапорець компіляції.

Крок 2: завантажити особливу квантовану модель

Швидкість значною мірою тримається на спеціально зробленій квантизації ATX-4-XS. Її опубліковано на Hugging Face як jakeatx/Qwen3.8-27B-ATX-IQ4_XS-M-GGUF, важить вона 14,5 ГБ. Завантажити її можна двома способами. Через Hugging Face CLI:

huggingface-cli download jakeatx/Qwen3.8-27B-ATX-IQ4_XS-M-GGUF \
    --local-dir ~/models/qwen38-27b-atx

Або звичайним wget у будь-яку теку:

mkdir -p ~/models/qwen38-27b-atx
wget -O ~/models/qwen38-27b-atx/Qwen3.8-ATX-4-XS.gguf \
  "https://huggingface.co/jakeatx/Qwen3.8-27B-ATX-IQ4_XS-M-GGUF/resolve/main/Qwen3.8-ATX-4-XS.gguf"

Змініть шляхи, якщо моделі у вас лежать деінде, наприклад на окремому диску.

Крок 3: запустити сервер

Запустіть такою командою, підставивши свої каталоги:

CUDA_VISIBLE_DEVICES=0 GGML_Q8_TURBO3_MMA_FUSED=1 \
/home/andrewzhu/storage_1t_1/github_repos/llamAmpere/build-sm86/bin/llama-server \
    -m /mnt/data_2t_3/ai_models_all/Qwen3.8-27B-ATX-IQ4_XS-M-GGUF/Qwen3.8-ATX-4-XS.gguf \
    --alias Qwen3.8-27B-GGUF \
    -c 262144 -b 4096 -ub 1024 -t 8 -tb 8 -ngl 99 -fa on -ctk q8_0 -ctv turbo3 \
    --parallel 1 --jinja --fit off \
    --cache-prompt --cache-ram 8192 --ctx-checkpoints 24 --checkpoint-min-step 10240 \
    --spec-type draft-mtp --spec-draft-n-max 3 --spec-draft-p-min 0 \
    --spec-draft-type-k q8_0 --spec-draft-type-v q8_0 \
    --host 0.0.0.0 --port 8082 \
    --spec-draft-vocab-map docs/mtp-vocab/atx_65536.txt

Дві деталі, якщо їх пропустити, коштують швидкості. Перша — змінна середовища GGML_Q8_TURBO3_MMA_FUSED=1: у нотатках самого форку сказано, що вона дає 13% і що про неї всі забувають. Друга — файл vocab-map наприкінці. Шлях docs/mtp-vocab/atx_65536.txt лежить усередині репозиторію форку, який ви вже склонували.

Чому це працює

Тут складаються чотири окремі ідеї. Жодна з них не магія, а разом вони показують ретельну інженерну роботу.

1. Збірка, переписана під одне сімейство чипів

Звичайний llama.cpp пише CUDA-ядра так, щоб вони коректно працювали на багатьох поколіннях GPU. Цей форк іде протилежним шляхом: переписує гарячі ділянки під одну архітектуру й доводить їх, доки вичавлювати більше нічого.

Два приклади. Qwen3.8-27B — не чистий трансформер: у 48 її шарах замість уваги зберігається рекурентний стан Gated DeltaNet. Форк переробив ці ядра так, що кожен warp GPU обробляє чотири стовпці стану, а не один, і конвеєр заліза завантажений щільніше. Це дало приблизно 5–6% і на prefill, і на decode.

Решта 16 шарів займаються справжньою увагою. Їхні ключі зберігаються стиснутими, і попередній шлях розпакування використовував лише близько 10% пропускної здатності пам'яті — наче пити крізь тоненьку соломинку. Переписаний код підвантажує дані асинхронним копіюванням і виправляє порядок читання, тож декодування на довгому контексті пришвидшується до 11%.

Не менш важливими були й менш ефектні виправлення. Дві правки виділення пам'яті звільнили 2,8 ГБ відеопам'яті: один буфер виділявся двічі, а спекулятивний драфтер резервував власні обчислювальні буфери, хоча міг ділити їх з основною моделлю. Саме ці 2,8 ГБ вирішують, чи вміститься контекст 262K на карту.

2. Квантизація, що розумно витрачає біти

Схема квантизації визначає, скільки бітів отримує кожна вага. Наївна схема дає всім тензорам однаковий бюджет, скажімо 4 біти. Але тензори по-різному страждають від округлення.

Рецепт ATX-4-XS з'явився із замірів того, які ролі тензорів справді псуються під час стиснення, наприклад проєкції уваги й вихідні голови. За основу взято формат IQ4_XS, а окремі ролі підвищено до Q5_0, Q6_K або Q8_0. У підсумку маємо файл на 14,5 ГБ — менший за стандартну збірку Q4_K_M тієї ж моделі. На кожному проході він читає з пам'яті менше байтів, а якість для щоденної роботи лишається близькою до повної.

Менше означає швидше, бо генерація по одному токену впирається в пропускну здатність пам'яті: для кожного токена ваги треба один раз прочитати з відеопам'яті. Менше байтів на токен — більше токенів за секунду. Щоб це не вдарило по якості, знадобилися ретельні заміри того, які біти залишити.

3. Turbo3: компактна короткочасна пам'ять

Під час генерації модель тримає KV-кеш — запис усього, що вона прочитала й написала, щоб кожен новий токен міг озирнутися назад. На 262K токенів цей кеш величезний. У стандартних форматах він з'їв би більшу частину відеопам'яті ще до завантаження ваг.

Цей стек, успадкований від лінії робіт TurboQuant+, зберігає ключі уваги в q8_0 (майже без втрат), а значення — поверненими та стиснутими приблизно до 3 бітів. Звідси й назва Turbo3. Асиметрія навмисна: ключі працюють як адреси, і помилка в них розкладає все не по тих поличках, а значення — це вміст, який витримує скорочений запис.

Чесне застереження: це не точність Q8 на всьому шляху. Для коду, текстів і щоденної роботи з агентами жодної стелі якості не помітно, але якщо вашому завданню потрібне побітово точне відтворення за температури 0, лишайтеся на Q8 з двома картами.

4. MTP і словникова карта: дешеве вгадування наперед

Найбільший виграш дає спекулятивне декодування з MTP (multi-token prediction). Модель має власну маленьку чорнову голову, яка пропонує наступні токени, а велика модель перевіряє ці пропозиції паралельно. У цьому форку глибина дорівнює 3: вгадуються три токени, усі три перевіряються за один прохід, і всі правильні здогадки зберігаються.

Змінилася саме перевірка. Старий llama.cpp приймав чорновий токен лише за точного збігу з найкращим варіантом основної моделі — суворо й марнотратно. Цей стек натомість використовує нормальну вибірку з відхиленням. Кожен чорновий токен приймається з імовірністю min(1, p/q), де p — імовірність токена в основної моделі, а q — у драфтера. Простіше кажучи, це чесні кості, і підсумковий розподіл доведено збігається зі звичайною генерацією: відповідь приходить швидше за тієї ж якості.

Лишається файл карти. Навіщо команді запуску взагалі словникова карта?

Словник Qwen3.8-27B — майже 248 000 токенів. На кожному кроці чернетки прихований стан множиться на величезну матрицю проєкції, що охоплює їх усі, приблизно 1 152 × 248 320, тобто близько 286 мільйонів множень-додавань на кожен чорновий токен. Проте реальний текст майже не зачіпає більшу частину словника. За замірами на реальному виводі короткий список із 65 536 найчастіших токенів покриває 99,59% пропозицій драфтера.

Тому карта урізає лише проєкцію драфтера, а основна модель і далі обирає з усього словника:

Full vocab draft head:    1,152 × 248,320 ≈ 286M MACs per draft token
Shortlisted (65K):        1,152 ×  65,536 ≈  75M MACs per draft token

Це приблизно на 75% менше роботи в найдорожчій матриці драфтера. Оскільки чернетки будуються по кілька разів на кожен згенерований токен, це виявилося найбільшим пришвидшенням у релізі v0.2 — стрибок приблизно з 65 до 75 ток/с. Без карти кожна здогадка оплачується повністю.

Складіть усі чотири шари: переписані ядра, розумніший розподіл бітів, стиснуту пам'ять і дешевий погляд уперед. І відеокарта 2020 року обганяє те, що спеціалізоване залізо пропонувало 2023-го. RTX 3090 не стала кращою. Просто спільнота дуже добре навчилася її вичавлювати.

Загальна картина

Замисліться, що сталося. Один інженер за допомогою передових моделей за кілька днів змусив споживчу відеокарту 2020 року обслуговувати провідну відкриту модель приблизно втричі швидше за офіційний стек, а потім безкоштовно виклав ядра, квантизацію й рецепт.

Ось так виглядає локальний ШІ у 2026 році. Щомісяця те, що минулого кварталу потребувало двох карт, вміщується на одну. Це змінює й суперечку про те, хто контролює ШІ. Залізо, яке вже стоїть у людей удома, може запускати сучасні моделі офлайн, без API-ключа, без оплати за токени й без чийогось дозволу. Правила, що підвищують вартість інференсу або обмежують, хто може купувати обчислювальні потужності, найсильніше вдарили б саме по такій незалежній роботі.

Хай що ви думаєте про ці політичні суперечки, практичний висновок простий. Ваги лежать на вашому власному диску, а робота над ефективністю в open-source-спільноті, яка приходить у вигляді ядер і комітів, а не анонсів, і далі знижує ціну запуску власної моделі. Код — у репозиторії llamAmpere, модель — jakeatx/Qwen3.8-27B-ATX-IQ4_XS-M-GGUF.