Termux — это полноценная оболочка Linux для Android, где вы можете запускать утилиты, компилировать инструменты и собирать рабочие пайплайны для анализа данных прямо на устройстве. Для задач машинного обучения ключевой плюс — возможность организовать полностью локальную инференцию без интернета: модель загружается с файловой системы, данные обрабатываются на устройстве, а результат формируется локально. Это особенно удобно для:
- полевых задач и офлайн-режимов;
- обработки чувствительных данных без отправки в облако;
- быстрого прототипирования и отладки;
- экспериментов с оптимизациями под конкретный телефон.
Ниже — практический обзор подходов: TensorFlow Lite (включая запуск через интерпретатор) и варианты PyTorch Mobile. Также рассмотрим организацию файлов, валидацию входных данных и типовые оптимизации.
Базовая подготовка Termux
Перед установкой сред убедитесь, что у вас корректно работает Termux и есть доступ к файловой системе (например, модель и входные данные хранятся в каталоге Termux). Рекомендуемый стартовый блок:
pkg update -y && pkg upgrade -y
pkg install -y git python
Дальше важно понимать аппаратные ограничения Android: скорость CPU/GPU, наличие/отсутствие NNAPI и особенности архитектуры (ARMv7/ARM64). Термин «без интернета» означает лишь то, что вы не используете сетевые сервисы во время инференции; при установке пакетов первое время сеть может требоваться для скачивания зависимостей.
Подход 1: TensorFlow Lite в Termux (локальный запуск интерпретатора)
TensorFlow Lite — один из наиболее практичных вариантов для офлайн-инференции в экосистеме Termux. В зависимости от ваших целей можно использовать:
- Python-обвязку (подходящую для прототипирования);
- низкоуровневые бинарники/инструменты (если вы собираете/используете их под вашу сборку Android).
Установка Python-пакетов и TensorFlow Lite runtime
Для простого запуска модели обычно достаточно установить интерпретатор TFLite и сопутствующие библиотеки (на практике название/доступность пакетов может отличаться в зависимости от архитектуры и репозиториев). Начните с установки основных зависимостей:
pkg install -y python
pip install --upgrade pip
pip install numpy
Дальше установите TFLite runtime. Если у вас возникает несовместимость версий, корректнее ориентироваться на доступные для вашей среды пакеты и использовать venv.
pip install --upgrade virtualenv
virtualenv venv
source venv/bin/activate
pip install numpy
pip install tflite-runtime
Проверка, что модель читается и интерпретатор доступен:
python -c "import tflite_runtime.interpreter as i; print('tflite-runtime OK')"
Подготовка модели .tflite
Положите файл модели в каталог Termux, например:
mkdir -p ~/ml/models
# далее скопируйте model.tflite в ~/ml/models/
Если модель использует входы другого типа (изображения, текст, спектрограммы), подготовьте данные в соответствии со спецификацией модели (размеры, нормализация, тип данных, порядок каналов).
Пример локального скрипта инференции (без интернета)
Ниже пример общего шаблона: загрузка модели, подготовка входа и вычисление. Сами параметры (shape, dtype, нормализация) подставьте согласно вашей модели.
cat > ~/ml/run_tflite.py <<'PY'
import numpy as np
from tflite_runtime.interpreter import Interpreter
model_path = "ml/models/model.tflite"
# 1) Загружаем интерпретатор
interpreter = Interpreter(model_path=model_path)
interpreter.allocate_tensors()
# 2) Узнаём input/output
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
in_index = input_details[0]["index"]
in_shape = input_details[0]["shape"]
in_dtype = input_details[0]["dtype"]
print("Input shape:", in_shape, "dtype:", in_dtype)
# 3) Формируем тестовый вход
# ВАЖНО: замените генерацию на ваши реальные данные.
x = np.random.rand(*in_shape).astype(in_dtype)
# 4) Запускаем инференцию
interpreter.set_tensor(in_index, x)
interpreter.invoke()
# 5) Забираем результат
out = interpreter.get_tensor(output_details[0]["index"])
print("Output:", out)
PY
python ~/ml/run_tflite.py
Чтобы убедиться, что вы действительно идёте офлайн, отключите мобильный интернет и Wi‑Fi (или оставьте сеть выключенной) и проверьте запуск снова. В процессе инференции не требуется сетевых запросов — только чтение модели и данных с диска.
Оптимизации под Android: размер, квантование, буферизация
- Квантование: модели INT8 часто дают существенный выигрыш скорости и/или памяти.
- Уменьшение входного размера: если модель допускает, сократите разрешение.
- Предвыделение массивов: избегайте постоянного создания больших numpy-массивов в цикле (переиспользуйте буферы).
- Проверка формата данных: типовые ошибки — неверная нормализация (0..255 вместо 0..1), каналы (NHWC vs NCHW), порядок цветовых каналов (RGB/BGR).
Для серии инференций (например, на видео с камеры) используйте цикл в одном процессе, чтобы интерпретатор не пересоздавался на каждый кадр.
Подход 2: PyTorch Mobile и локальная инференция
Экосистема PyTorch Mobile ориентирована на запуск TorchScript-моделей (часто файл формата .pt или .ts). В Termux запуск PyTorch Mobile может потребовать дополнительных шагов по сборке окружения под вашу версию Android/архитектуру. Практический путь обычно выглядит так:
- Подготовить модель в PyTorch и экспортировать в TorchScript.
- Собрать/добавить в окружение runtime, либо использовать готовый путь запуска, совместимый с вашей средой Termux.
- Запускать инференцию локально, читая входные данные с диска.
Поскольку конкретный способ установки PyTorch Mobile runtime в Termux зависит от вашей архитектуры и доступности бинарников, рекомендуется уточнить целевой формат и требования к точности/скорости. Ниже — логика подготовки модели и общий пример запуска TorchScript в локальном контуре.
Экспорт модели в TorchScript
На стороне разработки (обычно на ПК с Python и PyTorch) экспортируйте модель в TorchScript. Примерный шаблон:
import torch
model = ... # ваша модель
model.eval()
# Пример с трассировкой. В реальном проекте используйте correct example_inputs.
example_inputs = torch.randn(1, 3, 224, 224)
ts_model = torch.jit.trace(model, example_inputs)
ts_model.save("model_ts.pt")
Далее перенесите model_ts.pt в Termux-каталог.
Локальная инференция TorchScript (концептуальный шаблон)
Если ваше окружение Termux позволяет использовать подходящий PyTorch (или совместимый runtime), то общий шаблон выглядит так:
cat > ~/ml/run_torchscript.py <<'PY'
import torch
import numpy as np
model_path = "ml/models/model_ts.pt"
model = torch.jit.load(model_path, map_location="cpu")
model.eval()
# Подготовка входа:
# ВАЖНО: замените на ваши реальные данные и нормализацию.
# Ниже пример для тензора 1x3x224x224.
x = np.random.rand(1, 3, 224, 224).astype(np.float32)
inp = torch.from_numpy(x)
with torch.no_grad():
y = model(inp)
print("Output:", y)
PY
python ~/ml/run_torchscript.py
Если на вашем устройстве PyTorch для Termux не доступен напрямую или конфликтует с зависимостями, применяют сборку/альтернативный runtime. В этом случае правильнее выбрать стратегию под вашу цель: максимальная скорость (часто TFLite) или совместимость моделей из PyTorch (TorchScript + мобильный runtime).
Локальная инференция без интернета: организация данных и запуск
Чтобы инференция не требовала сети, важно исключить сценарии, где код обращается к интернету (скачивание классов/весов, получение токенов, загрузка внешних ресурсов). Рекомендуемая структура каталогов:
mkdir -p ~/ml/{models,inputs,outputs,cache}
# model -> ~/ml/models/
# входные файлы -> ~/ml/inputs/
# результаты -> ~/ml/outputs/
Типовой цикл офлайн-запуска:
- Чтение входа (из
~/ml/inputs). - Преобразование к формату модели (dtype/shape/нормализация).
- Вызов интерпретатора/модели.
- Сохранение результата в
~/ml/outputs.
Для удобства отладки используйте явные принты форматов (shape/dtype) и контрольные примеры. Это быстрее, чем угадывать причину неверных предсказаний.
Как проверить, что всё работает офлайн
1) Отключите Wi‑Fi и мобильные данные.
2) Запустите скрипт инференции.
3) Убедитесь, что не происходит ожиданий сети (например, попыток DNS/HTTP). Скрипт должен только читать локальные файлы и выполнять вычисления.
Если вам нужно организовать локальную сеть для передачи данных между устройствами (например, отправлять изображения с другого телефона на устройство с Termux), можно использовать VPN только для создания локальной сети. Но для целей именно инференции модель и вычисления должны выполняться без обращения к интернет-ресурсам.
Типовые проблемы и их устранение
Модель запускается, но предсказания «странные»
- Неверная нормализация (0..255 вместо 0..1, mean/std не те).
- Перепутаны размеры (например, 224x224 вместо 160x160).
- Неверный порядок каналов (RGB vs BGR).
- Ошибки типа (float32 вместо int8, scale/zero-point не учтены).
Ошибки формы (shape mismatch)
Проверьте input_details в TFLite или входные тензоры в TorchScript. Частая причина — ожидание батча (N) и каналов (C).
Медленная работа
- Используйте квантованные модели.
- Минимизируйте преобразования данных в цикле.
- Уменьшайте разрешение входа (если допускает модель).
- В случае TFLite рассмотрите настройку делегатов/ускорителей, если они доступны в вашей конфигурации сборки.
Рекомендованный рабочий процесс: от модели до терминального скрипта
- Выберите формат: TFLite для практичной офлайн скорости и простого интеграционного контура; TorchScript — если вы хотите переносить PyTorch-модели напрямую.
- Экспортируйте модель и фиксируйте спецификацию входа/выхода (shape/dtype/нормализация).
- Создайте репозиторий или папку проекта в Termux.
- Реализуйте «один тест» (один вход — один выход) и проверьте согласованность.
- Доведите до конвейера: серия инференций, сохранение результатов, логирование.
Заключение
Интеграция машинного обучения в Termux реально организуется в формате локальной инференции без интернета. Для большинства практических задач наиболее быстрый путь — TensorFlow Lite с запуском локального интерпретатора и аккуратной подготовкой входных данных. Для переносимости из PyTorch — используйте экспорт в TorchScript и локальный runtime, при необходимости подстраивая сборку окружения под вашу архитектуру Android. В обоих случаях ключ к успеху — точное соответствие формата входа модели, контроль dtype/shape и оптимизации под производительность устройства.
Хотите собрать рабочее офлайн-решение «под ключ» (выбор формата модели, оптимизация под ваш смартфон, подготовка входов и стабильный терминальный пайплайн)? Обратитесь в РыбинскЛАБ — поможем с настройкой, адаптацией моделей и интеграцией сценариев в Termux.