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

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

Организация распределённого вычислительного кластера на основе нескольких устройств Android с Termux и MPI (OpenMPI)

Пошаговое руководство по сборке небольшого распределённого кластера на Android: установка Termux, OpenMPI, настройка межузлового взаимодействия и запуск MPI-приложений на нескольких устройствах в локальной сети.

Распределённые вычисления на небольшом количестве устройств — практичный способ ускорить эксперименты, обучение и прототипирование, не задействуя серверную инфраструктуру. В этой статье мы разберём, как собрать кластер из нескольких Android-устройств с помощью Termux и MPI (OpenMPI), чтобы запускать параллельные задачи и обмениваться сообщениями между узлами в локальной сети.

Материал ориентирован на рабочие сценарии, когда все устройства находятся в одной сети (например, через Wi‑Fi роутер или точку доступа). Мы не будем рассматривать VPN для обхода блокировок — только для удобной организации локальной сети при необходимости.

Архитектура решения

Кластер будет состоять из узлов (devices) под управлением Termux:

  • master (контроллер) — устройство, с которого запускается MPI-планировщик (mpirun) и формируется распределение процессов по узлам;
  • workers — устройства, на которых запускаются MPI-процессы.

В классической модели OpenMPI требуется доступность исполняемых файлов и корректная связность между узлами по сети (IP-доступ). На Android это особенно важно, потому что среда Termux и сетевые настройки зависят от политики Wi‑Fi/энергосбережения.

Требования и подготовка

  • Несколько Android-устройств (минимум 2).
  • Все устройства должны иметь доступ к одной локальной сети (одинаковый Wi‑Fi).
  • Установленный Termux на каждом устройстве.
  • Для mpirun удобнее обеспечить предсказуемые IP-адреса: например, зафиксировать DHCP в роутере или использовать статические адреса в локальной сети.

Проверьте, что устройства “видят” друг друга по сети: с master можно выполнить ping на IP каждого worker (при наличии ICMP).

Настройка Termux: базовые пакеты

Повторите на каждом устройстве (master и workers).

pkg update
pkg upgrade -y
pkg install -y curl wget nano proot openssh git build-essential cmake pkg-config

Установка OpenMPI в Termux

Варианты установки OpenMPI зависят от текущих репозиториев Termux и доступности готовых пакетов. На практике часто требуется сборка из исходников или использование совместимых сборок.

Ниже приведён один из типовых подходов: сборка OpenMPI в среде Termux. Это может занять время.

# На каждом устройстве (master и workers)
cd ~
mkdir -p mpi-src mpi-build
cd mpi-src

# Укажите версию на свой выбор (пример)
OMPI_VER="4.1.6"

# Скачивание исходников (можно заменить на ваш вариант зеркала)
curl -L -o ompi.tar.gz "https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-$OMPI_VER.tar.gz"
tar -xzf ompi.tar.gz
cd "openmpi-$OMPI_VER"

# Сборка
cd ~/mpi-build
cmake ../mpi-src/"openmpi-$OMPI_VER" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=$HOME/.local/ompi \
  -DBUILD_SHARED_LIBS=ON

make -j$(nproc)
make install

# Настройка PATH (выполните также на всех узлах)
mkdir -p $HOME/.local
export PATH="$HOME/.local/ompi/bin:$PATH"
echo 'export PATH="$HOME/.local/ompi/bin:$PATH"' >> ~/.bashrc

echo 'export LD_LIBRARY_PATH="$HOME/.local/ompi/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc

# Проверка
ompi_info | head -n 30

Если сборка прерывается из‑за зависимостей, сообщите мне, какие ошибки вы видите в логах (фрагмент текста). Мы подберём конкретные пакеты/опции.

Сетевые требования и адреса узлов

Для MPI важно, чтобы процессы на разных устройствах могли устанавливать соединения по TCP/UDP и обмениваться сообщениями. Самый простой вариант — использовать одну локальную сеть Wi‑Fi.

На каждом устройстве определите свой IP:

ip addr show

Запишите адреса:

  • master: например, 192.168.1.10
  • worker1: например, 192.168.1.11
  • worker2: например, 192.168.1.12

Рекомендуется отключить агрессивное энергосбережение для Termux/приложения на Android, чтобы процессы не “усыплялись”. Это часто критично для стабильного запуска MPI.

Настройка SSH для межузлового запуска

Чтобы mpirun мог запускать процессы на удалённых узлах, часто удобнее использовать SSH. Для этого на каждом узле настраивают доступ по ключам. Если вы не хотите SSH — можно применять альтернативные механизмы запуска, но для практичности ниже рассмотрим стандартный путь.

Шаг 1: поднять SSH в Termux

На каждом устройстве установите и запустите OpenSSH.

# На каждом устройстве
pkg install -y openssh

# Генерация ключей (если ещё нет)
ssh-keygen -t ed25519 -f $HOME/.ssh/id_ed25519 -N ""

# Запуск sshd
sshd -p 8022

Если sshd запускается от вашего текущего пользователя, убедитесь, что сессия не завершается. На практике часто используют отдельный способ запуска, но здесь приведён базовый принцип.

Шаг 2: обмен публичными ключами

На master соберите ключи worker в authorized_keys. Выполните:

# На master: создать authorized_keys
mkdir -p $HOME/.ssh
touch $HOME/.ssh/authorized_keys
chmod 700 $HOME/.ssh
chmod 600 $HOME/.ssh/authorized_keys

# На каждом worker: покажите публичный ключ
cat $HOME/.ssh/id_ed25519.pub

Далее вручную добавьте содержимое ключей worker в файл:

# На master:
nano $HOME/.ssh/authorized_keys

Сохраните изменения.

Шаг 3: проверка SSH-соединения

С master проверьте доступ к worker:

ssh -p 8022 user@192.168.1.11 hostname

Замените user на имя пользователя Termux (обычно это текущий пользователь в Termux-профиле; чаще всего можно использовать, например, root не требуется — лучше оставить то, что настроено на устройствах).

Подготовка окружения OpenMPI (одинаковая структура PATH)

Чтобы процессы на worker запускались корректно, бинарники MPI должны находиться в одинаковом окружении. Самый надёжный подход — сделать одинаковые пути установки (например, $HOME/.local/ompi) и обеспечить наличие PATH.

На master и на workers проверьте:

which mpirun
mpirun --version

Тестовое MPI-приложение

Для проверки подойдёт простой “Hello, MPI”. Если у вас нет MPI-приложения, скомпилируйте шаблон на C.

Шаг 1: исходник

cat > ~/hello_mpi.c <<'EOF'
#include <mpi.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);

    int rank = 0, size = 0;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    char host[256];
    gethostname(host, sizeof(host));

    printf("Hello from rank %d of %d on host %s
", rank, size, host);
    fflush(stdout);

    MPI_Finalize();
    return 0;
}
EOF

Шаг 2: сборка

Соберите на master (затем при необходимости — перенесите на workers или используйте синхронизированный путь). Для простоты можно собрать отдельно на каждом узле одинаково.

# На каждом устройстве (master и workers), либо хотя бы там, где будет запуск
cd ~
mpicc -O2 -o hello_mpi hello_mpi.c

# Проверка, что MPI работает локально
mpirun -np 2 ./hello_mpi

Запуск кластера: пример mpirun

С master выполните запуск на удалённых узлах. В OpenMPI корректная настройка хостов и launcher может зависеть от версии. Ниже приведён типовой формат с указанием списка узлов через -host и числом процессов -np.

Предположим:

  • worker1: 192.168.1.11
  • worker2: 192.168.1.12
  • на каждом worker хотим по 2 процесса
# На master
# Убедитесь, что hello_mpi доступен на workers (например, собран там же)

mpirun \
  --mca plm_rsh_agent "ssh" \
  --mca oob_tcp_if_include 192.168.1.0/24 \
  -np 4 \
  -host 192.168.1.11,192.168.1.12 \
  ./hello_mpi

Если SSH настроен на нестандартном порту (8022), добавьте параметры для SSH. В OpenMPI это обычно делается через соответствующие MCA параметры или через plm_rsh_args/ssh-строку.

Пример, который часто используется (может требовать корректировки под вашу сборку/версию OpenMPI):

mpirun \
  --mca plm_rsh_agent "ssh" \
  --mca plm_rsh_args "-p 8022" \
  -np 4 \
  -host 192.168.1.11,192.168.1.12 \
  ./hello_mpi

Если узлы не “видят” друг друга, первыми проверьте:

  • достижимость IP (ping/портовую связность);
  • правильность PATH и наличие mpirun/mpicc/hello_mpi на worker;
  • какие интерфейсы используются OpenMPI (особенно на Android, где может быть несколько интерфейсов).

Управление конфигурацией интерфейсов (важно для мобильных сетей)

На Android иногда происходят “переключения” сети (Wi‑Fi ↔ мобильные данные) или появляются виртуальные интерфейсы. Чтобы уменьшить неопределённость, полезно принудительно указать интерфейс для TCP вне-band/out-of-band коммуникаций.

Попробуйте подставить конкретный интерфейс или подсеть. Например:

# Пример: подсеть локальной сети
mpirun --mca oob_tcp_if_include 192.168.1.0/24 ...

Организация локальной сети с VPN (только для формирования локального сегмента)

Если ваши устройства физически находятся далеко друг от друга, но вы хотите объединить их в “единую” локальную сеть (как сегмент для кластера), иногда используют VPN, чтобы устройства могли обмениваться по IP как в LAN. Важно: VPN должен быть предназначен для построения локального сетевого сегмента, а не для обхода блокировок.

После поднятия VPN следуйте тем же правилам:

  • используйте IP-адреса внутри VPN-сети;
  • убедитесь, что SSH и необходимые порты доступны;
  • проверьте достижимость ping и запуск тестового MPI.

Типичные проблемы и как их решать

  • mpirun падает с ошибками соединения: проверьте IP, доступность по сети и интерфейсы. Часто помогает явное указание интерфейса через --mca oob_tcp_if_include.
  • на worker не найден исполняемый файл: убедитесь, что hello_mpi (и любые зависимости) присутствуют в том же пути, из которого запускает mpirun.
  • процессы “умирают” через время: проверьте энергосбережение, ограничения фоновой активности и “усыпление” Termux.
  • SSH работает вручную, но не работает из mpirun: проверьте параметры порта и того, как OpenMPI формирует SSH-команду на вашей сборке.

Практические рекомендации по устойчивости кластера

  • Фиксируйте IP-адреса устройств (DHCP reservation).
  • Одинаково настраивайте окружение Termux (PATH, LD_LIBRARY_PATH) на всех узлах.
  • Сокращайте число переменных: сначала протестируйте локальный запуск на одном устройстве, затем — запуск на двух.
  • Для вычислений, чувствительных к производительности, учитывайте, что Android и Wi‑Fi могут давать вариативность задержек и пропускной способности.

Заключение

Организовать небольшой распределённый кластер на Android с Termux и MPI (OpenMPI) вполне реально: достаточно корректно собрать/установить OpenMPI, обеспечить связность в локальной сети, подготовить SSH-доступ и выполнить запуск через mpirun с правильной конфигурацией хостов. Такой кластер отлично подходит для лабораторных экспериментов, учебных задач и быстрого прототипирования параллельных приложений без закупки отдельного оборудования.

Если вам нужна помощь с настройкой, подбором версий OpenMPI, разбором ошибок подключения или подготовкой стенда под ваши условия, обращайтесь в РыбинскЛАБ — мы поможем организовать работоспособную схему “Android + Termux + MPI”.

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

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект