Гибридный инференс LLM на Android: llama.cpp + LiteRT + NPU/GPU — первый опыт | AiManual
AiManual Logo Ai / Manual.
02 Май 2026 Инструмент

Гибридный инференс LLM на Android: llama.cpp + LiteRT + NPU/GPU — первый опыт

Разбираем первый опыт гибридного инференса LLM на Android: llama.cpp + LiteRT с задействованием NPU/GPU. Сравнение с альтернативами, примеры настройки и практич

Смартфон как нейронка: почему мы ждали этого 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 делает то, что умеет лучше всего.

💡
Ключевой нюанс: NN API делегат в LiteRT поддерживает не все операции. Если ваш NPU не умеет, скажем, Group-Query Attention — придётся оставлять его на CPU. В текущей версии гибрид работает только для моделей с архитектурой Llama-like (статические маски, стандартные activation). И да, квантизация — обязательна: FP16 на 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 — отличная стартовая точка, чтобы через месяц апгрейднуть его до гибрида. Не бойтесь пачкать руки, это того стоит.

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