Короткий ответ. Compact Rollback MTP в llama.cpp сокращает объем состояний, которые speculative decoding хранит для отката при проверке draft-токенов. Это может высвободить VRAM под KV-кэш и рабочий контекст, что особенно интересно для Qwen 27B и других плотных моделей на видеокартах с 16 ГБ памяти.
В speculative decoding draft-механизм предлагает несколько следующих токенов, а основная модель проверяет их. Принятые токены сохраняются, несовпавшая часть требует возврата к корректному состоянию. Compact Rollback MTP меняет именно этот участок: глубина rollback ограничивается настройкой --spec-mtp-cr-depth, поэтому память расходуется экономнее, но компромисс между длиной draft-последовательности, контекстом и скоростью становится заметнее.
Гарантированного ускорения для любой модели здесь нет. Результат зависит от качества draft-модели или MTP-компонента, acceptance rate, версии llama.cpp, backend, квантизации, offload и характера запросов. На практике подход стоит оценивать как способ удержать крупную модель и длинную сессию в пределах 16 ГБ VRAM, а затем измерять влияние на latency, throughput и качество ответа.
Короткий ответ: что Compact Rollback MTP меняет в llama.cpp
Обычный speculative decoding ускоряет генерацию, когда основная модель часто принимает токены, предложенные draft-частью. Для проверки нескольких кандидатов движку нужно хранить служебные состояния, чтобы при несовпадении продолжить расчет с корректной позиции. Compact Rollback MTP уменьшает объем такого резерва через ограничение глубины или количества rollback-состояний, доступное в конкретной сборке llama.cpp.
Экономия памяти дает несколько вариантов настройки. Свободную VRAM можно направить на более длинный KV-кэш, оставить запас под рабочие операции или уменьшить число слоев, вынесенных в RAM. Скорость при этом может вырасти, остаться прежней или снизиться: все решает соотношение между принятыми и отклоненными draft-токенами.
Какой компромисс приходится выбирать на 16 ГБ VRAM
У владельца видеокарты с 16 ГБ VRAM один ограниченный ресурс делят сразу несколько компонентов:
- веса Qwen 27B в выбранном GGUF-кванте;
- KV-кэш, размер которого растет вместе с контекстом и batch-настройками;
- draft-модель или MTP-компонент;
- rollback-состояния и временные буферы backend;
- резерв памяти под вычисления, загрузку данных и служебные операции.
Размер файла модели на диске не дает точного ответа, поместится ли запуск в VRAM. На итог влияют тип квантизации, число слоев на GPU, размер контекста, batch и ubatch, устройство KV-кэша, offload и особенности сборки. Даже несколько сотен мегабайт свободной памяти могут определить, завершится ли длинный запрос без ошибки нехватки VRAM.
Полезно разделять две цели. Первая, получить больше свободной памяти и удержать контекст, например 16 или 32 тысячи токенов в конкретной конфигурации. Вторая, получить меньшую задержку генерации. Compact Rollback MTP напрямую помогает с первой целью, а вторую улучшает только при приемлемом acceptance rate.
Почему это не универсальный ускоритель
Speculative decoding окупается, когда draft-предложения хорошо совпадают с продолжением основной модели. На шаблонном коде, повторяющихся форматах и предсказуемом структурированном выводе acceptance rate может быть выше. При открытом проектировании решения, длинном рассуждении или резкой смене темы совпадений часто меньше.
На итог влияют пять факторов:
- качество и совместимость draft-компонента;
- среднее число принятых токенов за speculative-шаг;
- верхняя граница draft-последовательности;
- доступный запас VRAM после загрузки модели и KV-кэша;
- конкретная версия llama.cpp и поддержка флагов в ней.
Если draft-токены часто отклоняются, большая цепочка кандидатов добавляет вычисления без пропорционального выигрыша. Если rollback-резерв слишком велик, память уходит на служебные состояния вместо контекста. Поэтому Compact Rollback MTP требует измерений на собственных запросах.
Как работает Compact Rollback MTP внутри speculative decoding
Зачем нужны rollback-состояния
Speculative decoding разбивает генерацию на повторяющиеся speculative-шаги. Упрощенный цикл выглядит так:
- draft-модель или MTP-компонент предлагает последовательность следующих токенов;
- основная модель проверяет кандидатов своим вычислительным путем;
- совпавшая часть добавляется в контекст;
- при первом несовпадении движок отбрасывает некорректное продолжение и продолжает расчет с принятой позиции.
Чтобы выполнить третий и четвертый шаг, системе требуется сохранить промежуточное состояние. Оно связано с KV-кэшем и другими рабочими данными, которые нужны для возврата к позиции перед отклоненным продолжением. Чем больше потенциальная глубина проверки, тем больше служебный резерв может понадобиться.
Rollback не означает откат всей модели или перезагрузку весов. Речь идет о состоянии текущего вычислительного шага. Точный набор данных, который сохраняет llama.cpp, зависит от реализации MTP, backend и версии исходного кода.
Что означает compact rollback
Compact Rollback MTP ограничивает глубину rollback-состояний. Это можно представить как сокращение числа точек, к которым движок готов быстро вернуться во время проверки draft-цепочки. Меньший резерв потенциально снижает расход VRAM, но одновременно уменьшает пространство для отката при длинной последовательности кандидатов.
Название не означает сжатие всех весов Qwen или автоматическое квантование KV-кэша. Настройка касается служебного состояния speculative-механизма. Она не заменяет выбор GGUF, настройку KV-кэша, распределение слоев и подбор draft-компонента.
Семантику глубины нужно сверять с --help конкретной сборки. Если параметр напрямую задает число rollback-уровней, уменьшение значения обычно снижает резерв памяти, а увеличение оставляет движку больше возможностей для отката. Реальная граница и поведение при крайних значениях зависят от используемой реализации.
Связь rollback, draft-токенов и контекста
В настройке участвуют три разных измерения:
| Измерение | Что описывает | На что влияет |
|---|---|---|
| Пользовательский контекст | Историю диалога, документы, файлы и инструкции | Размер KV-кэша и возможность продолжать длинную сессию |
| Draft-токены | Число кандидатов, предложенных за один speculative-шаг | Потенциальное ускорение и объем проверки |
| Rollback-состояния | Резерв для возврата при отклонении кандидатов | Расход VRAM и доступная глубина отката |
Большой контекст не равен длинной draft-цепочке. Можно хранить много токенов истории и проверять короткие speculative-последовательности. Можно задать высокий draft-лимит, но получить низкое среднее число принятых токенов. Compact Rollback MTP связывает эти параметры через память, однако не подменяет их.
Qwen 27B на 16 ГБ VRAM: где находится практический выигрыш
Что нужно учитывать кроме размера модели
Qwen 27B относится к плотным моделям, поэтому при каждом токене вычислительная нагрузка приходится на весь набор активных параметров. Для запуска на 16 ГБ VRAM приходится распределять память между весами и динамическими структурами. Главные переменные выглядят так:
- Квантизация весов. Более компактный квант освобождает память, но может менять качество кода, устойчивость длинных ответов и требования к backend.
- Распределение слоев. Часть слоев можно оставить на GPU, а часть перенести в системную RAM, если это поддерживает выбранный запуск. Такой компромисс обычно влияет на скорость.
- KV-кэш. При росте контекста он занимает все больше памяти. Его формат и параметры
ctkилиctvнужно учитывать отдельно от веса модели. - Batch и ubatch. Эти параметры влияют на рабочую память и пропускную способность, особенно при обработке длинного промпта.
- Draft-компонент. Ускорение требует дополнительного вычислительного пути и собственного резерва памяти.
- Backend. CUDA, Vulkan и другие варианты могут по-разному распределять буферы и поддерживать флаги speculative decoding.
Практический разбор запуска Qwen 3.8 27B на 24 ГБ VRAM показывает, почему контекст, batch, MTP и формат KV-кэша нужно настраивать как единую систему. Эти параметры нельзя механически переносить на видеокарту с 16 ГБ, но материал полезен как карта взаимосвязей: разбор конфигурации llama.cpp для Qwen 27B.
Когда экономия VRAM полезнее максимальной скорости
Для короткого диалога на несколько сотен токенов дефицит VRAM может почти не проявляться. В такой ситуации дополнительные параметры усложняют запуск, а выигрыш стоит проверять по задержке первого токена и скорости decode.
В длинной сессии приоритет меняется. Пользователь загружает несколько файлов, сохраняет историю обсуждения, просит внести правки и затем анализирует результат. Если rollback-резерв занимает память, которая нужна KV-кэшу, Compact Rollback MTP может оказаться полезным даже при небольшом изменении tokens/s. Сохраненная сессия без ошибки OOM ценнее номинального максимума скорости.
Для сравнения можно заранее выбрать три целевых профиля: короткий контекст 8 тысяч токенов, средний 16 тысяч и длинный 32 тысячи. Это не обещание, что каждый профиль поместится в конкретной конфигурации. Такой набор помогает увидеть, на каком уровне памяти запускается каждая комбинация.
Какие параметры нельзя переносить между моделями вслепую
Одинаковое значение --spec-mtp-cr-depth может вести себя по-разному с разными MTP-компонентами. На результат влияют архитектура модели, размер и качество draft-части, формат KV-кэша, число слоев на GPU и тип запроса. Значение, подходящее для одного Qwen-сборки, не превращается в универсальный пресет для другой.
То же касается квантизации. Слишком низкий квант может освободить VRAM, но ухудшить код и длинные ответы. В разборе низких квантов Qwen 3.8 27B этот компромисс рассматривается через качество, offload и практические сценарии, поэтому его полезно учитывать вместе с rollback-настройкой.
Перед переносом чужой команды проверьте три вещи: версия llama.cpp, вывод llama-cli --help и фактическую доступность MTP-функций в GGUF. Если сборка не знает нужный флаг, изменение командной строки не добавит поддержку.
Три ключевых флага: --spec-mtp-cr-depth, --spec-draft-adaptive и --spec-draft-n-max
--spec-mtp-cr-depth: глубина compact rollback
--spec-mtp-cr-depth управляет глубиной Compact Rollback MTP в тех сборках, где функция доступна. По смыслу параметр задает, сколько rollback-уровней или какой объем rollback-структуры может использовать MTP-механизм. Точную трактовку нужно проверить в справке и исходном коде своей версии.
Изменение параметра стоит начинать с небольшого набора значений, разрешенных help. Для каждого варианта фиксируйте пиковую VRAM, tokens/s, acceptance rate, частоту ошибок памяти и качество ответа. Увеличение глубины может оставить больше возможностей для отката, но потребовать дополнительную память. Уменьшение способно освободить VRAM, однако может ограничить поведение длинной draft-последовательности.
Сравнивать глубину нужно при одинаковых контексте, квантизации, batch, draft-компоненте и запросах. Иначе изменение скорости нельзя будет связать именно с rollback.
--spec-draft-n-max: верхняя граница draft-последовательности
--spec-draft-n-max задает верхний предел числа draft-токенов или длины speculative-кандидатов в соответствии с реализацией конкретной сборки. Высокое значение дает механизму больше пространства для принятия нескольких токенов за один шаг. Это преимущество проявляется только при хорошем совпадении draft- и основной модели.
Большой лимит может увеличить рабочий резерв, время проверки и стоимость неудачного speculative-шагa. При низком acceptance rate часть вычислений будет потрачена на кандидатов, которые основная модель отклонит. Малый лимит снижает потенциальную длину принятого фрагмента, зато чаще сохраняет предсказуемое потребление ресурсов.
Верхняя граница не гарантирует, что движок каждый раз сформирует именно столько кандидатов. Фактическое число зависит от текущего состояния генерации, остановок, качества draft-предложения и логики adaptive режима.
--spec-draft-adaptive: зачем нужен адаптивный режим
--spec-draft-adaptive включает адаптацию draft-лимита, если такая логика присутствует в используемой сборке. Идея режима состоит в том, чтобы не держать одно и то же число кандидатов для всех участков ответа. Верхней границей при этом служит --spec-draft-n-max.
Адаптивный режим полезен при неоднородной нагрузке. В одном запросе может идти предсказуемый блок кода, затем пояснение человеческим языком, потом JSON с жесткой структурой. Один фиксированный лимит не обязательно подходит всем трем фрагментам.
Точную логику изменения лимита нельзя выводить только из названия флага. Сборки могут использовать разные критерии, пороги и правила возврата к меньшей или большей длине. Проверьте описание опции в help и сопоставьте его с логами запуска.
Как читать комбинацию трех параметров
Три флага решают разные задачи:
--spec-mtp-cr-depthрегулирует rollback-резерв;--spec-draft-n-maxограничивает максимальную длину draft-кандидатов;--spec-draft-adaptiveразрешает адаптивно менять draft-лимит в заданном потолке.
Практический порядок такой: сначала подтвердите поддержку всех опций, затем выберите безопасную глубину rollback, после этого задайте верхний draft-лимит и сравните фиксированный режим с adaptive. Меняйте одну переменную за раз.
llama-cli --model model.gguf --spec-mtp-cr-depth N --spec-draft-n-max M --spec-draft-adaptive
Это шаблон команды, а не готовый пресет. Имена модели, параметры контекста, offload, batch и подключение draft-компонента зависят от конкретной конфигурации. Значения N и M нужно заменить на варианты, которые принимает ваша сборка.
Адаптивный draft-лимит: как связать его с acceptance rate
Что именно измерять при включении adaptive режима
Субъективное ощущение скорости недостаточно. Для каждого запуска запишите одну и ту же группу метрик:
| Метрика | Как фиксировать | Зачем нужна |
|---|---|---|
| Acceptance rate | Принятые draft-токены, деленные на предложенные, умножить на 100% | Показывает, насколько часто speculative-работа окупается |
| Среднее число принятых токенов | Среднее по speculative-шагам | Показывает реальный размер ускоренного фрагмента |
| Tokens/s | Отдельно для decode, если это доступно в выводе | Позволяет сравнить пропускную способность |
| Latency | Задержка первого токена и время полного ответа | Отделяет интерактивность от общей скорости |
| Пиковая VRAM | Максимальное значение во время загрузки и генерации | Показывает запас до OOM |
| Качество | Корректность кода, валидность структуры, следование инструкции | Не дает считать ускорением ухудшение результата |
Acceptance rate удобно записывать как отдельное число для каждого типа нагрузки. Например, условные 70% означают, что большая часть предложенных токенов принята, но не говорят сами по себе о приросте tokens/s. На итог влияют стоимость draft-прохода, проверка основной моделью и задержки обмена данными.
Почему один и тот же лимит ведет себя по-разному на коде и тексте
Код содержит повторяющиеся конструкции, ключевые слова и шаблоны отступов. Это может сделать продолжение более предсказуемым для совместимого draft-компонента. При проектировании нового интерфейса или исправлении сложной ошибки следующий токен зависит от большего числа решений, поэтому acceptance rate может измениться.
Обычный диалог добавляет еще один профиль: короткие фразы, смена темы, цитаты пользователя и неодинаковая длина ответов. Структурированный JSON может давать хорошие серии совпадений внутри схемы, но ломаться при генерации длинных строковых значений.
Для честного сравнения подготовьте минимум три группы запросов:
- продолжение и исправление кода;
- объяснение большого фрагмента или нескольких файлов;
- смешанный диалог с текстом, кодом и структурированным выводом.
Как подобрать верхнюю границу без лишнего перебора
Начните с консервативного значения, которое оставляет запас VRAM после загрузки модели и KV-кэша. Затем увеличивайте --spec-draft-n-max небольшими шагами. Если help сборки допускает такие значения, в качестве экспериментальных точек можно взять 4, 8 и 16, но эти числа не служат универсальной рекомендацией.
Остановите перебор, когда рост лимита не дает устойчивого улучшения tokens/s или увеличивает время полного ответа, пиковую VRAM и число отклоненных кандидатов. Для adaptive режима сравнивайте тот же потолок с фиксированным ограничением. Иначе разница может объясняться самим изменением верхней границы.
Для каких задач Compact Rollback MTP имеет смысл
Кодинг и работа с большими файлами
При работе с репозиторием приходится держать в контексте исходники, diff, требования и предыдущие решения. Qwen 27B на 16 ГБ VRAM может упереться в память еще до того, как пользователь получит полезный ответ, особенно при включенном speculative-механизме и большом KV-кэше.
Compact Rollback MTP стоит проверить в четырех задачах:
- продолжение типового кода;
- поиск ошибки в нескольких связанных файлах;
- генерация патча по четкому техническому заданию;
- объяснение изменений с сохранением длинной истории.
В первых и третьих задачах draft-предложения могут быть более предсказуемыми. Открытое проектирование архитектуры и анализ неоднозначной ошибки требуют отдельного замера.
Смешанные сессии: код, объяснения и структурированный вывод
Смешанная сессия меняет профиль нагрузки прямо во время одного диалога. Пользователь просит написать функцию, затем объяснить компромисс, вывести JSON, проверить тесты и снова отредактировать код. Adaptive режим может быть удобнее фиксированного лимита, если его правила корректно реагируют на такие переходы.
В этом сценарии оценивайте не среднюю скорость одного длинного ответа, а несколько коротких запросов подряд. Запишите задержку первого токена, полное время каждого ответа и acceptance rate для каждого типа вывода. Среднее значение по всей сессии может скрыть провал на одной важной операции.
Когда лучше оставить базовую конфигурацию
Дополнительные параметры не оправданы, если:
- контекст короткий и свободной VRAM достаточно;
- draft-компонент редко получает принятые токены;
- сборка нестабильно поддерживает нужные флаги;
- изменение не дает повторяемого выигрыша на рабочих запросах;
- приоритетом служит простота запуска, а не максимальная плотность настроек.
Базовая конфигурация полезна как контрольная точка. Без нее невозможно определить, принес ли Compact Rollback MTP пользу или лишь добавил переменные.
Как сравнить конфигурации llama.cpp на своей системе
Базовая линия перед включением Compact Rollback MTP
Сначала зафиксируйте обычный запуск без изменяемых параметров либо исходную конфигурацию проекта. Запишите:
- точную версию llama.cpp и название backend;
- файл модели и уровень квантизации;
- число слоев на GPU и параметры offload;
- размер контекста, batch и ubatch;
- формат KV-кэша;
- draft-компонент, если он уже используется;
- пиковую VRAM, latency, tokens/s и ошибки.
Для каждого прогона используйте одинаковый промпт и одинаковое состояние контекста. После изменения конфигурации перезапускайте процесс, чтобы остаточные данные и прогрев не смешивали результаты.
Порядок изменения параметров
Разделите эксперимент на три серии:
- измените только
--spec-mtp-cr-depthи выберите вариант с приемлемым запасом памяти; - при зафиксированной глубине сравните несколько значений
--spec-draft-n-max; - при той же верхней границе сопоставьте фиксированный режим с
--spec-draft-adaptive.
Для каждого варианта полезно сделать несколько повторов на одном запросе и затем проверить другие профили. Минимальный набор должен включать код, длинное объяснение и смешанный вывод. Если улучшение проявляется только на одном типе ответа, это нужно указать в результате.
Методику сравнения локального запуска Qwen, включая разделение prefill и decode, можно использовать как ориентир при оформлении собственных измерений: разбор честного сравнения локального запуска Qwen 27B. Конкретные цифры из одной видеокарты нельзя переносить на систему с 16 ГБ VRAM.
Как оформить результат без выдуманных бенчмарков
Если собственных замеров нет, публикуйте протокол, а не придуманные цифры. Таблица может выглядеть так:
| Конфигурация | CR depth | Adaptive | Draft n-max | Пиковая VRAM | Tokens/s | Latency | Acceptance rate | Качество |
|---|---|---|---|---|---|---|---|---|
| Базовая | - | нет | - | заполнить | заполнить | заполнить | заполнить | заполнить |
| Compact Rollback | значение | нет | значение | заполнить | заполнить | заполнить | заполнить | заполнить |
| Compact Rollback Adaptive | значение | да | значение | заполнить | заполнить | заполнить | заполнить | заполнить |
В выводах указывайте модель, квант, контекст, backend и тип запросов. Формулировка ускорилось на моей конфигурации точнее, чем обещание ускоряет Qwen вообще. Такой подход сохраняет проверяемость и помогает читателю повторить эксперимент.
Ограничения и вывод: это инструмент тонкой настройки, а не готовый пресет
Что может ограничить выигрыш
Ожидаемый эффект может оказаться небольшим или исчезнуть по нескольким причинам:
- draft-модель плохо совпадает с основной Qwen;
- acceptance rate низкий на рабочих запросах;
--spec-draft-n-maxслишком велик для выбранного профиля;- после загрузки модели и KV-кэша почти не остается VRAM;
- backend по-своему распределяет rollback-буферы;
- флаги отсутствуют или работают иначе в конкретной версии llama.cpp;
- снижение rollback-глубины меняет поведение длинных speculative-шагов.
Отдельно проверяйте качество ответа. Экономия VRAM не компенсирует ошибки в коде, сломанный JSON или потерю части инструкции. Для локальной LLM важен результат всей операции, включая время подготовки промпта, генерацию и проверку ответа.
Кому стоит попробовать Compact Rollback MTP
Подход логично проверить пользователям, которые запускают Qwen 27B или сопоставимую плотную модель на 16 ГБ VRAM, хотят сохранить длинный контекст и готовы измерять собственные запросы. Он особенно уместен при кодинге, работе с несколькими файлами и смешанных сессиях, где свободная память ценнее небольшого теоретического максимума tokens/s.
Если основная задача состоит из коротких ответов, а VRAM не ограничивает запуск, базовая конфигурация может дать сопоставимый практический результат с меньшим числом переменных. Настройка оправдана только при воспроизводимом улучшении по нужной метрике.
Короткий чек-лист перед запуском
- Проверьте версию llama.cpp и наличие трех флагов в выводе help.
- Запишите модель, квантизацию, backend, offload, контекст, batch и формат KV-кэша.
- Определите, какой draft-компонент используется и насколько он совместим с основной моделью.
- Снимите базовые значения VRAM, latency, tokens/s, acceptance rate и качества ответа.
- Сначала изменяйте
--spec-mtp-cr-depth, затем--spec-draft-n-max, после этого включайте adaptive режим. - Сравните короткий код, длинный контекст и смешанную сессию на одинаковых промптах.
- Оставьте конфигурацию, которая дает лучший баланс VRAM, latency, throughput, acceptance rate и качества.
Compact Rollback MTP подходит для точной настройки памяти в speculative decoding. Для Qwen 27B на 16 ГБ VRAM он может освободить место под контекст и снизить риск нехватки памяти, но итог зависит от всей цепочки запуска. Проверяйте не название режима, а измеримый результат на своих моделях и задачах.