azve · проект 04 экспериментальные сборки
ЛАБОРАТОРНЫЙ ЖУРНАЛ · WINDOWS ON SNAPDRAGON
131
CPU · 18 ядер
ток/с на обработке промпта
VS
670
NPU · HEXAGON HTP
та же модель, та же машина

В спецификациях ноутбука гордо указано: NPU, 45 TOPS. Запускаю llama.cpp — модель считает на центральном процессоре. Оказалось, Hexagon-бэкенд llama.cpp экспериментальный: чтобы он заработал, библиотеку нужно собрать, подписать и загрузить — а при любой проблеме он молча падает обратно на CPU. Ты бенчмаркаешь «NPU», а считает процессор, и об этом никто не сообщает. SnapLab — это журнал о том, как я это чинил: от первой неудачной сборки до 27-миллиардной модели, которая теперь каждый месяц обрабатывает 4 491 заявку на POStulat — и до проекта, который делает такие фолбэки невозможными.

# с чего началось, осень $ llama-server --model qwen3.8-27b WARN: hexagon backend unavailable → fallback: CPU # «недоступен». почему? где NPU? pp512: 131.2 t/s # 45 TOPS где-то рядом. бездельничают
ЖУРНАЛ ЭКСПЕРИМЕНТОВ

Семь записей о том, как оживает NPU

Порядок сохранён как в дневнике: с провалами, тупиками и моментом, когда всё наконец поехало. Каждый штамп — реальный результат записи.

exp.01неделя 1
«Соберу бэкенд как есть»

Клонирую llama.cpp, включаю Hexagon. Сборка падает: в experiments-ветке нет готовых прелоад-библиотек под Windows ARM64, SDK подтягивается фрагментами. Вывод: нужен воспроизводимый пайплайн сборки, а не «поставить вручную».

ПРОВАЛ
exp.02неделя 1–2
Пайплайн сборки

Скрипты, которые собирают бэкенд с нуля на чистой машине: версия SDK, переменные окружения, артефакты — всё зафиксировано. Сборка перестаёт быть лотереей и становится командой.

ОСНОВА
exp.03неделя 2
Подпись библиотек

Windows отказывается грузить неподписанные Hexagon-библиотеки в контекст NPU. Разбираюсь с кодовой подписью, встраиваю её в пайплайн. Теперь артефакт собирается и подписывается одной цепочкой.

ГОТОВО
exp.04неделя 3
Первый «успешный» прогон — и главный обман

Сервер поднялся, метрики красивые. Смотрю загрузку NPU — ноль. Бэкенд упал при загрузке контекста и тихо вернулся на CPU, не сказав ни слова. Этот вечер стал манифестом проекта: тихий фолбэк — это баг, а не режим работы.

ПОЙМАН ОБМАН
exp.05неделя 3–4
Честная детекция

Переписываю старт движка: он опрашивает Hexagon HTP и фиксирует результат явно. NPU найден и работает — флаг найден. Не найден — событие в логе и метрике, а не шёпот в stderr. Состояние движка стало наблюдаемым.

АРХИТЕКТУРА
exp.06неделя 4
670 ток/с

Первый честный прогон Qwen3.8-27B на HTP: обработка промпта — 670 ток/с против 131 на всех 18 ядрах CPU. Пять с лишним раз на той же машине, без облака и подписок. NPU в пике загружен под 95%+.

УСПЕХ
exp.07месяц 2 → ∞
Из эксперимента — в прод

Вокруг движка вырос шлюз: OpenAI-совместимый API на :8481, панель на :8140, очередь моделей, CPU-фолбэк через Ollama для эмбеддингов. К конвейеру POStulat подключён как обычный сервис — 4 491 заявка в месяц считает NPU ноутбука.

В ПРОДЕ
РЕЗУЛЬТАТЫ ЗАМЕРОВ

Что именно ускорилось

Синтетика extract-класса — длинный ввод, короткий вывод: профиль задач вроде суммаризации заявок, где промпт — это вся переписка, а ответ — одно предложение.

llama-bench · Qwen3.8-27B · Snapdragon X Elite CPU · 18 ядер 131 ток/с NPU · Hexagon HTP 670 ток/с · 5.1× tg128 · генерация CPU 9.4 NPU 14.8 ток/с 0170340510 ▸ обработка промпта: 5.1× ускорение Шлюз · OpenAI-совместимый POST /v1/chat/completions :8481 · панель :8140 ● qwen3.8-27b · htp ✓◐ bge-m3 · cpu Клиенты шлюза POStulat · 4 491 заявка/мес · 27B на NPU gpt-oss-20b MXFP4 · та же машина
ускорение там, где оно важно конвейеру: длинные промпты. шлюз делает NPU общей инфраструктурой

Манифест честности: движок обязан сообщать, на чём он реально считает. Если NPU недоступен — это событие с алертом, а не тихий переход на CPU, портящий ваши измерения. Вся ценность бенчмарка — в доверии к строке «NPU».

ИТОГ

Чем это уникально

Это не «ещё одна обёртка llama.cpp». Это воспроизводимая инфраструктура честного NPU-инференса на Windows ARM64: пайплайн сборки и подписи, детекция без тихих фолбэков, бенчмарки extract-профиля и шлюз, который превратил эксперимент в рабочую лошадку других проектов. Всё — в открытом коде.

670ток/с pp512 на NPU
5.1×к CPU на той же машине
>95%загрузка NPU в пике
4 491заявка в месяц через шлюз
ДВИЖОКllama.cpp · экспериментальный Hexagon HTP · патчи сборки
ИНФРАСТРУКТУРАпайплайн сборки + кодовая подпись библиотек · детекция HTP на старте
ШЛЮЗOpenAI-совместимый :8481 · панель :8140 · очередь моделей · CPU-фолбэк (Ollama)
МОДЕЛИQwen3.8-27B (прод) · gpt-oss-20b MXFP4 · bge-m3
КОДgithub.com/zveraua-dev/npu-llm-arm64 ↗