Перейти к содержанию
Публикация AiManual

Пять способов ускорить локальный инференс MoE-модели: Qwen3.8-Flash-Next на GTX 1070 в Strata

Разбираем пять приёмов ускорения MoE-инференса Qwen3.8-Flash-Next на GTX 1070 с 8 ГБ VRAM в движке Strata: спекулятивное декодирование, KV-кэш в pinned RAM, con

Коротко

Что будет в материале

  1. 01

    Что вообще происходит: большая MoE-модель на 8 ГБ VRAM

  2. 02

    Приём 1. Спекулятивное декодирование через MTP/drafting (--spec, --mtp)

  3. 03

    Приём 2. KV-кэш в pinned RAM и скользящее окно внимания (--kv-resident)

  4. 04

    Приём 3. Continuous batching для нескольких параллельных запросов (--batch/--parallel)

Что вообще происходит: большая MoE-модель на 8 ГБ VRAM

Qwen3.8-Flash-Next на GTX 1070 с 8 ГБ VRAM в движке Strata запускается потому, что MoE-архитектура не требует держать в работе все параметры сразу. На каждый токен активируется небольшая часть экспертов, и веса можно разложить между видеопамятью, оперативной памятью и SSD. Плата за такую схему очевидна: карта простаивает, пока ждёт веса по PCIe, а не считает.

Ускорять такую конфигурацию можно пятью приёмами. Спекулятивное декодирование (--spec, --mtp) заставляет черновой слой предсказывать несколько токенов вперёд, чтобы большая модель проверяла их пачкой. --kv-resident выносит KV-кэш в pinned RAM и оставляет в VRAM только скользящее окно внимания. Continuous batching (--batch, --parallel) считает несколько запросов в общих окнах верификации. Адаптивная резидентность экспертов перекладывает веса между VRAM, RAM и SSD по частоте обращений. Пятый приём, серверное автообнаружение общего префикса промпта (STRATA_AUTO_PREFIX=1), избавляет от повторного чтения одинакового начала запроса.

Границы применимости обозначим сразу: все замеры в материале принадлежат автору исходного разбора и получены на одной карте, одной модели и одной версии движка. Редакционного тестирования за ними нет, а переносить числа на RTX 4090 или другую MoE-модель без проверки нельзя.

Почему на GTX 1070 узкое место не FLOPs, а память и подкачка

Пропускная способность памяти у GTX 1070 скромная по нынешним меркам, и это ограничение проявляется раньше, чем нехватка вычислительных блоков. Когда модель не влезает в 8 ГБ, часть весов лежит в RAM, а часть может уходить на диск. Каждый токен тогда требует чтения по PCIe, и именно эти чтения задают скорость генерации. Считать карта умеет, ждать доставку весов нет.

Механика MoE подсказывает, куда прикладывать усилия. Подгрузка экспертов из RAM и SSD по требованию работает на том же принципе: чем реже нужен конкретный эксперт и чем чаще он попадает в кэш, тем меньше данных придётся тянуть через шину. Отсюда логика всех пяти приёмов: уменьшить объём чтений (спекулятивное декодирование, батчинг), перераспределить VRAM в пользу того, что нужно чаще (--kv-resident, резидентность экспертов), либо не перечитывать уже посчитанное (кэш префикса).

Что означают цифры из замеров автора

Замеры на одном железе выглядят так: медиана перечитанных токенов упала с 886 до 468, токенов из кэша стало 413 вместо 0, время до первого токена сократилось с 13,3 до 6,1 с. Исходный разбор связывает эти цифры с эффектом патча авто-префикса.

Читать их нужно как измерение на конкретной конфигурации, а не как обещание двукратного ускорения везде. Для интерактивной работы TTFT и доля перечитанных токенов информативнее средних «токенов в секунду»: они показывают, сколько пользователь ждёт первого ответа и сколько вычислений повторяется впустую. Почему TPS и TTFT расходятся по смыслу, разобрано в материале о метриках локальных моделей.

Приём 1. Спекулятивное декодирование через MTP/drafting (--spec, --mtp)

Схема простая. Черновой слой (MTP или отдельная draft-модель) предсказывает несколько токенов вперёд, а большая модель проверяет их за одно окно верификации. В Strata это включается как --spec N --mtp <путь>, где N задаёт, сколько предложенных токенов проверяется за окно.

Выигрыш по опыту автора: чаще 1.3-1.6x к скорости генерации, когда черновик угадывает хорошо. Код и повторяющиеся паттерны угадываются отлично, свободная проза хуже, и там множитель может просесть. Фиксированное ускорение обещать нельзя, всё зависит от того, насколько предсказуем ваш текст.

Цена по VRAM: черновой слой плюс буферы под предложенные токены. Немного на фоне весов экспертов, но на 8 ГБ каждый гигабайт на счету, особенно если параллельно хочется держать больше экспертов в видеопамяти. Практический вывод: включать почти бесплатно, если черновая модель уже скачана и влезает рядом; для кода и длинных технических рассуждений это первый кандидат на включение, для художественного текста проверяйте на своих промптах. Похожие компромиссы на другой конфигурации описаны в разборе ускорения MoE-инференса в llama.cpp на RTX 4080.

Приём 2. KV-кэш в pinned RAM и скользящее окно внимания (--kv-resident)

--kv-resident N держит в VRAM только скользящее окно внимания на N токенов, а весь KV-кэш целиком утекает в pinned RAM. На первый взгляд это должно замедлить работу, ведь внимание теперь читает часть данных не из видеопамяти.

Выигрыш приходит не от ускорения внимания. Освобождённая VRAM достаётся кэшу экспертов, а для MoE такой обмен почти всегда выгоднее: лишний гигабайт под резидентные эксперты срезает долю обращений к CPU и PCIe чаще, чем экономия на KV ускоряет сам attention. Проще говоря, вы меняете редкие операции внимания на частые чтения весов.

Проверка эффекта встроена в движок: в логе печатается доля expert cache N% hit. Сравните её до и после включения флага. Выросла и TTFT упал, значит обмен работает; не изменилась, значит либо N подобран неудачно, либо эксперты и так помещались.

Ограничения: pinned RAM нужно выделить заранее, объём N подбирается под задачу и длину контекста. На очень длинных контекстах окно внимания придётся расширять, и под эксперты останется меньше VRAM. Точка равновесия у каждого своя, поэтому один прогон на своих типичных запросах обязателен.

Приём 3. Continuous batching для нескольких параллельных запросов (--batch/--parallel)

--batch N включает continuous batching: несколько разговоров декодируются в общих окнах верификации, поэтому общие веса (dense-слои, общий эксперт) читаются один раз на всех, а не по разу на каждого. Этим режимом управляет пара флагов --batch/--parallel.

Честно о пределах на одной карте: throughput на одного пользователя скорее чуть падает, потому что кэш экспертов делится между запросами и доли попаданий размываются. Основной выигрыш в другом: никто не стоит в очереди, пока обслуживается сосед. На нескольких GPU с layer-split картина заметно интереснее, разбивка по слотам и случаи, когда --batch-groups важнее serial-режима, описаны в docs/BATCHING.md репозитория Strata.

Вывод: включать, если запросов реально несколько, будь то несколько агентов, фоновые задачи или небольшая команда. Для одиночного чата смысла почти нет: слоты забирают VRAM, а скорость одного пользователя не растёт.

Приём 4. Адаптивная резидентность экспертов: веса между VRAM, RAM и SSD

Кэш экспертов в Strata не статичен. Движок сам перекладывает веса между VRAM, RAM и SSD по частоте обращений и делает это прямо во время батч-окон, не останавливая генерацию. Настройка идёт через --adapt-every и связанные с ним параметры; полный синтаксис флага в исходном материале обрывается, так что сверяйтесь с документацией своей версии движка.

Для MoE это ключевой механизм. Горячие эксперты остаются в видеопамяти, редкие уезжают на диск, и расклад подстраивается под конкретный промпт и профиль нагрузки. Модель как бы учится на ваших запросах, не меняя весов.

Практика: смотреть в лог долю expert cache hit, менять частоту адаптации и наблюдать, как это отражается на TTFT и токенах в секунду. Разбор запуска Qwen3.8-Flash-Next на RTX 4090 с 64 ГБ RAM даёт ориентир по масштабу: попадание в кэш экспертов около 91% при бюджете 40 ГиБ в RAM. Это другая карта, другие кванты и другая скорость, но порядок величин полезен.

Ограничения: адаптация балансирует между стабильностью и реакцией на смену паттерна. Слишком частая перекладка съедает время на служебные операции, слишком редкая оставляет в VRAM мусорные эксперты. На SSD с медленным интерфейсом, например SATA, эффект будет скромнее, чем на NVMe.

Приём 5. Серверное автообнаружение общего префикса промпта (STRATA_AUTO_PREFIX=1)

Проблема знакомая: клиенты шлют запросы с общим началом, будь то системный промпт, инструкции или шаблон роли. Без кэша сервер перечитывает эти токены заново на каждом запросе и платит за это временем до первого токена.

Патч автора добавляет серверный слой, который находит общий префикс и сам подставляет границу кэширования. Включается переменной окружения STRATA_AUTO_PREFIX=1.

Как radix-trie находит общий префикс без участия клиента

Сервер строит дерево префиксов по поступающим промптам (radix-trie), находит самый длинный общий участок и ставит границу кэширования сам. Клиенту не нужно менять запросы или явно указывать, где заканчивается неизменная часть. Ручное указание границы кэша тоже работает, но требует дисциплины на стороне клиента и ломается, когда шаблон промпта поменяли в одном месте и забыли в другом.

Что показывают замеры и как их воспроизвести у себя

Цифры с одного железа: медиана перечитанных токенов 886 до патча и 468 после, токенов из кэша 0 и 413, TTFT 13,3 и 6,1 с. Автор разбора приводит их как результат собственного прогона, независимой проверки здесь нет, и на другой карте, модели или наборе промптов прирост будет другим.

Чек-лист проверки: включить STRATA_AUTO_PREFIX=1, прогнать типичный набор запросов с общим системным промптом, снять TTFT и долю перечитанных токенов до и после, сравнить медианы. Одиночный запрос ничего не покажет: кэш префикса раскрывается на серии.

Как выбрать приёмы под свой сценарий и не сломать VRAM-бюджет

Приёмы конкурируют за видеопамять. Гигабайт, освобождённый --kv-resident, уходит экспертам, а слоты батчинга и буферы чернового слоя забирают его обратно. Включать всё сразу и надеяться на суммарный эффект бессмысленно: вы не поймёте, что именно сработало.

СценарийЧто включатьЧто это даётЦена по VRAM
Одиночный чат, мало VRAM--kv-resident N, STRATA_AUTO_PREFIX=1Больше экспертов в VRAM, меньше перечитывания префиксаПочти нулевая, KV уходит в pinned RAM
Код и длинные технические задачи--spec N --mtpРост скорости генерации при хорошем угадывании черновикаЧерновой слой и буферы, немного
Несколько пользователей или агентов--batch N, --parallelНет очереди, общие веса читаются один раз на всехСлоты, заметно
Разнородные промпты, меняющийся профиль--adapt-everyРасклад экспертов подстраивается под нагрузкуПерераспределение, не рост
Сервис с общим системным промптомSTRATA_AUTO_PREFIX=1Ниже TTFT, меньше перечитанных токеновНулевая

Типичные ошибки выглядят предсказуемо. Первая: включить пять флагов и потом гадать, отчего стало медленнее. Вторая: ждать линейного ускорения, хотя каждый приём бьёт в своё узкое место. Третья: не смотреть в лог на долю expert cache hit, а судить по ощущениям от одного ответа модели.

Меняйте по одному параметру, фиксируйте TTFT на серии из десятка запросов и только потом добавляйте следующий. Такой цикл занимает вечер и даёт представление, какой приём реально работает на вашей карте и ваших промптах.

Ограничения, статус патча и что делать дальше

Все замеры получены на GTX 1070 с 8 ГБ VRAM, на Qwen3.8-Flash-Next и в Strata. Переносить их на другую конфигурацию без собственной проверки нельзя: другое соотношение VRAM и RAM, другая пропускная способность памяти, другой профиль экспертов.

Спекулятивное декодирование помогает не на всех типах текста, на свободной прозе выигрыш тает. Батчинг на одной карте не увеличивает throughput на пользователя, он убирает ожидание в очереди. --kv-resident требует выделенного pinned RAM и аккуратно подобранного N, иначе обмен становится невыгодным.

Отдельно про патч. Он предложен мейнтейнерам как issue, а не PR, то есть это предложение, а не гарантированно принятая функция. Рассчитывать на его наличие в апстриме не стоит, совместимость со своей версией Strata нужно проверять отдельно, а обновление движка может потребовать переноса изменений заново.

Начинать разумно с одного приёма: включить авто-префикс, если у вас сервис с общим системным промптом, либо проверить --kv-resident, если экспертам не хватает VRAM. Дальше смотреть TTFT и expert cache hit, оставлять то, что даёт выигрыш именно в вашем сценарии, и не тащить в конфиг флаги, эффект которых вы не измерили.

Подписаться на канал