В спецификациях ноутбука гордо указано: NPU, 45 TOPS. Запускаю llama.cpp — модель считает на центральном процессоре. Оказалось, Hexagon-бэкенд llama.cpp экспериментальный: чтобы он заработал, библиотеку нужно собрать, подписать и загрузить — а при любой проблеме он молча падает обратно на CPU. Ты бенчмаркаешь «NPU», а считает процессор, и об этом никто не сообщает. SnapLab — это журнал о том, как я это чинил: от первой неудачной сборки до 27-миллиардной модели, которая теперь каждый месяц обрабатывает 4 491 заявку на POStulat — и до проекта, который делает такие фолбэки невозможными.
Порядок сохранён как в дневнике: с провалами, тупиками и моментом, когда всё наконец поехало. Каждый штамп — реальный результат записи.
Клонирую llama.cpp, включаю Hexagon. Сборка падает: в experiments-ветке нет готовых прелоад-библиотек под Windows ARM64, SDK подтягивается фрагментами. Вывод: нужен воспроизводимый пайплайн сборки, а не «поставить вручную».
Скрипты, которые собирают бэкенд с нуля на чистой машине: версия SDK, переменные окружения, артефакты — всё зафиксировано. Сборка перестаёт быть лотереей и становится командой.
Windows отказывается грузить неподписанные Hexagon-библиотеки в контекст NPU. Разбираюсь с кодовой подписью, встраиваю её в пайплайн. Теперь артефакт собирается и подписывается одной цепочкой.
Сервер поднялся, метрики красивые. Смотрю загрузку NPU — ноль. Бэкенд упал при загрузке контекста и тихо вернулся на CPU, не сказав ни слова. Этот вечер стал манифестом проекта: тихий фолбэк — это баг, а не режим работы.
Переписываю старт движка: он опрашивает Hexagon HTP и фиксирует результат явно. NPU найден и работает — флаг найден. Не найден — событие в логе и метрике, а не шёпот в stderr. Состояние движка стало наблюдаемым.
Первый честный прогон Qwen3.8-27B на HTP: обработка промпта — 670 ток/с против 131 на всех 18 ядрах CPU. Пять с лишним раз на той же машине, без облака и подписок. NPU в пике загружен под 95%+.
Вокруг движка вырос шлюз: OpenAI-совместимый API на :8481, панель на :8140, очередь моделей, CPU-фолбэк через Ollama для эмбеддингов. К конвейеру POStulat подключён как обычный сервис — 4 491 заявка в месяц считает NPU ноутбука.
Синтетика extract-класса — длинный ввод, короткий вывод: профиль задач вроде суммаризации заявок, где промпт — это вся переписка, а ответ — одно предложение.
Манифест честности: движок обязан сообщать, на чём он реально считает. Если NPU недоступен — это событие с алертом, а не тихий переход на CPU, портящий ваши измерения. Вся ценность бенчмарка — в доверии к строке «NPU».
Это не «ещё одна обёртка llama.cpp». Это воспроизводимая инфраструктура честного NPU-инференса на Windows ARM64: пайплайн сборки и подписи, детекция без тихих фолбэков, бенчмарки extract-профиля и шлюз, который превратил эксперимент в рабочую лошадку других проектов. Всё — в открытом коде.
| ДВИЖОК | 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 ↗ |