← На главную

Опубликовано

...и выкопал стюардессу

Автор: Гусев Николай [портфолио]

Темы: llm, gpu, inference, benchmarks, agents

Коротко: Комментарий читателя про HyperQwen и gpu-unlock: 2000 токенов в секунду prefill на 32K контекста одной 3090. Разбираем, откуда цифра, кому анлок реально поможет на 2080, 3090, 4060 Ti и 4090, почему 5070 Ti мимо, и при чём тут APU на 128 ГБ.

gpu-unlock-prefill-agenty

Эта статья началась с комментария читателя под новостью про HyperQwen - репозиторий, где 27-миллиардный Qwen разгоняют на одной RTX 3090 патчами к vLLM и пересборкой квантизации. В комментарии было: "совместил HyperQwen с you-unlock, на single user получил почти 2K prefill на 32K контекста и за тысячу на 128K. Это показательнее для типичного агентного использования".

Цифра подозрительная. HyperQwen в собственном README хвастается 127 токенами в секунду декода, а тут человек молча выдал полторы-две тысячи токенов в секунду на чтении промпта. Пришлось разбираться. Разобрался - и это оказалось даже интереснее, чем "8,5-кратное ускорение" из заголовка самого HyperQwen.

Что такое HyperQwen

Начну с проекта, потому что комментарий читателя без него не читается. HyperQwen это не модель и не форк движка. Это две вещи, собранные вокруг одного чекпойнта Qwen3.8-27B и одной карты: серия патчей к vLLM 0.31.0 и пайплайн подготовки модели. Лицензия Apache 2.0, разворачивается docker compose, первый старт тянет образ на 9,5 ГБ и один раз переквантовывает модель под себя. Дальше сервер на :18020 с OpenAI-совместимым API.

Авторы сами честно называют портрет: "большие Qwen-модели, обслуживаемые быстро на GPU, которые у людей реально есть". Один RTX 3090 с лимитом 250 ватт - и на нём замерено всё, что они утверждают. Пять готовых режимов:

A - batch.  API-бэкенд, 64 одновременных запроса: ~1035 tok/s суммарного декода
B - single. Дефолт: 127 tok/s одним потоком, контекст до 64k
C - reproduction. DFlash2, ответ цитирует промпт: 381 tok/s на 25k контекста
D - long.   MTP-спекуляция, контекст до 150k: ~95-100 tok/s
E - huge.   KVarN-кэш, контекст 240k: 67 tok/s, на цитировании 164

Что под этим стоит, по слоям.

Квантование. Реквант W4A16: веса в 4 бита, активации в int8, и это принципиально, потому что prefill в такой конфигурации гоняется через FP16-тензорные ядра, а не мимо них. Запомни это место - на нём держится вся остальная статья.

Спекуляция двух видов. MTP - штатная много-токеновая голова, 2,75-2,9 токена за шаг. DFlash2 - агрессивнее: 7 черновиков за проход, 15 токенов на верификацию за шаг, и черновики берутся прямо из промпта. Отсюда режим C и его 381 tok/s: когда ответ цитирует вход, черновики достаются бесплатно. Для агентного цикла это родной профиль - вывод инструмента вернулся в промпт, модель его пересказывает. На длинном контексте DFlash2 проигрывает MTP примерно 2:1 на всём, кроме цитирования, поэтому режим D сознательно переведён на MTP.

Длинный контекст. KVarN-кэш с 4/2-битными KV-записями доводит контекст до 262k. Отдельно добавлены два attention-ядра: int8-KV ядро pth-flash-attn даёт +12-14% декода на длинном контексте и на 1,9% меньший расход пула; порт fp8-KV FlashAttention-2 на батарее качества показал +27% декода на 100k и холодный TTFT 75,5 секунды против 132,3 на стоке - TTFT на 66k контекста уполовинили.

Калибровка драфтера. Отдельная история, которую я разбирал в серии про проверку спекуляции на одной 4060: черновой словарь MTP-головы пересчитали по 5,4 млн токенов собственных выходов модели. Покрытие выросло с 92,1% до 97,5%, декод с 98,0 до 108,6 tok/s - и ничего больше не менялось. GPTQ-калиброванный int4 для lm_head и MTP-модуля добавил ещё до 118,8. А вот тонкая настройка самой MTP-головы не сдвинула top-1 agreement вообще: 0,685 на 0,685. Домен решает сильнее тюнинга - тот же вывод, к которому мы пришли на своём стенде.

Качество не обвалили. На fp8-KV ветке: GSM8K 0,950 против 0,955 (n=200), perplexity плюс 0,04%, ноль повреждённых остатков из 128, 20-минутный soak без рестарта. IFBench 78,3 против 79,5 у bf16. Это не "стало хуже, зато быстрее" - это "стало неразличимо, зато вдвое быстрее читает".

Что переносится, а что нет - и это важнее таблиц цифр, если у тебя не 3090. Серия патчей к vLLM, KVarN-бэкенд, выбор int8 Marlin-слоёв - переносится на любую модель и карту. Int8-QK prefill-ядро прибито к геометрии чекпойнта: 24 головы, 4 KV-головы, размер головы 256 - на другой модели его нет, пока не обобщат. Тюн-таблицы Marlin сняты на sm86: sm120 (RTX 5090) воспроизводит, sm80 (A100) ловит спекулятивный фолт. Черновой словарь и DFlash2-драфтер - на каждое модель отдельно. Проект открыто просит field-тесты на чужих картах: протокол замера на полчаса, шесть обязательных полей, отчёт попадает в docs/reproductions с указанием авторства.

И последнее, что пригодится дальше: их собственный замер prefill - на промпте в 1k токенов стоковая 3090 даёт ~1440 tok/s, а с int8-активациями ~1850-1940. Держи эти числа в голове, они сейчас объяснят цифру читателя.

Что такое "you-unlock"

Речь про gpu-unlock - Linux-модуль ядра от разработчика Zagitta. Факт, на котором всё держится: NVIDIA продает GeForce с тензорными ядрами, работающими на половинной скорости для FP16, BF16 и TF32 с накоплением в FP32. Тот же самый кремний под именем RTX A-series или профессиональной карты работает на полной. Это не физика, это сегментация рынка: компании, которым нужен инференс и обучение, платят за профессиональные карты вдвое-втрое дороже.

Модуль снимает этот лимит на загрузке, до того как штатный драйвер подхватит карту. Без перепрошивки VBIOS, без патченного драйвера, ничего не сломается при обновлении драйвера. Статус по поколениям: RTX 30 - стабильно, больше сотни отчётов владельцев; RTX 40 - экспериментально; RTX 20 - экспериментально; RTX 50 (Blackwell) - не поддерживается и вряд ли будет.

Измеренный эффект на сами тензорные операции: RTX 3090 - с 75 до 125 TFLOPS BF16, RTX 4090 - с 165 до 329 на пике. Но главное - таблица реальных нагрузок из их README:

LLM prefill / обработка промпта, FP16/BF16   +25-55%
Время до первого токена                       -25-30%
LoRA и полное дообучение в BF16              +25-50%
Генерация изображений (SDXL, DiT)            +30-55%
FlashAttention-ядра                          +50-60%
llama.cpp с квантованными GGUF                0-15%, в основном на длинном контексте
LLM decode / генерация токенов               БЕЗ ИЗМЕНЕНИЙ
INT8, FP8 и INT4 модели                      БЕЗ ИЗМЕНЕНИЙ
Игры и FP32 CUDA                             БЕЗ ИЗМЕНЕНИЙ

Читать эту таблицу надо так: декодирование упирается в пропускную способность памяти видеокарты, анлок её не трогает вообще. Ускоряется всё, что считается через тензорные ядра в FP16-пути: prefill (чтение и обработка промпта), дообучение, генерация картинок. Почему prefill и decode упираются в разные места - это половина полезности любого заявления об "ускорении GPU", я это разбирал в серии про спекуляцию: там на одной 4060 четыре метода ускорения генерации показали всё от 1,8x до нуля и минуса, и главный вывод серии был ровно этот - сначала делите нагрузку на prefill и decode, потом верьте цифрам.

Откуда 2000 токенов в секунду

Теперь комментарий читателя складывается. Пайплайн HyperQwen - W4A16-реквант с int8-активациями, то есть prefill там гоняется через FP16-тензорные ядра, а не мимо них. На анлокнутой карте этот путь ускоряется в полтора раза. Их собственные замеры: на коротком промпте в 1k токенов стоковая 3090 выдаёт ~1440 tok/s, с int8-активациями ~1850-1940 [замер из их таблиц]. На 32K промпте сток проседает - внимание на длинных последовательностях дороже, отсюда моя оценка ~1200-1400 для стока - и анлок выталкивает чтение промпта обратно к двум тысячам [оценка, согласуется с их короткопромптовыми числами и заявленным тензорным приростом]. На 128K контексте замедление закономерно - там всё упирается уже и в память под KV-кэш, отсюда "за тысячу".

Замер читателя я не воспроизводил [непроверено] - у меня в стенде 4060 на 8 ГБ, 27B туда физически не влезает. Но косвенно цифра сходится: отношение к заявленному тензорному приросту правильное, и сам HyperQwen в docs/benchmarks.md подтверждает, что prefill-бенчи у них вторичны по сравнению с декод-таблицами.

А вот тезис комментатора "это показательнее для типичного агентного использования" - правильный, и вот почему.

Почему агентам важен prefill, а не декод

Типичный цикл агента: системный промпт, описание инструментов, история диалога, свежий вывод инструмента - итого 20-80 тысяч токенов на вход. Ответ - 500-2000 токенов. Соотношение входа к выходу - 30:1 и хуже.

В таком цикле decode-скорость почти не влияет на время ответа. Даже при скромных 100 токенах в секунду генерация тысячи токенов занимает 10 секунд. А prefill 50 тысяч токенов на стоковой 3090 - это 40 секунд тишины до первого токена. Вся боль агентного использования локальных моделей - не "медленно пишет", а "молчит, пока читает".

Именно поэтому спекулятивное декодирование - главный маркетинговый герой локального инференса - в агентном цикле вторично. EAGLE-3 у меня на 4060 работал в минус на русском корпусе: acceptance 0,17 вместо заявленных 0,80, скорость 0,64x от базовой, и домен решал сильнее битрейта квантизации. Даже там, где спекуляция работает, она ускоряет только меньшую часть агентного цикла.

Кстати, HyperQwen - хороший контрпример того, как спекуляцию довели до ума правильным способом. Их MTP-спекуляция даёт 2,8 токена за шаг на 3090, и рабочий апгрейд - не тонкая настройка драфт-головы (она не сдвинула top-1 agreement вообще: 0,685 на 0,685), а пересчёт чернового словаря на 5,4 млн токенов собственных выходов модели. Домен решает - в том числе для драфтера.

Считаем по картам

Что анлок даст на разном железе при агентном профиле (большой промпт, короткий ответ), для модели класса W4A16-27B:

Карта            | Статус анлока        | Prefill-эффект          | Замечание
RTX 3090         | стабильно            | +50-65%, до ~2k tok/s   | единственный замер, рабочий вариант
RTX 4090         | экспериментально     | +25-40% на реальных GEMM| пик x2, но по питанию меньше; независимый замер cuBLAS +12-34%
RTX 4060 Ti 16GB | экспериментально     | +30-45%                 | декод всё равно упирается в 288 ГБ/с
RTX 2080 Ti      | экспериментально     | 0-10%                   | у Turing FP16 с acc16 уже был на полной скорости, анлок открывает только BF16/TF32 путь
RTX 5070 Ti      | НЕ поддерживается    | 0                       | Blackwell: FP16-путь и так полный, эксплойта нет

Тут три честных оговорки. Первая: цифры кроме 3090 - [оценка], пересчитанная из измеренных тензорных приростов, а не живые замеры prefill. Вторая: 4090 упирается в лимит питания раньше, чем в тензорные ядра, поэтому пик x2 не переезжает в реальные задачи целиком. Третья: на квантованных INT8/INT4-путях (чистый Marlin W4A8, GGUF Q4 в llama.cpp) эффект около нуля - эти пути не гоняют FP32-аккумуляцию. 4060 Ti с её 16 ГБ - рабочий минимум для W4A16-27B, и на ней анлок как раз вытянет prefill, который у неё слабейшее место.

Отдельно про 5070 Ti: владельцам Blackwell анлок не светит вообще - у NVIDIA там уже нет этого лимита на FP16-пути, лимитировали именно старшие поколения. Ирония: чем новее карта, тем меньше смысла в эксплойте.

Третий персонаж: APU на 128 ГБ

И вот тут вылезает фон, на котором вся эта возня с анлоками вообще имеет смысл. RTX 5090 за год превратилась из игровой видеокарты в предмет роскоши: $2000 рекомендованной цены в американских листингах живут недолго, реальная цена уходит за $3000, у нас - ещё дальше. Партия Zotac размером с паллету была оценена в $470 тысяч. Карта на 32 ГБ по цене б/у автомобиля - это не сегмент "геймер", это сегмент "коллекционер".

На этом фоне у локального инференса остаётся два реальных пути, и комментарий читателя - про первый из них: рабочие лошадки. Б/у 3090 на 24 ГБ остаётся лучшим соотношением VRAM-за-деньги в истории локального LLM: 936 ГБ/с памяти, теперь ещё и с бесплатным +50-65% на prefill. Две штуки через NVLink дают 48 ГБ дешевле одной 5090.

Второй путь - унифицированная память APU. FEVM FAEX2 на новом AMD Ryzen AI Max+ Pro 495 ("Gorgon Halo"): 16 ядер Zen 5, встроенная Radeon 8065S с 40 CU, LPDDR5X-8533 на 273 ГБ/с, 128 или 192 ГБ унифицированной памяти. Конфигурация на 128 ГБ стоит 21,6 тысячи юаней (около $3000), на 192 ГБ - вдвое дороже. В играх iGPU почти догнала RTX 5060 (первые тесты: 133 FPS против 142 в Forza Horizon 5 в 1080p). Для LLM главное даже не скорость - 128-192 ГБ памяти означают, что 70B-модель влезает целиком без offload, а контекст в сотни тысяч токенов не упирается в 24 ГБ VRAM.

Прямых замеров prefill на этой связке под 27B у меня нет [непроверено]. Но арифметика профиля простая: 273 ГБ/с памяти дают декод порядка 30-50 токенов в секунду на 27B Q4, а prefill - сильно медленнее дискретной 3090. APU берёт не скоростью, а объёмом: там, где 3090 задыхается на 150K контекста, FAEX2 даже не начинает потеть. Для агентного цикла с гигантскими промптами это ровно та валюта, которой не хватает.

Что с этим делать

Практическая выжимка по профилям:

  • Агент на 27B-классе, Linux, есть 3090 - ставить gpu-unlock, эффект +50-65% на чтении промпта, декод не изменится. Точнее всего виден не в tok/s, а в TTFT - минус 25-30% времени тишины до первого токена.
  • Windows - есть неофициальный порт, сам автор его не поддерживает и просит быть осторожным с инсталляторами.
  • Модель в чистом INT8/INT4 или GGUF Q4 в llama.cpp - анлок почти бесполезен, эффект 0-15% только на длинном контексте.
  • 5090 - эксплойта нет; 5070 Ti и всё Blackwell - мимо.
  • Нужен контекст за 100K или модель 70B+ - это уже не про анлок, это про 128-192 ГБ унифицированной памяти, то есть APU-класс.

И последний штрих. Замечание комментатора "это показательнее для типичного агентного использования" стоит уточнить до конца: анлок ускоряет ровно ту часть агентного цикла, которую спекулятивное декодирование не трогает, и не трогает ту, которую оно ускоряет. Это не конкуренты, это две половины одной задачи. Мой стенд на 4060 в эти выходные будет пробовать адский форк gpu-unlock-ada на Turing-рецептах - если на Turing подтвердится хоть 10% на BF16-пути, методика замера prefill до/после из серии про спекуляцию ложится сюда одна в одну.

Ссылки

Наши: