Работа с Qwen3.8-Flash-Next на картах RTX 3090 с использованием технологии откладки вычислений Tensor в llama.cpp
Почему разреженная модель объемом 88 ГБ с 180 миллиардами параметров помещается в графические процессоры для потребителей, и как такие флаги в llama.cpp, как -ot, -ncmoe и mmap, распределяют ее между VRAM, RAM и NVMe.
Qwen3.8-Flash-Next — это открытая модель с примерно 180 миллиардами параметров, файлы которой в формате квантования занимают 88 ГБ, однако некоторые пользователи сообщают о возможности её запуска на одной карте RTX 3090 с 24 ГБ видеопамяти. На первый взгляд это кажется невозможным из-за огромной разницы в объёмах памяти. Однако модель работает благодаря своей архитектуре, а не за счёт умной технологии квантования или чрезмерно мощной видеокарты: большие части модели вообще не требуют хранения на видеокарте. В этой статье объясняются четыре основных принципа проектирования, позволяющих это реализовать, а также приводятся полные конфигурации llama.cpp для систем с тремя и одной видеокартами, включая информацию о функции каждого важного флага и реалистичные показатели производительности.
Почему стоит запускать 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 тысячи или миллион токенов.
Практический эффект впечатляющ: при объеме контекста 178 Кб кэш KV в приведенных ниже конфигурациях занимает около 6 ГБ, тогда как аналогичная плотная модель потребовала бы примерно в десять раз больше памяти. Именно поэтому карта на 24 ГБ вообще может обрабатывать длительные разговоры.
Защищенный многопутевой остаточный поток
В классических трансформерах вся информация передается по одному остаточному потоку от первого до последнего слоя, и в глубоких сетях ранние признаки со временем теряют свою значимость. Flash-Next расширяет этот путь до четырех параллельных каналов, при этом используемые гейты контролируют, что попадает в каждый канал и что из него уходит. Во время обучения один из каналов стал специализироваться на передаче информации на большие расстояния, позволяя ранним данным проникать глубоко внутрь сети. Это небольшое архитектурное изменение повышает производительность без значительных затрат.
Таблица эмбеддингов n-грамм
Четвертый компонент — это таблица из 51 миллиарда параметров, что превышает сумму параметров всех остальных компонентов модели вместе взятых, и при этом она совершенно не выполняет умножений матриц. Это структура поиска, и именно она является основной причиной возможности использования одной игровой GPU.
Таблица n-грамм: знания, не требующие GPU
В обычной языковой модели каждый токен сопоставляется с ID, и модель находит этот ID в таблице эмбеддингов: по одной строке на токен. Строка, содержащая всего один токен, несет очень мало информации о контексте. Если рассмотреть фразу «Достоевский написал „Братьев“», эмбеддинг слова «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. |
Решающим фактором является то, что строки данных, которые необходимо загрузить, зависят только от входного текста, а не от какого-либо скрытого состояния внутри сети. Как только запрос токенизируется, процессор точно знает, какие строки понадобятся, поэтому может загрузить их заранее, пока графический процессор все еще занят обработкой более ранних слоев.
Это позволяет распределять модель по уровням памяти в зависимости от того, что каждый уровень делает наилучшим образом:
- VRAM (быстрая, дорогая): примерно 6 млрд параметров, которые фактически вычисляются для каждого токена.
- Системная RAM (средняя скорость, дешевая): веса экспертов, не используемые в данный момент, и таблица n-грамм объемом 29 ГБ.
- Хранилище NVMe (медленное, самое дешевое): данные, превышающие объем памяти, загружаемые по мере необходимости.
GPU больше не является местом хранения всей модели, а становится местом выполнения активных вычислений.
Конфигурация из трех GPU для ежедневного использования
Рассмотрим сервер, собранный из трех карт RTX 3090 (всего 72 ГБ видеопамяти), 48 ГБ оперативной памяти DDR4 и диска PCIe Gen3 NVMe для хранения весов модели. В нем нет ничего, что свойственно рабочим станциям; это тот тип машины, который многие разработчики собирают из более старых игровых карт.
Файл модели, используемый здесь, — это версия UD-IQ4_XS из репозитория unsloth’s GGUF для этой модели на Hugging Face; её размер составляет примерно 88 ГБ, разделенных на три части: около 59 ГБ — веса основной структуры модели, и еще 29 ГБ — таблица n-грамм. Поддержка этой архитектуры появилась совсем недавно, поэтому перед попыткой использования необходимо скачать самую последнюю версию исходного кода llama.cpp и пересобрать его.
Приведённая ниже команда запускает llama-server на трёх GPU машины. Большинство флагов являются стандартными (хост, порт, параметры выборки, размеры пакетов, длина контекста), поэтому обратите внимание на флаги переноса работы, флаги разделения и режим загрузки, которые рассматриваются сразу после этого.
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-грамм в оперативной памяти системы
-ot '^per_layer_token_embd\.weight$=CPU' — это параметр переопределения, который указывает llama.cpp на то, что любой тензор, название которого соответствует данному регулярному выражению, должен храниться в памяти CPU, а не в VRAM. Таблица n-грамм хранится под именем тензора per_layer_token_embd.weight, поэтому этот один параметр предотвращает сохранение всех 29 ГБ данных в графических процессорах. Когда токену требуется строка из этой таблицы, CPU считывает её и передаёт результат дальше, что и является механизмом предзагрузки, описанным выше. Символы ^ и $ имеют важное значение: они гарантируют, что шаблон будет соответствовать именно этому тензору, и не приведут к случайной переноске других весов.
Предоставление ОС управления размещением данных с помощью mmap
--load-mode mmap применяет метод картирования памяти к файлу модели вместо его предварительного загрузки в RAM. Затем операционная система хранит часто используемые страницы в доступной кэш-памяти, а редко используемые — на SSD. При наличии 48 ГБ RAM и таблицы размером 29 ГБ это оптимальный баланс: ядро само решает, какие данные следует оставить в оперативной памяти. На компьютере с большим объемом памяти, например 128 ГБ, более разумно использовать режим none, поскольку весь файл загружается один раз, и после этого не возникает ошибок кэша.
Разделение слоев между картами
--split-mode layer в сочетании с --tensor-split 0.9,0.95,1.0 разделяет 59-гигабайтную основу сети на непрерывные группы слоев, по одной группе на каждую GPU, причем пропорции немного неодинаковы, чтобы первая карта имела свободные ресурсы для выполнения дополнительных функций в качестве --main-gpu. Параметр -ngl 99 распределяет все 48 слоев между GPU, причем на каждую карту приходится примерно 20 ГБ. Кэш KV, квантизированный до формата q8_0 с помощью --cache-type-k и --cache-type-v, размещается рядом с весами и может хранить 178 тысяч токенов при объеме около 6 ГБ.
Измеренная пропускная способность на трех картах
На такой конфигурации приведены ниже указанные показатели.
Decode: 30-50 tokens/second
Prefill: 400-700 tokens/second
Context: 178,000 tokens
Это быстрее, чем скорость чтения модели из класса, близкого к передовым решениям, на обычных потребительских картах в корпусе среднего размера.
Конфигурация с одной GPU и её ограничения
Одной карты 3090 достаточно, если выполняется одно условие: не менее 64 ГБ оперативной памяти системы. Таблица n-грамм и загруженные эксперты нуждаются в месте для хранения, и оперативная память обычно является самым дешевым способом улучшения производительности локальной ИИ-машины.
Команда использует тот же файл GGUF. Основные отличия заключаются в новом флаге -ncmoe, наличии одной видимой GPU, использовании параметра --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 ГБ весов экспертов в оперативной памяти системы. Компоненты, отвечающие за внимание и совместное использование ресурсов, в каждом слое по-прежнему обрабатываются на GPU благодаря параметру -ngl 99.
Использование большого объема памяти RAM остается возможным благодаря низкой плотности данных. Каждый токен активирует 10 из 512 экспертов на каждом слое, поэтому в сумме он затрагивает примерно 1,3 ГБ весов экспертов. Эксперты, находящиеся в RAM, обрабатываются на процессоре, где они расположены, без копирования их на GPU, а эксперты в VRAM работают непосредственно на самой карте. Процессор работает гораздо медленнее, чем 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 в оперативной памяти системы. В качестве демонстрации концепции или для максимального использования уже имеющейся у вас карты, работа модели объемом 180 миллиардов параметров с скоростью чтения на одной игровой карте является впечатляющей.
Для ассистента, который должен работать круглосуточно для программирования и повседневных задач, требуется три-четыре видеокарты 3090, чтобы обеспечить комфортную работу. Разница в скорости обработки примерно от 18 до 40 токенов в секунду определяет разницу между демо-версией и полноценным инструментом для ежедневного использования. Если вы рассматриваете более мелкие локальные модели Qwen для агентного программирования, то инструкция по созданию локальной игры с использованием Qwen3.8-27B показывает более легкую в настройке альтернативу.
Прогнозирование нескольких токенов: следующий шаг в ускорении
Flash-Next поставляется с обученной головой многотокенового прогнозирования (MTP) — небольшим дополнительным модулем, который одновременно предлагает несколько будущих токенов, чтобы основная модель могла проверять их параллельно. Это спекулятивное декодирование с компонентом черновика, обученным от начала до конца именно для этой модели. Согласно отчетам на vLLM, оно обеспечивает ускорение декодирования примерно в 2,5 раза при работе с реальными запросами.
На момент написания этого текста llama.cpp поддерживает саму архитектуру Flash-Next, но её текущая версия ещё не включает поддержку этой модели. Существует поддержка схожих моделей, поэтому изменения должны быть незначительными, однако перед тем как считать поддержку доступной, проверьте актуальные примечания к выпуску llama.cpp. После внедрения поддержки конфигурация с тремя GPU, обеспечивающая скорость обработки от 30 до 50 токенов в секунду, вероятно, сможет достичь уровня от 60 до 100 токенов в секунду на том же оборудовании, и это будет возможно исключительно благодаря обновлению программного обеспечения. Считайте это оценкой до тех пор, пока вы не сможете измерить реальные показатели.
Основные выводы
- Flash-Next подходит для потребительского оборудования благодаря особенностям своей архитектуры, а не из-за использования мощных ресурсов: сверхредкое представление MoE, фиксированное по размеру состояние внимания и таблица n-грамм, предназначенная только для поиска, — всё это сокращает объем данных, необходимых для хранения в VRAM.
-ot вместе с точным регулярным выражением.-ncmoe — основной параметр для конфигураций с одной видеокартой: уменьшайте его до тех пор, пока VRAM почти не заполнится, оставив небольшой запас.mmap, когда оперативной памяти мало и вы хотите, чтобы ОС управляла размещением данных; выбирайте none, когда памяти достаточно и вам нужна предсказуемая задержка после загрузки.