Робота з Qwen3.8-Flash-Next на картках RTX 3090 за допомогою llama.cpp з відкладенням обчислень тензорів
Чому розріджена модель об’ємом 88 ГБ із 180 мільярдами параметрів підходить для споживчих GPU, та як такі параметри llama.cpp, як -ot, -ncmoe та mmap, розподіляють її між VRAM, RAM та NVMe.
Qwen3.8-Flash-Next — це відкрита модель із приблизно 180 мільярдами параметрів, чиї квантовані файли займають 88 ГБ, проте люди повідомляють про її роботу на одній картці RTX 3090 із 24 ГБ VRAM. На папері це відрізняється у десятки разів. Вона працює завдяки архітектурі моделі, а не через розумну квантацію чи надзвичайно потужну GPU: великі частини моделі зовсім не потребують зберігання на відеокарті. У цій статті пояснюються чотири елементи дизайну, які це уможливлюють, а також наводяться повні конфігурації llama.cpp для системи з трьома GPU та машини з однією GPU, включаючи пояснення функцій кожного важливого параметра та реалістичні показники продуктивності.
Чому варто запускати Flash-Next локально
Alibaba випустила Flash-Next у серпні. На момент написання цього тексту її результати перевершують результати Qwen3.8-27B, DeepSeek V4 Flash (0731) та, за деякими тестами на агентну здатність, Opus 4.6, при цьому вона активує лише 6 мільярдів параметрів на токен. Рейтинги в тестах швидко змінюються, тому перевіряйте поточні оцінки, перш ніж вважати ці порівняння остаточними. Більш стабільним фактором є структура моделі, адже саме вона визначає, яке обладнання може її підтримувати.
Чотири архітектурні рішення, які переміщують обчислення з GPU
Flash-Next поєднує чотири підходи. Кожен з них переміщує частину ресурсоемких обчислень з дорогого обладнання на дешевше або повністю їх усуває.
УльтраПроста суміш експертів
Модель має 48 шарів, і кожен шар містить 512 експертних підмереж. Кожен токен проходить через лише 11 з них: 10 обирає маршрутизатор, який аналізує токен та вибирає найбільш підходящих фахівців, а також 1 спільний експерт, якого використовує кожен токен без додаткового маршрутизування. Іншими словами, приблизно 2% експертів виконують роботу для даного токена.
Корисним прикладом є лікарня з 512 фахівцями, які перебувають у режимі чергування, та одним лікарем загальної практики, який завжди знаходиться в кімнаті. Кожен пацієнт отримує десять консультацій, підібраних відповідно до його симптомів, а інші 501 фахівець не беруть участі. Ключовою ідеєю для локальних висновків є те, що „у режимі чергування“ означає лише „доступний“. Фахівець не обов’язково мусить знаходитися на GPU, щоб бути доступним.
Спільний експерт існує тому, що дизайни, засновані виключно на маршрутизації, схильні втрачати загальні знання, необхідні кожному токену. Розміщуючи ці знання у постійно активному універсалі, можна дозволити експертам, які працюють за маршрутизацією, більш інтенсивно спеціалізуватися. Більшість сучасних дизайнів типу MoE містять такого універсала, а його параметри є частиною загального обсягу пам’яті у 6 мільярдів елементів.
Gated DeltaNet плюс Qwen Sparse Attention
Стандартний трансформер зберігає запис ключ/значення для кожного обробленого ним токена. Цей кеш KV зростає лінійно з довжиною контексту та стає величезним при довгих текстах. Flash-Next значною мірою уникає цієї проблеми. Три з кожних чотирьох шарів використовують Gated DeltaNet, який стискає історію обробки до невеликого стану фіксованого розміру. Решта шару в кожній групі використовує Qwen Sparse Attention, який читає дані з фіксованого обсягу у 512 блоків, 2 048 токенів, незалежно від того, чи містить контекст 32 К або мільйон токенів.
Практичний ефект є значним: при обсязі контексту 178K KV-кеш у наведених нижче конфігураціях займає близько 6GB, тоді як аналогічна щільна модель потребувала б приблизно в десять разів більше пам’яті. Саме тому карта на 24GB взагалі може підтримувати тривалі розмови.
Закритий багатопротокольний резидуальний потік
Класичні трансформери передають усе через один резидуальний потік від першого до останнього шару, і в глибоких мережах ранні характеристики зазвичай тьмяніють у процесі обробки даних. Flash-Next розширює цей шлях до чотирьох паралельних каналів, причому навчені шлюзи контролюють те, що потрапляє в кожен канал та що з нього виходить. Під час навчання один з каналів почав спеціалізуватися як канал довгого радіуса дії, який передає ранню інформацію глибоко в мережу. Це невелика архітектурна зміна, яка додає можливостей без суттєвих витрат.
Таблиця ембеддингів n-gram
Четвертий елемент — це таблиця з 51 мільярдом параметрів, що перевищує сумарну кількість параметрів у всіх інших частинах моделі, і вона зовсім не виконує операцій множення матриць. Це структура пошуку, і саме вона є основною причиною того, чому одна графічна картка для ігор є придатною.
Таблиця n-грам: знання, які не потребують GPU
У звичайній мовній моделі кожен токен мапується на ID, і модель шукає цей ID у таблиці ембеддингів: по одному рядку на токен. Рядок, що містить лише один токен, несе дуже мало інформації про контекст. Якщо розглянути фразу на кшталт "dostoevsky wrote the brothers", ембеддинг слова "the" нічого не говорить про Карамазових; моделі доводиться виводити продовження за допомогою своїх ресурсомістких шарів, і їй доводиться робити це щоразу, коли з’являється така структура.
Flash-Next додає другу таблицю, рядки якої позначені короткими фразами замість окремих токенів. Концептуально записи виглядають як на малюнку нижче: зліва — хешована фраза, а праворуч — тип підказки, яку кодує її навчений вектор.
Drawer "born on october" → hint: 1985, Honolulu, singer
Drawer "dostoevsky brothers" → hint: Karamazov, novel, 1880
Drawer "def main(" → hint: python entry point
Під час читання модель хешує останні кілька токенів, отримує відповідний рядок та фактично безкоштовно отримує попередньо обчислену підказку. Ці рядки ніхто не створював вручну. Протягом навчання, щоразу коли фраза слідувала за певним продовженням, її рядок трохи коригувався у цьому напрямку, тож після трильйонів токенів кожен рядок наближається до того, що зазвичай йде далі. У таблиці міститься близько 20 мільйонів записів біграм та тріграм, а її результат вводиться один раз, на ранньому етапі, у 2-му шарі. Фактично це є запам’ятовуванням поширених фразувань, а значна частина реального тексту складається саме з таких фразувань.
Різниця між цими двома видами знань у моделі є тим, що дозволяє розділити обчислення між апаратним та програмним забезпеченням. Наведене нижче порівняння її узагальнює.
| | Neural network | N-gram table |
|------------------|-------------------------|-------------------------|
| Work per token | Matrix math (expensive) | Drawer lookup (no math) |
| Needs the GPU? | Yes, every millisecond | No — CPU can fetch it |
| Lives in | VRAM | RAM. Even SSD. |
Вирішальною властивістю є те, що рядок даних, який потрібно отримати, залежить лише від вхідного тексту, а не від будь-якого прихованого стану всередині мережі. Як тільки запит токенізується, процесор точно знає, які рядки будуть потрібні, тож може попередньо їх завантажити, поки GPU все ще працює над попередніми шарами.
Це дозволяє розмістити модель у меморійній ієрархії відповідно до того, що кожен рівень виконує найкраще:
- VRAM (швидка, дорога): приблизно 6 млрд параметрів, які фактично обчислюються для кожного токена.
- Системна RAM (середня, дешева): незайняті ваги експертів та таблиця n-грамів об’ємом 29 ГБ.
- Зберігання NVMe (повільне, найдешевше): дані, які потрапляють у пам’ять лише тоді, коли до них звертаються.
GPU більше не є місцем зберігання всього моделювання, а стає місцем виконання активних обчислень.
Конфігурація з трьома GPU для щоденного використання
Розгляньмо сервер, побудований з трьох карт RTX 3090 (загалом 72 ГБ VRAM), 48 ГБ системної пам’яті типу DDR4 та диска PCIe Gen3 NVMe для зберігання ваг моделі. Це зовсім не пристрій класу робочої станції – це той тип обладнання, який багато розробників складають зі старіших ігрових карт.
Файл моделі, який тут використовується, – це версія UD-IQ4_XS з репозиторію unsloth’s GGUF для цієї моделі на Hugging Face; розмір файлу становить близько 88 ГБ, розділених на три частини: приблизно 59 ГБ ваг основної частини моделі та 29 ГБ таблиці n-gram. Підтримка цієї архітектури з’явилась нещодавно, тому перед спробою використання потрібно завантажити найновішу версію коду llama.cpp та перескласти модель заново.
Наведена нижче команда запускає llama-server на трьох відеокартах пристрою. Більшість параметрів є стандартними (хост, порт, параметри вибірки даних, розмір пакетів, довжина контексту), тому зверніть увагу на параметри переміщення обчислень, параметри розділення та режим завантаження, про які йдеться відразу після цього.
CUDA_VISIBLE_DEVICES=0,2,3 CUDA_SCALE_LAUNCH_QUEUES=4x llama-server \
-m /mnt/data_2t/ai_models_all/llm_hf_models/unsloth/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf \
--alias Qwen3.8-Flash-Next \
--jinja \
--metrics \
--host 0.0.0.0 \
-ngl 99 \
--batch-size 4096 \
--ubatch-size 512 \
--flash-attn on \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 --repeat-penalty 1.0 \
--split-mode layer \
--tensor-split 0.9,0.95,1.0 \
--fit off \
--main-gpu 0 \
--ctx-size 178000 \
--parallel 1 \
--image-min-tokens 1024 \
--reasoning-format none \
--timeout 1200 \
--ctx-checkpoints 8 \
--port 8082 \
--load-mode mmap \
--cache-type-k q8_0 --cache-type-v q8_0 \
-ot '^per_layer_token_embd\.weight$=CPU' \
--reasoning-effort low \
-t 14
Фіксація таблиці n-gram у оперативній пам’яті системи
-ot '^per_layer_token_embd\.weight$=CPU' — це параметр перевизначення, який повідомляє llama.cpp, що будь-який тензор, назва якого відповідає цьому регулярному виразу, має зберігатися у пам’яті CPU, а не у VRAM. Таблиця n-gram зберігається під назвою тензора per_layer_token_embd.weight, тому ця одна рядок не дозволяє 29 ГБ цієї інформації потрапити у GPU. Коли токену потрібен рядок, CPU його завантажує та передає результат далі, що саме і є описаним вище механізмом попереднього завантаження даних. Символи ^ та $ мають важливе значення: вони гарантують, що шаблон буде застосовуватися лише до цього тензора та не спричинить випадкового переміщення інших параметрів.
Дозволити ОС керувати розміщенням даних за допомогою mmap
--load-mode mmap створює карти пам’яті для файлу моделі замість того, щоб спочатку читати його в RAM. Операційна система потім зберігає часто використовувані сторінки у наявному кеші сторінок, а рідко використовувані — на SSD. З 48 ГБ RAM та таблицею об’ємом 29 ГБ це є правильним компромісом: ядро вирішує, що заслуговує залишитися в пам’яті. На пристрої з великою кількістю пам’яті, наприклад 128 ГБ, доцільніше використовувати режим none, оскільки весь файл читається лише один раз, і після цього не виникає помилок сторінок.
Розподіл шарів між картками
--split-mode layer у поєднанні з --tensor-split 0.9,0.95,1.0 ділить 59GB основної частини мережі на послідовні групи шарів — по одній групі на кожен GPU, з дещо нерівними пропорціями, щоб перша карта мала запас для виконання додаткових обов’язків як --main-gpu. Параметр -ngl 99 розміщує всі 48 шарів на GPU, приблизно по 20GB на кожну карту. Кеш KV, квантований до формату q8_0 за допомогою --cache-type-k та --cache-type-v, розташовується поруч із вагами та охоплює 178K токенів приблизно у обсязі 6GB.
Виміряна пропускна здатність на трьох картах
У цій конфігурації наведені нижче числові показники.
Decode: 30-50 tokens/second
Prefill: 400-700 tokens/second
Context: 178,000 tokens
Це швидше, ніж швидкість читання моделі з класу frontier-adjacent на вживаних споживчих картах у корпусі середнього розміру.
Конфігурація з одним GPU та її обмеження
Одна відеокарта 3090 достатня, якщо дотримується одна умова: щонайменше 64 ГБ оперативної пам’яті системи. Таблиця n-gram та експерти, які виконують свої функції поза основною пам’яттю, потребують місця для зберігання, а оперативна пам’ять системи зазвичай є найдешевшим способом оновлення для локальної ШІ-машини.
Команда використовує той самий файл GGUF. Основні відмінності полягають у новому флагу -ncmoe, єдиній видимій відеокарті, параметрі --load-mode none замість mmap та меншій кількості потоків CPU.
CUDA_VISIBLE_DEVICES=0 llama-server \
-m /mnt/data_2t_3/ai_models_all/unsloth/Qwen3.8-Flash-Next-GGUF/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf \
--alias Qwen3.8-Flash-Next \
--jinja \
--metrics \
--host 0.0.0.0 \
-ngl 99 \
-ncmoe 38 \
--batch-size 4096 \
--ubatch-size 1024 \
--flash-attn on \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 --repeat-penalty 1.0 \
--ctx-size 178000 \
--parallel 1 \
--image-min-tokens 1024 \
--reasoning-format none \
--timeout 1200 \
--ctx-checkpoints 8 \
--port 8083 \
--load-mode none \
-ot '^per_layer_token_embd\.weight$=CPU' \
--reasoning-effort low \
-t 8
Що робить -ncmoe 38
-ncmoe 38 зберігає ваги експертів перших 38 шарів у оперативній пам’яті CPU, тоді як останні 10 шарів зберігають свої експертів у VRAM. Це означає, що близько 43 ГБ ваг експертів знаходиться у оперативній пам’яті системи. Компоненти уваги та спільні елементи кожного шару все одно виконуються на відеокарті завдяки параметру -ngl 99.
Використання великої кількості пам’яті RAM залишається доцільним завдяки її розрідженості. Кожен токен активує 10 з 512 експертів на кожному шарі, тож він загалом впливає лише на приблизно 1,3 ГБ ваг експертів. Експерти, які знаходяться в RAM, обчислюються на CPU, де вони розташовані, без копіювання їх на GPU, а експерти в VRAM працюють безпосередньо на самій картці. CPU набагато повільніший за 3090, тож існує справжня втрата продуктивності, але вона залежить від приблизно 2% ваг, на які впливає кожен токен, а не від усього збереженого об’єму.
Оскільки тут RAM вміщує значну кількість даних, параметр --load-mode none зчитує файл повністю під час запуску замість того, щоб покладатися на помилки завантаження сторінок, що є ще однією причиною важливості мінімуму 64 ГБ пам’яті.
Налаштування для інших карток
Та сама команда працює з RTX 4090 чи 5090; лише параметр -ncmoe потрібно коригувати відповідно до наявної кількості VRAM. Рекомендовані початкові значення наведені нижче.
| GPU | VRAM | Suggested -ncmoe | Experts in RAM |
|------------|------|------------------|----------------|
| RTX 3090 | 24GB | 38 | ~43GB |
| RTX 4090 | 24GB | 38 | ~43GB |
| RTX 5090 | 32GB | 28-30 | ~32GB |
Кожен крок зі зменшенням значення -ncmoe повертає експертів одного шару, приблизно 1,1 ГБ, назад на GPU. Після завантаження моделі перевірте команду nvidia-smi та намагайтеся залишити близько 500 МБ вільної VRAM; робота карти при повній завантаженості призводить до помилок через брак пам’яті, коли обсяг даних зростає.
Встановлення реалістичних очікувань
На одній карті 3090 процес декодування відбувається зі швидкістю 15–20 токенів на секунду. Це прийнятно, але лише мінімально: достатньо швидко, щоб можна було читати в реальному часі, але достатньо повільно, щоб довге генерування тексту здавалося повільним, оскільки частина обчислень фактично виконується на CPU у системній пам’яті. Як доказ концепції або для отримання максимальної користі від вже наявної картки, робота моделі класу 180B зі швидкістю читання на одній ігровій картці є вражаючою.
Для асистента, який має працювати цілий день над програмуванням та повсякденними завданнями, саме три-чотири відеокарти 3090 забезпечують комфортну роботу. Різниця між приблизно 18 та 40 токенами на секунду визначає різницю між демо-версією та щоденним інструментом. Якщо ви натомість розглядаєте менші локальні моделі Qwen для агентного програмування, посібник з створення локальної гри за допомогою Qwen3.8-27B показує більш легку конфігурацію.
Прогнозування кількох токенів: наступне покращення швидкості, яке варто стежити
Flash-Next постачається з підготовленим блоком прогнозування кількох токенів (MTP) — невеликим додатковим модулем, який одночасно пропонує кілька наступних токенів, щоб основна модель могла перевірити їх паралельно. Це спекулятивне декодування з компонентом чернетки, підготовленим «від кінця до кінця» саме для цієї моделі. На платформі vLLM повідомлялося, що це забезпечує приблизно 2,5 рази швидше декодування для реальних запитів.
На момент написання цього тексту llama.cpp підтримує саму архітектуру Flash-Next, проте її проєкт MTP ще не охоплює цю модель. Існує підтримка схожих моделей, тому зміни мають бути незначними, але перевірте поточні примітки до версії llama.cpp, перш ніж вважати її доступною. Як тільки це буде реалізовано, швидкість обробки в трьох GPU — 30–50 токенів на секунду — може значно зрости до приблизно 60–100 на тому ж обладнанні, лише завдяки оновленню програмного забезпечення. Вважайте це орієнтовною цифрою, поки не зможете її перевірити.
Основні висновки
- Flash-Next підходить для споживчого обладнання завдяки своїй конструкції, а не силі обчислень: ультракомпактний формат MoE, фіксована кількість станів уваги та таблиця n-gram, яка використовується лише для пошуку, — усе це зменшує обсяг даних, які потрібно зберігати в VRAM.
-ot із точним регулярним виразом.-ncmoe — основний параметр для конфігурацій з однією GPU: зменшуйте його, поки VRAM майже не заповниться, залишаючи невеликий запас безпеки.mmap, якщо оперативної пам’яті обмаль та ви хочете, щоб операційна система керувала розміщенням даних; оберіть none, якщо оперативної пам’яті достатньо та ви хочете передбачувану затримку після завантаження.