Смартфон как нейронка: почему мы ждали этого 3 года
В 2023 любой техногик со Snapdragon 888 мечтал запустить LLM локально. И запускал — через llama.cpp, на CPU, по 3 токена в секунду. Мучительно, но факт. NPU тогда простаивали: у Qualcomm был Hexagon, у MediaTek — APU, у Exynos — NPU. Но софт не дружил с железом. В 2025 ситуация начала меняться: появились обёртки вроде MLC-LLM и ExecuTorch, которые научились выгружать матричные умножения на GPU/NPU. Но это было либо всё на GPU, либо всё на CPU. Гибрид — когда часть слоёв (например, эмбеддинги и softmax) остаётся на CPU, а тяжёлая линейная алгебра летит на NPU — до недавнего времени оставался уделом прототипов.
Май 2026: на GitHub выкладывают первую рабочую сборку, где llama.cpp договаривается с LiteRT (бывший TensorFlow Lite) через кастомный бэкенд. NPU реально используется — и это не хак, а осознанный гибридный пайплайн. Соберём всё, что известно на данный момент.
Анатомия гибрида: как заставить два движка работать на одном телефоне
Идея до безобразия проста: берём llama.cpp — он умеет загружать GGUF-модели и делать инференс на CPU (с опциональным GPU через Vulkan). Но современные чипы имеют выделенный NPU, который через NNAPI или QNN SDK может обрабатывать тензоры в INT8 с аппаратной поддержкой. Проблема: llama.cpp не умеет напрямую дёргать NNAPI. Выход — вшивать LiteRT как прослойку.
Логика: llama.cpp парсит модель, определяет, какие операции можно перенести на NPU (matmul, конволюции, некоторые нормализации). Для этого используется llama_model_quantize с калибровкой под INT8. Эти слои вырезаются из оригинального графа и передаются LiteRT, который уже через NNAPI делегат шлёт их на NPU. CPU при этом берёт на себя всё остальное: эмбеддинги, RoPE, softmax, семплинг. Получается симбиоз — CPU не простаивает, NPU делает то, что умеет лучше всего.
Кому это надо? Только фанатам офлайна?
Нет. Использование NPU вместо CPU даёт выигрыш в производительности в 2-4 раза. На Snapdragon 8 Gen 3 (2024) модель Phi-3-mini (3.8B) в гибридном режиме выдаёт 12-15 токенов/с против 4-5 на CPU. На Snapdragon X Elite (ноутбучный чип) — ещё лучше. Но главное — энергопотребление: NPU съедает 1-2 Вт против 5-7 Вт у CPU. Телефон меньше греется, батарея живёт дольше. Идеально для офлайн-ассистентов, которые работают весь день.
Альтернативы? MLC-LLM использует TVM унификацию и может работать на GPU/NPU через OpenCL/Metal/Vulkan. Но он монолитен: или всё на GPU, или ничего. ExecuTorch от Meta — более гибкий: позволяет подключать backend под каждую операцию. Но порог входа выше, и экосистема моделей беднее. Наш гибрид llama.cpp+LiteRT — палка о двух концах: сложно настраивать, но даёт максимальный контроль.
| Решение | Поддержка NPU | Гибрид CPU+NPU | Формат моделей | Простота настройки |
|---|---|---|---|---|
| llama.cpp + LiteRT (гибрид) | Да (NNAPI) | Да | GGUF | Средняя |
| MLC-LLM | Да (через TVM) | Нет | MLC | Высокая |
| ExecuTorch | Да (через delegates) | Да | TorchScript, ExecuTorch | Низкая |
| Чистый llama.cpp GPU (Vulkan) | Нет (только GPU) | Нет | GGUF | Высокая |
Первые шаги: как это выглядит в деле
Сборка — не для слабонервных. Нужен Android NDK r27+, CMake, и два репозитория: llama.cpp с веткой hybrid-lite (пока не слито в мастер) и LiteRT из исходников с флагом -DTFLITE_ENABLE_NNAPI=ON. Компилируем общую библиотеку libllama-hybrid.so. На выходе — бинарник llama-hybrid-cli, который принимает GGUF модель и путь к конфигу распределения слоёв (YAML).
Пример конфига:
layers:
- range: 0-4
device: npu
- range: 5-24
device: cpu
- range: 25-31
device: npu
Да — слои можно назначать произвольно. Это даёт возможность тонкой настройки: первые слои (эмбеддинги) часто узкие, выгоднее считать на CPU, а последние attention блоки — тяжелые, их лучше на NPU. В тестах конфигурация CPU+NPU (2:1) дала 60% прироста скорости по сравнению с чистым CPU на Google Pixel 9 Pro (Tensor G5, 6-ядерный NPU).
Но ложка дёгтя: после сборки выяснилось, что не все чипы одинаково полезны. Snapdragon 888 — нет стабильной поддержки NNAPI 2.0, приходится использовать QNN SDK от Qualcomm отдельно. Dimensity 9300 показывает отличные результаты, но MediaTek не документирует часть операций — некоторые слои падают с “UNSUPPORTED”. Обзор клиентов с аппаратным ускорением давал надежду на универсальность, но на практике один и тот же бинарник работает на Exynos 2400 и не работает на Tensor G4. Вендоры, ау.
⚠️ Если у вас телефон на Kirin 9000S (Huawei) — забудьте. HarmonyOS NEXT не поддерживает стандартный NNAPI делегат. Только через либу MindSpore Lite, а это отдельная история.
Кому реально зайдёт
- Разработчикам офлайн-приложений. Хотите вшить в свой мессенджер локального AI-секретаря без облака? Без NPU — тормозно. Гибрид даёт приемлемые 10-15 ток/с для диалогов.
- Исследователям аппаратного ускорения. Если вам интересно, как эффективно выжать соки из разных чипов — это отличная площадка для экспериментов. Помните историю с NVIDIA + Intel ARC? Тот же принцип гетерогенных вычислений, только на мобилке.
- Фанатам моддинга. Хотите сделать своего Jarvis на Raspberry Pi — ну или на телефоне — и заставить его работать без интернета? Гибридный движок — ваш новый лучший друг.
Осторожно: если вы привыкли к рецептам запуска LLM на слабых телефонах (чистый CPU, квантизация Q4_K_M, маленький контекст) — здесь всё сложнее. Гибрид требует хотя бы 8 ГБ ОЗУ и NPU с поддержкой INT8. Не каждый Redmi Note потянет.
Куда копать: roadmap и прогнозы
Автор гибрида планирует добавить поддержку моделей с MoE (Mixtral, DeepSeek). Для них NPU может быть идеальным — sparse вычисления, часть экспертов выключена. Ещё в разработке — динамическое распределение слоёв в runtime, когда NPU мониторит температуру и решает, какие слои сбросить на CPU. Это уже похоже на драйверы видеокарт — адаптивное энергосбережение.
Кстати, параллельно развивается направление дообучения LLM на телефоне. Там задачу упрощают: LoRA-адаптеры, которые можно встраивать прямо в гибридный пайплайн. Представьте: утром вы загрузили свежие LoRA-адаптеры на свой телефон, и ваш ассистент стал лучше понимать ваш диалект. Без серверов.
На конференции Google I/O 2026 (прошла вчера, 1 мая) официально анонсировали Android ML API, который объединит вызовы NPU/GPU/CPU в единый граф. Гибрид llama.cpp+LiteRT может стать первым практическим примером, который подтолкнёт Google к унификации. Ждём через полгода стабильную имплементацию в AOSP.
Мой личный прогноз: к концу 2026 года любой середняк с NPU будет запускать 7B-модель с комфортной скоростью. И гибридный подход станет стандартом де-факто для Android AI приложений. Туториал по созданию приложения с llama.cpp — отличная стартовая точка, чтобы через месяц апгрейднуть его до гибрида. Не бойтесь пачкать руки, это того стоит.