Обещания и реальность: почему на телефоне пусто
Все началось с статьи про TurboQuant от Google. Методика, которая на бумаге сжимает модели в 10 раз без потерь. Звучало как магия. Мой Snapdragon 7s Gen 3 в тестовом смартфоне жаждал этой магии. Результат? Полный провал. Не запускается. Тихо крашится. Давай разберем, почему так вышло и что можно сделать вместо этого.
Ключевая проблема на март 2026: TurboQuant заточен под CUDA и x86_64. Поддержка ARMv8.2+ (как в современных Snapdragon) существует только в виде экспериментальных патчей, которые не влиты в основную ветку. Никаких готовых бинарников под Android нет и пока не предвидится.
Вскрытие: что не так с TurboQuant на ARM
Я потратил два дня на Termux, кросс-компиляцию и чтение исходников. Вот что нашел в ядре проблемы:
- Кернелы для NEON - сырые. Алгоритм использует специфичные инструкции для вращения матриц (rotation), которые на ARM должны эмулироваться через NEON intrinsics. В текущей реализации это работает в 5-7 раз медленнее, чем на x86 с AVX2. Для инференса это смерть.
- GGML type registration fail. Самая частая ошибка. Библиотека ggml, лежащая в основе llama.cpp и TurboQuant, не находит зарегистрированные типы квантования при загрузке модели. На ARM работает иначе система инициализации статических объектов.
- Память. Даже если собрать, модель в формате TurboQuant требует специфичного выравнивания памяти, которое Android не гарантирует. Получаем segmentation fault на пустом месте.
Собираем llama.cpp под ARM: пошаговый разбор
Забудь про TurboQuant. Вот как заставить llama.cpp летать на твоем Snapdragon. Я тестировал на Snapdragon 7s Gen 3 (архитектура Cortex-A78, Cortex-A55) под Termux. Метод рабочий и для других ARMv8-чипов.
1 Подготовка Termux и окружения
Первое - ставим свежий Termux. Советую качать с F-Droid (партнерская ссылка), там версии стабильнее. После установки:
pkg update -y && pkg upgrade -y
pkg install git cmake ninja build-essential -y
Не используй стандартный репозиторий Termux для компилятора! Его g++ часто отстает. Установи clang:
pkg install clang -y
2 Клонируем и настраиваем llama.cpp
Берем самую свежую версию. На март 2026 это ветка master с поддержкой новых моделей (как DeepSeek-R1 и Qwen2.5).
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
Теперь самое важное - флаги компиляции. Вот конфигурация, которая выжимает максимум из Snapdragon:
cmake -G Ninja .. \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLAMA_NATIVE=OFF \ # Не включай! Для ARM это ломает сборку
-DLLAMA_ARM_F16C=OFF \ # F16C нет в нашем ARM
-DLLAMA_NEON=ON \ # Включаем NEON обязательно
-DLLAMA_F16C=OFF \
-DLLAMA_AVX=OFF \
-DLLAMA_AVX2=OFF \
-DLLAMA_METAL=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_CUBLAS=OFF \
-DBUILD_SHARED_LIBS=OFF
-DLLAMA_NATIVE=ON автоматически определяет возможности CPU, но на ARM с big.LITTLE архитектурой (как в Snapdragon) это приводит к нестабильности. Лучше явно указать флаги.3 Сборка и борьба с ошибками
Запускаем сборку:
ninja
Если видишь ошибку "ggml_type registration failed" или "undefined reference to `ggml_type_name" - это та самая проблема с инициализацией. Лечится патчем. Создай файл patch_fix.diff в корне llama.cpp:
--- a/ggml.c
+++ b/ggml.c
@@ -1234,7 +1234,7 @@ const char * ggml_type_name(enum ggml_type type) {
}
}
-static void ggml_init(void) {
+void ggml_init(void) {
static bool is_first = true;
if (!is_first) {
return;
Примени патч и пересобери:
cd llama.cpp
git apply patch_fix.diff
cd build && rm -rf *
# Повтори конфигурацию cmake и ninja
4 Тест на работоспособность
После успешной сборки проверяем бинарник:
./bin/main --help
Если видишь список параметров - все ок. Теперь скачай маленькую тестовую модель, например, Qwen2.5-0.5B-Instruct-Q4_K_M.gguf. Запусти инференс:
./bin/main -m /path/to/model.gguf -p "Hello" -n 32 -t 4 -c 512
Флаги -t 4 (количество потоков) и -c 512 (контекст) подбери под свое железо. Для Snapdragon 7s Gen 3 оптимально 6-7 потоков.
Нюансы, о которых молчат гайды
- ОЗУ - все решает. Даже с собранным llama.cpp, 7B-модель в Q4_K_M съест ~4.5 ГБ ОЗУ. Если у тебя телефон с 8 ГБ, оставь системе хотя бы 2 ГБ. Иначе Android убьет процесс. Подробнее в нашем гайде про запуск 7B-модели на Snapdragon 888.
- Тепло - враг скорости. После 2-3 минут инференса CPU троттлит. Скорость падает с 45 tok/s до 15. Решение - внешний радиатор или ограничение частоты через
taskset. - Кэш модели. Если планируешь часто использовать модель, скопируй ее в
/data/local/tmp- это RAM-диск, чтение будет быстрее.
Что в итоге?
TurboQuant на Android - это технология будущего, но не настоящего. Вместо погони за сырыми методами, собери стабильный llama.cpp. Он даст тебе:
- Работу с десятками форматов квантования (Q4_K_M, IQ3_XXS, F16).
- Поддержку актуальных моделей (на март 2026 это Qwen2.5, DeepSeek-R1, Command R).
- Контроль над памятью и потоками.
Мой прогноз: TurboQuant появится на ARM не раньше конца 2026 года, когда Google перепишет кернелы под Apple Silicon и это портируют на Android. А пока - собирай, тестируй, и не верь маркетинговым заголовкам. Иногда простой Q4_K_M работает лучше самой модной технологии.