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

Qwen3.5 0.8B на CPU: тест кастомного движка H128/Q4-G32-DOT4 против llama.cpp и ik_llama.cpp

Практический разбор запуска Qwen3.5 0.8B на Ryzen 9 9955HX3D в Linux: кастомный CPU-движок с H128/Q4-G32-DOT4 показал до 2,9x по prefill и на 53% больший throug

Коротко

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

  1. 01

    Qwen3.5 0.8B на CPU: краткий вывод по тесту

  2. 02

    Как устроен тест: железо, движки и форматы весов

  3. 03

    Qwen3.5 0.8B: сравнение с llama.cpp и ik_llama.cpp

  4. 04

    Кастомный движок LLM на CPU и квантование H128/Q4-G32-DOT4

Кастомный C++-движок для Qwen3.5 0.8B показал до 2,9 раза более быстрый prefill и на 53% больший throughput в режиме decode batch 16 по сравнению с рассматриваемыми вариантами llama.cpp и ik_llama.cpp. Результат получен в конкретном эксперименте на Ryzen 9 9955HX3D под Linux, поэтому его нельзя переносить на любой CPU без повторной проверки.

Главный практический вывод зависит от режима нагрузки. Ускоренный prefill полезен при обработке длинного входного контекста, а прирост batch-16 throughput важен для параллельных и пакетных задач. Для интерактивной диктовки и локального помощника главным показателем остаётся decode batch 1, однако его абсолютные значения в доступном описании теста не приведены.

В эксперименте сравнивались кастомный формат H128/Q4-G32-DOT4 с активационной калибровкой, Unsloth Q4_0 и IQ4_KS_R4. Полные числа по perplexity, KL-дивергенции, размеру файлов и отдельным замерам каждого движка в переданных данных отсутствуют. Поэтому ниже сохранены только подтверждённые результаты, а пропуски явно обозначены вместо вымышленных значений.

Qwen3.5 0.8B на CPU: краткий вывод по тесту

Что именно выиграло в этом сравнении

Ускорение распределилось по режимам неравномерно:

  • Prefill: кастомный движок показал максимум до 2,9 раза относительно сравниваемых вариантов. Этот показатель описывает обработку уже готового входного текста: промпта, истории диалога, найденных фрагментов RAG или другого контекста.
  • Decode batch 1: числовые значения в описании эксперимента не указаны. Режим показывает скорость последовательной генерации одного ответа и обычно лучше отражает субъективную отзывчивость интерфейса.
  • Decode batch 16: заявлен прирост общего throughput на 53%. Такой результат полезен для одновременной обработки нескольких последовательностей, но он не означает автоматического ускорения одного запроса на 53%.

Связка H128/Q4-G32-DOT4 выглядит интересной для CPU-сценариев, где критичны обработка контекста и параллельная загрузка. Преимущество нельзя объяснить одной цифрой в названии кванта: на результат влияют формат хранения, код вычислений, компиляция, число потоков и характеристики самого процессора.

Кому результат будет полезен

Эксперимент имеет практический смысл для пользователя, у которого GPU занят другой задачей. Небольшая Qwen3.5 0.8B может обслуживать вспомогательный локальный инференс на CPU, пока видеокарта занята основной моделью, генерацией изображений или дообучением.

  • Локальная диктовка: модель может обрабатывать текст после распознавания речи, форматировать фразы или выполнять простые специализированные операции. Для такого сценария нужно смотреть на задержку старта, prefill и decode batch 1.
  • Вспомогательные AI-функции: классификация, нормализация текста, маршрутизация запросов и другие короткие операции можно вынести на CPU, если качество Qwen3.5 0.8B подходит под конкретную задачу.
  • Пакетные пайплайны: batch 16 лучше подходит для параллельной обработки нескольких запросов, где суммарная производительность важнее задержки одной последовательности.

Размер 0.8B ограничивает область применения модели. Высокая скорость CPU-инференса не доказывает пригодность для сложных рассуждений, длинных агентных цепочек или полноценного обучения. Компактные модели полезно оценивать по целевой задаче, а не по одному показателю tokens per second. Практический подход к такой оценке разобран в материале о компактных локальных LLM: как сравнивать компактные модели по скорости и качеству.

Как устроен тест: железо, движки и форматы весов

Конфигурация и условия воспроизводимости

Известная конфигурация эксперимента выглядит так:

ПараметрЗначение
Операционная системаLinux
ПроцессорAMD Ryzen 9 9955HX3D
МодельQwen3.5 0.8B
Основной вариантКастомный C++-движок
Квантизация основного вариантаH128/Q4-G32-DOT4
Сравниваемые движкиllama.cpp и ik_llama.cpp
Сравниваемые форматыUnsloth Q4_0 и IQ4_KS_R4
Режимы нагрузкиPrefill, decode batch 1, decode batch 16
Метрики качестваPerplexity и KL-дивергенция

В описании не указаны дистрибутив Linux, версия исходного кода, компилятор, флаги сборки, число потоков, настройки энергопотребления, частоты и температура CPU. Эти параметры способны заметно изменить итоговый CPU-бенчмарк. Для честного повтора нужно зафиксировать их в отчёте рядом с результатами.

Особенно внимательно стоит отнестись к SIMD-инструкциям и упаковке 4-битных данных. Проверка поддержки AVX2 и влияния таких инструкций на prompt processing требует отдельного замера, как показано в разборе AVX2 и CPU-инференса IQ-моделей.

Какие реализации и кванты сравниваются

Сравнение объединяет два уровня: программный движок и формат весов. Это важное различие. Если один запуск использует H128/Q4-G32-DOT4, а другой Unsloth Q4_0 или IQ4_KS_R4, итоговая разница отражает свойства всей связки, а не одного названия движка.

ДвижокФормат весовРежимыЧто можно сравнивать
Кастомный C++-движокH128/Q4-G32-DOT4, активационная калибровкаPrefill, decode batch 1, decode batch 16Скорость, качество и размер в сравнении с альтернативными связками
llama.cppUnsloth Q4_0 и IQ4_KS_R4Prefill, decode batch 1, decode batch 16Сравнение с кастомной связкой при одинаковой модели и сопоставимых настройках
ik_llama.cppUnsloth Q4_0 и IQ4_KS_R4Prefill, decode batch 1, decode batch 16Сравнение альтернативного CPU-движка и форматов

Переданные данные не уточняют, какой именно из двух сравнительных форматов использовался с каждым движком в конкретном замере. Поэтому нельзя приписывать преимущество исключительно llama.cpp, ik_llama.cpp, Unsloth Q4_0 или IQ4_KS_R4 без исходной таблицы эксперимента.

Qwen3.5 0.8B: сравнение с llama.cpp и ik_llama.cpp

Prefill: откуда берется выигрыш до 2,9x

Prefill обрабатывает входные токены до начала генерации. На практике он определяет, как быстро система примет длинный промпт и перейдёт к выдаче ответа. Это заметно в RAG, диалогах с большой историей, обработке документов и пакетах запросов с одинаковой структурой.

В рассматриваемом эксперименте максимум составил до 2,9 раза по сравнению с альтернативными вариантами. Формулировка «до» здесь принципиальна: она обозначает лучший зафиксированный режим, а не среднее ускорение для каждого размера контекста и каждого запуска.

МетрикаКастомный движокllama.cppik_llama.cppПодтверждённый вывод
PrefillДо 2,9x относительно сравниваемых вариантовАбсолютное значение не приведеноАбсолютное значение не приведеноМаксимальный заявленный выигрыш кастомной связки достигает 2,9 раза
Decode batch 1Число не приведеноЧисло не приведеноЧисло не приведеноПо имеющимся данным нельзя определить победителя
Decode batch 16На 53% выше throughput в заявленном сравненииАбсолютное значение не приведеноАбсолютное значение не приведеноПреимущество относится к суммарной параллельной производительности

Точную причину ускорения по одному описанию установить нельзя. Проверяемыми гипотезами остаются более подходящая упаковка 4-битных значений, меньший объём обмена с памятью, особенности матричных операций, распределение работы по потокам и использование CPU-инструкций. Для вывода о конкретной оптимизации нужны исходный код, профилирование и повторные замеры с одинаковым форматом весов.

Методика измерения prefill и decode требует раздельных сценариев. Общая скорость генерации может скрыть задержку обработки входа, а быстрый prefill не гарантирует такого же результата при последовательном decode. Об отличиях этих фаз и типичных ошибках сравнения подробно говорится в разборе честного теста локальных движков.

Decode batch 1: что увидит пользователь в интерактивном режиме

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

Для локальной диктовки важна вся цепочка: распознавание речи, передача текста в Qwen3.5 0.8B, обработка промпта и выдача результата. Если контекст короткий, абсолютный prefill может быть менее заметен, чем decode batch 1. При длинной истории диалога баланс меняется.

Числовые значения decode batch 1 для кастомного движка, llama.cpp и ik_llama.cpp в описании не приведены. Из-за этого нельзя корректно заявить, что H128/Q4-G32-DOT4 быстрее в интерактивном режиме. Такой вывод потребует отдельной таблицы с одинаковыми длиной контекста, числом потоков, температурой CPU и способом подсчёта токенов.

Decode batch 16: почему важен прирост throughput на 53%

Batch 16 объединяет 16 последовательностей или эквивалентную параллельную нагрузку, если именно так настроен тест. Throughput в этом режиме показывает, сколько токенов система способна обработать суммарно при высокой загрузке вычислительных блоков.

Заявленный прирост на 53% полезен для локального сервиса с несколькими пользователями, фоновой обработки очереди запросов, генерации вариантов текста и других пакетных задач. Он не превращается в равное снижение задержки каждого запроса. Планировщик, длина последовательностей, очередность выдачи и объём памяти могут изменить пользовательское ощущение скорости.

Для диктовки batch 16 часто вторичен: один человек обычно отправляет одну активную последовательность. Для серверного CPU, который одновременно обслуживает несколько коротких операций, показатель становится гораздо информативнее.

Кастомный движок LLM на CPU и квантование H128/Q4-G32-DOT4

Что означает H128/Q4-G32-DOT4

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

  • Q4: веса переводятся в 4-битное представление. Реальный средний размер элемента зависит от масштаба, служебных параметров и выравнивания.
  • G32: формат использует группировку с размером 32. Точная организация групп и связанных параметров в доступном описании не раскрыта.
  • H128: этот параметр входит в название формата, однако его точная функция и область группировки не указаны.
  • DOT4: обозначение относится к специальной 4-битной схеме кастомного движка. Семантика названия и конкретный алгоритм вычислений не описаны, поэтому приписывать ему определённый тип kernel нельзя.

Из этого следует практический вывод: H128/Q4-G32-DOT4 нельзя считать универсальным аналогом любого Q4-файла. Поддержка зависит от загрузчика и вычислительного кода кастомного C++-движка. Наличие обычных весов Q4_0 или IQ4_KS_R4 само по себе не гарантирует совместимость с этой схемой.

Зачем нужна калибровка по активациям

При калибровке по активациям параметры квантования выбирают с учётом того, как слои модели ведут себя на наборе входных данных. Такой подход помогает учитывать реальные диапазоны значений и различия между чувствительными и менее чувствительными участками сети.

Калибровка не даёт автоматической гарантии сохранения качества. Её результат нужно проверять по perplexity, KL-дивергенции и целевым пользовательским задачам. Если калибровочный набор плохо отражает будущие промпты, итоговая выгода может оказаться ограниченной.

Битность описывает способ хранения весов. Perplexity и KL-дивергенция показывают, какой ценой этот способ меняет поведение модели. Скорость и качество нужно оценивать вместе.

Цена ускорения: perplexity, KL-дивергенция и размер весов

Perplexity: базовая оценка потерь после квантования

Perplexity оценивает, насколько хорошо модель предсказывает токены на выбранном наборе данных. При сравнении квантований одной модели меньшая величина обычно указывает на меньшее отклонение в рамках конкретной проверки.

Метрика зависит от тестового корпуса, длины последовательностей, токенизатора и настроек оценки. Она не описывает все свойства генерации: стиль, следование инструкции, устойчивость к формату ответа и качество на рабочих промптах нужно проверять отдельно.

Числовые значения perplexity для H128/Q4-G32-DOT4, Unsloth Q4_0 и IQ4_KS_R4 в исходном описании отсутствуют. Поэтому сравнение качества по этой метрике нельзя свести к рейтингу форматов.

KL-дивергенция: насколько меняется распределение ответов

KL-дивергенция сравнивает распределения вероятностей двух вариантов модели. В контексте квантования она помогает увидеть, насколько выходное распределение изменилось относительно исходного или контрольного варианта.

Низкая или высокая величина сама по себе не задаёт универсальную границу пригодности. Для интерпретации нужно знать, с какой моделью сравнивали, на каких данных считали показатель и усредняли ли результат по токенам, слоям или последовательностям.

В доступных данных нет числовых значений KL-дивергенции и описания контрольной модели. Корректный вывод ограничивается тем, что автор эксперимента использовал эту метрику вместе с perplexity для оценки последствий калибровки.

Размер модели против скорости

4-битные веса уменьшают объём хранения по сравнению с полноточными вариантами, но размер файла нельзя вычислить по одной записи Q4. На итог влияют масштабы, метаданные, выравнивание и служебные буферы движка. Во время работы системе требуется дополнительная память для временных структур и контекста.

ФорматPerplexityKL-дивергенцияРазмер файла или весовЧто подтверждено
H128/Q4-G32-DOT4Не указаноНе указаноНе указано4-битный кастомный формат с активационной калибровкой
Unsloth Q4_0Не указаноНе указаноНе указаноСравнительный формат для альтернативных движков
IQ4_KS_R4Не указаноНе указаноНе указаноСравнительный формат для альтернативных движков

Без этих чисел нельзя оценить, насколько 2,9x по prefill и 53% по batch 16 оправдывают возможную разницу в качестве или размере весов. Практический критерий должен быть конкретным: если рабочая задача чувствительна к ответам, сначала сравниваются результаты на целевых промптах, затем измеряются скорость и потребление памяти.

Когда ik_llama.cpp Qwen3.5 и кастомный CPU-движок имеют смысл

Диктовка и другие интерактивные задачи

Для диктовки важна задержка всей цепочки, а не максимальный пакетный throughput. Если распознавание речи выполняет отдельная модель, Qwen3.5 0.8B может получать уже готовый текст и приводить его к нужному формату. Здесь нужно измерить время до первого результата и стабильную скорость decode batch 1.

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

GPU занят: зачем держать небольшую модель на CPU

CPU-инференс помогает развести нагрузки по разным ресурсам. GPU может обслуживать основную LLM или выполнять дообучение, а Qwen3.5 0.8B параллельно отвечает за вспомогательную функцию на процессоре.

Такой подход полезен, когда перенос небольшой задачи на GPU создаёт очередь, отнимает память или усложняет архитектуру локального сервиса. Он не означает, что CPU быстрее подходящей видеокарты. Ценность здесь связана с распределением ресурсов и независимостью вспомогательного процесса.

Пакетные и специализированные пайплайны

Прирост batch-16 throughput на 53% делает кастомный движок кандидатом для очередей коротких задач, параллельного форматирования текстов и локальных сервисов с несколькими одновременными запросами. Условие одно: качество Qwen3.5 0.8B должно соответствовать конкретной операции.

Специализированный пайплайн нужно проверять на собственных данных. Для классификации важна точность меток, для извлечения структуры, корректность JSON или другого формата, для маршрутизации, стабильность выбора. Скорость не компенсирует ошибки, если результат требует постоянной ручной проверки.

Как попробовать кастомный движок самостоятельно

Что потребуется для повторения эксперимента

Перед запуском нужно собрать четыре компонента:

  • Linux-среду и CPU, на котором доступна нужная сборка движка.
  • Qwen3.5 0.8B в варианте, совместимом с загрузчиком.
  • Веса H128/Q4-G32-DOT4 с активационной калибровкой либо подтверждённый способ получить их.
  • Исходники кастомного C++-движка, зависимости и инструкции сборки.

Переданные сведения не содержат адреса репозитория, версии кода, команд установки, списка зависимостей или ссылок на готовые веса. Поэтому безопасный способ повторения нельзя свести к универсальной команде. Нельзя предполагать, что кастомный формат загрузится в обычном llama.cpp или ik_llama.cpp.

Если исходники и веса доступны, сначала нужно проверить совместимость формата, затем собрать движок в Linux и запустить короткий smoke-тест. Только после проверки корректной генерации имеет смысл переходить к замерам.

Как не исказить собственное сравнение

  1. Зафиксировать одну версию модели Qwen3.5 0.8B и одинаковый токенизатор для всех запусков.
  2. Использовать одинаковую длину входного контекста и одинаковые тестовые тексты для prefill.
  3. Записать число потоков, параметры компилятора, флаги SIMD, режим энергопотребления и версию каждого движка.
  4. Разделить результаты на prefill, decode batch 1 и decode batch 16.
  5. Одинаково прогреть процесс, повторить замеры и описать способ подсчёта throughput.
  6. Отдельно измерить perplexity, KL-дивергенцию и размер файлов, не смешивая их со скоростью.
  7. Проверить качество на промптах диктовки, форматирования и других задачах, для которых модель планируется использовать.

Для сравнения CPU особенно важны модель процессора, число активных потоков и поддерживаемые инструкции. Результат Ryzen 9 9955HX3D показывает возможности этой конкретной платформы, а не универсальный рейтинг трёх движков.

Кому эксперимент лучше не повторять

  • Пользователям, которым нужна готовая установка без сборки C++-кода.
  • Тем, кому требуется широкий набор форматов и переносимость между Linux, Windows и macOS.
  • Командам, которым нужны воспроизводимые бинарные пакеты с зафиксированными версиями зависимостей.
  • Тем, кто не готов проверять качество Qwen3.5 0.8B на собственных данных.

Кастомный движок оправдан, когда конкретный CPU и рабочий сценарий действительно получают пользу от его формата. Для остальных важнее доступность сборки, совместимость и удобство обслуживания.

Итог: стоит ли пробовать этот движок

Краткая матрица выбора

ПриоритетРациональный вариантЧто проверить
Максимальный prefill на совместимом CPUКастомный движок H128/Q4-G32-DOT4Повторить длину контекста и убедиться, что выигрыш до 2,9x сохраняется
Параллельная обработкаКастомный движок как кандидат для batch 16Проверить, сохраняется ли прирост throughput на 53% на собственном CPU
Интерактивная диктовкаВариант с лучшим decode batch 1Получить абсолютные замеры задержки первого токена и последовательной генерации
Минимальные потери качестваФормат с лучшими perplexity и KL-дивергенциейСравнить значения на одном наборе данных и проверить целевые промпты
Простота запуска и переносимостьДвижок с доступными сборками и нужным форматомПроверить платформы, версии, зависимости и загрузку весов

Что проверить перед окончательным переходом

  1. Сравнить кастомный движок, llama.cpp и ik_llama.cpp на своём CPU с одинаковым числом потоков.
  2. Повторить prefill на длине контекста, которая встречается в реальных запросах.
  3. Отдельно измерить decode batch 1 для диктовки и decode batch 16 для параллельной нагрузки.
  4. Сопоставить perplexity и KL-дивергенцию, если доступны одинаковые методика и контрольная модель.
  5. Проверить размер файлов, потребление RAM, время загрузки и наличие служебных буферов.
  6. Прогнать целевые промпты и убедиться, что Qwen3.5 0.8B выдаёт приемлемый формат и уровень точности.

Кастомный движок стоит рассматривать, если приоритетом служат CPU-prefill и batch-16 throughput на совместимой Linux-системе, а исходники и H128/Q4-G32-DOT4 доступны для запуска. Для интерактивной работы решение нельзя выбирать по результату batch 16: сначала нужны замеры batch 1. Perplexity, KL-дивергенция и размер весов определят цену ускорения, но окончательное решение принимается по задачам пользователя.

Эксперимент на Ryzen 9 9955HX3D показывает перспективный вариант для локального CPU-инференса Qwen3.5 0.8B. Он не заменяет полноценный рейтинг llama.cpp, ik_llama.cpp и всех процессоров. Это повод повторить тест на своей системе и проверить, совпадает ли выигрыш с реальной нагрузкой.

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