We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Оптимизация производительности Termux для ресурсоемких задач, таких как машинное обучение

Termux — это мощный терминал для Android, позволяющий запускать полноценный набор Linux‑утилит прямо на смартфоне или планшете. Однако ресурсоёмкие задачи, такие как обучение нейронных сетей, требуют особого подхода к настройке среды. В этой статье мы рассмотрим практические методы, позволяющие выжать максимум из ограниченных ресурсов мобильного устройства.

Понимание ограничений Android‑устройства

Перед тем как приступать к оптимизации, важно знать, какие факторы влияют на производительность:

  • CPU: большинство современных смартфонов оснащены ARM‑ядрами с динамической тактовой частотой.
  • GPU: доступ к графическому процессору обычно осуществляется через OpenGL ES или NNAPI, а не через традиционные CUDA/OpenCL.
  • Оперативная память: типичные устройства имеют от 3 GB до 12 GB RAM, поэтому необходимо контролировать её потребление.
  • Хранилище: внутреннее NAND‑память медленнее, чем SSD, поэтому рекомендуется использовать внешние SD‑карты или USB‑накопители для больших наборов данных.

Эти ограничения формируют основу последующих шагов по оптимизации.

Выбор подходящего аппаратного обеспечения

Для тяжёлых вычислений предпочтительно:

  • Устройства с процессором Snapdragon 8‑го поколения или аналогичным, поддерживающим 64‑битные инструкции.
  • Наличие минимум 6 GB RAM.
  • Поддержка USB‑OTG для подключения внешних SSD.

Если устройство не удовлетворяет этим требованиям, можно рассмотреть облачную подсистему через ssh‑тunnel, однако в рамках этой статьи фокусируемся на локальной работе.

Установка лёгкой Linux‑среды через Proot

По умолчанию Termux использует собственный набор пакетов, но для машинного обучения удобнее работать в более привычном дистрибутиве, например, в Ubuntu. Это достигается с помощью proot-distro:

pkg update && pkg upgrade -y
pkg install proot-distro -y
proot-distro install ubuntu-20.04
proot-distro login ubuntu-20.04

После входа в контейнер можно пользоваться привычными apt‑командами.

Оптимизация Python‑окружения

Для машинного обучения рекомендуется использовать Miniconda, так как он позволяет быстро переключать версии Python и библиотек без конфликтов.

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O miniconda.sh
bash miniconda.sh -b -p $HOME/miniconda
export PATH="$HOME/miniconda/bin:$PATH"
conda init
source ~/.bashrc

Создаём отдельный env‑пакет с необходимыми библиотеками:

conda create -n ml python=3.10
conda activate ml
conda install -c conda-forge numpy scipy pandas tqdm
# Установка PyTorch с поддержкой CPU (ARM) и ускорения через OpenBLAS
conda install -c pytorch-nightly pytorch torchvision torchaudio -c conda-forge
# Для TensorFlow используем tensorflow-aarch64
pip install tensorflow-aarch64

Важно использовать сборки, оптимизированные под ARM‑архитектуру и OpenBLAS/MKL.

Ускорение линейных алгебраических операций

Большая часть вычислительной нагрузки в ML‑моделях приходится на BLAS‑библиотеки. На ARM‑устройствах рекомендуется установить OpenBLAS с поддержкой многопоточности:

apt-get install -y libopenblas-dev
export OPENBLAS_NUM_THREADS=$(nproc)

Для более продвинутой оптимизации можно собрать OpenBLAS с флагом -march=armv8-a, но это уже выходит за рамки базовой настройки.

Управление памятью: swap и ZRAM

Android ограничивает объём доступной RAM, поэтому рекомендуется включить zram‑модуль, который создает сжатый swap‑раздел в оперативной памяти.

apt-get install -y zram-tools
# Включаем 2 GB сжатый swap
echo "2048" > /sys/block/zram0/disksize
mkswap /dev/block/zram0
swapon /dev/block/zram0

Проверить статус можно командой free -h. Не рекомендуется создавать обычный swap‑файл на внутренней памяти – это сильно изнашивает NAND‑чип.

Работа с данными: хранение и доступ

Для наборов данных размером более 1 GB лучше разместить их на внешнем SSD, подключённом через USB‑OTG. В Termux необходимо предоставить разрешения:

termux-setup-storage
# Смонтировать внешний диск (пример для /dev/block/sda1)
mkdir -p /sdcard/usb
mount -t vfat /dev/block/sda1 /sdcard/usb

После монтирования путь к данным будет выглядеть как /sdcard/usb/dataset/. При работе с PyTorch указывайте torch.utils.data.DataLoader(..., pin_memory=True) для ускорения передачи данных в память.

Параллелизм и ускорение вычислений

Несколько подходов позволяют задействовать все ядра процессора:

  • Библиотека numba с опцией @njit(parallel=True) автоматически распараллеливает циклы.
  • Модуль multiprocessing в Python – однако следует ограничиться max_workers = os.cpu_count() // 2 во избежание перегрузки.
  • Для TensorFlow включаем XLA‑компилятор: export TF_XLA_FLAGS=--tf_xla_auto_jit=2.

Пример использования Numba:

from numba import njit, prange
import numpy as np
@njit(parallel=True)
def matrix_mul(a, b):
    n = a.shape[0]
    result = np.zeros((n, n), dtype=a.dtype)
    for i in prange(n):
        for j in range(n):
            for k in range(n):
                result[i, j] += a[i, k]  b[k, j]
    return result

GPU‑ускорение через TensorFlow Lite и NNAPI

Прямой доступ к GPU в Termux ограничен, однако можно воспользоваться TensorFlow Lite, который использует Android NNAPI для ускорения инференса на GPU/DSP. Установите пакет:

pip install tflite-runtime

Пример инференса:

import numpy as np
import tflite_runtime.interpreter as tflite
interpreter = tflite.Interpreter(model_path='model.tflite',
                                 experimental_delegates=[tflite.load_delegate('libnnapi_delegate.so')])
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Подготовка входных данных
input_data = np.random.rand(input_details[0]['shape']).astype(np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print('Result:', output_data)

Хотя производительность не сравнима с настольными GPU, для инференса на мобильных устройствах такой подход дает заметный прирост.

Мониторинг и профилирование

Для контроля нагрузки используйте привычные утилиты:

  • top или htop (устанавливается через pkg install htop) – отображают загрузку CPU и использование памяти.
  • termux-battery-status – позволяет следить за энергопотреблением.
  • Для профилирования Python‑кода удобно применять cProfile и визуализировать результаты с помощью snakeviz.

Пример сбора профиля:

python -m cProfile -o profile.prof train.py
snakeviz profile.prof

Автоматизация и управление задачами

Для длительных тренировок удобно создать скрипт‑менеджер, который будет автоматически перезапускать процесс в случае падения и сохранять логи:

#!/usr/bin/env bash
LOG_DIR=$HOME/ml_logs
mkdir -p "$LOG_DIR"
while true; do
  echo "[$(date)] Запуск обучения..." | tee -a "$LOG_DIR/run.log"
  python train.py >> "$LOG_DIR/run.log" 2>&1
  EXIT_CODE=$?
  if [ $EXIT_CODE -eq 0 ]; then
    echo "[$(date)] Обучение завершено успешно" | tee -a "$LOG_DIR/run.log"
    break
  else
    echo "[$(date)] Ошибка $EXIT_CODE, перезапуск через 30 сек" | tee -a "$LOG_DIR/run.log"
    sleep 30
  fi
done

Сохраните файл как run.sh, сделайте исполняемым (chmod +x run.sh) и запускайте в фоне: nohup ./run.sh &.

Заключение

Оптимизация Termux для ресурсоёмких задач требует комплексного подхода: правильный выбор аппаратуры, настройка лёгкой Linux‑среды, использование специализированных библиотек (OpenBLAS, Numba, TensorFlow Lite) и эффективное управление памятью. При соблюдении перечисленных рекомендаций можно успешно проводить обучение и инференс небольших моделей прямо на мобильном устройстве, экономя время и ресурсы.

Для профессионального сопровождения проектов, связанных с DevOps, машинным обучением и мобильными вычислениями в Рыбинске, обратитесь в RybinskLab – ваш надёжный партнёр в IT‑услугах.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом RybinskLab.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю IT-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса.

Связаться со мной