Jump to content

Heterogeneous Cluster: tambah node HP android

From Haidhi Wiki

Setelah dua laptop saling ngobrol via LAN kabel, langkah ini menambahkan node ketiga yang berbeda di hampir semua sumbu: arsitektur, OS, libc, path instalasi, akses jaringan, dan model driver GPU.

Ringkasan 5W1H

Aspek Penjelasan
What (Apa) Menjalankan satu job MPI (perkalian matriks terdistribusi) di tiga node berbeda arsitektur, di mana tiap rank menjalankan kernel OpenCL di device-nya masing-masing: NVIDIA GPU, AMD CPU (pocl), dan Qualcomm Adreno.
Why (Kenapa) Membuktikan komputasi terdistribusi bisa berjalan lintas-arsitektur (x86_64 + ARM64), lintas-OS (Linux + Android), dan lintas-vendor-GPU dalam satu proses MPI. Nilai utamanya adalah sinyal skill cross-stack (portofolio), bukan platform komputasi yang praktis/cepat.
Who (Siapa/komponen) mpirun sebagai HNP di master (darmogandolz) yang meluncurkan orted di tiap node; tiap rank adalah proses MPI yang memanggil OpenCL di device lokalnya. Perangkat: darmogandolz (NVIDIA), tumbal (AMD/pocl), HP (Adreno).
When (Kapan) Tahap akhir — setelah dua laptop terbukti saling terhubung via LAN kabel. Ini langkah "menambah node ketiga" ke cluster yang sudah jalan.
Where (Di mana) LAN kabel khusus 192.168.100.0/24 lewat switch unmanaged. HP bergabung via adapter USB-to-LAN dengan IP statik 192.168.100.3.
How (Bagaimana) Cek versi+PMIx pkg (cocok → pakai pkg), SSH port 8022 via ssh config, samakan path via trik symlink terbalik, binary per-arch + MPMD, env OpenCL HP via skrip pembungkus, dan fix kunci: paksa policy routing Android lewat eth0. Diluncurkan via MPMD dengan interface dipin + binding hwloc dimatikan.

Lingkungan

Komponen darmogandolz (master) tumbal HP (Android)
Arsitektur x86_64 x86_64 aarch64 (ARM64)
OS / libc Arch Linux / glibc Arch Linux / glibc Android 13 / bionic (Termux)
Device OpenCL NVIDIA RTX 3050 AMD A8-6410 (pocl, CPU) Qualcomm Adreno 610
OpenMPI 4.1.5 (source) 4.1.5 (source) 4.1.5 (pkg Termux)
Prefix OpenMPI /home/haidhi/ompi4 /home/haidhi/ompi4 /data/data/com.termux/files/usr ($PREFIX)
NIC cluster enp8s0 → 192.168.100.1 eno1 → 192.168.100.2 eth0 (USB) → 192.168.100.3
Akses SSH port 22 port 22 port 8022 (Termux sshd)

Konsep: lima sumbu heterogenitas

HP berbeda dari laptop di hampir semua sumbu sekaligus. Memahami ini menjelaskan kenapa tiap masalah muncul:

  1. Arsitektur CPU — aarch64 vs x86_64 → binary tidak bisa dipakai bersama, wajib MPMD (binary terpisah per-arch).
  2. OS/libc — Android(bionic)+Termux vs Linux(glibc) → butuh build/paket sendiri + preload libc++.
  3. Path instalasi — $PREFIX vs /home/haidhi/ompi4 → aturan "path sama di semua node" pecah.
  4. Jaringan & akses — USB-LAN + IP statik + sshd di port 8022.
  5. OpenCL — Adreno non-ICD (vendor-first + libc++ preload) vs ICD sistem di laptop.

Benang merah semua: versi OpenMPI wajib cocok (4.1.5 di semua node).

Ikhtisar masalah

# Tahap Gejala singkat
1 SSH ssh: connect to host ... port 22: Connection refused
2 Kompatibilitas Apakah pkg Termux bisa interop dengan build source laptop?
3 Launch /home/haidhi/ompi4/bin/orted: No such file or directory (di HP)
4 Koneksi unable to complete a TCP connection ... Local host: localhost
5 Jaringan HP tidak bisa menjangkau 192.168.100.1 (routing salah arah)

Masalah 1: SSH ke HP ditolak (port)

Muncul saat: mpirun pertama kali mencoba meluncurkan orted di HP. Di mana: master → HP.

Gejala

ssh: connect to host 192.168.100.3 port 22: Connection refused

Penyebab

Termux menjalankan sshd di port 8022, bukan 22. mpirun (lewat ssh) default ke port 22, jadi tidak ada yang mendengarkan. "Connection refused" (bukan timeout) justru kabar baik: HP reachable di level IP, jaringan USB-eth sudah jalan.

Solusi

Beri tahu ssh lewat ~/.ssh/config di master (per-host, jadi laptop tetap port 22):

Host 192.168.100.3
    Port 8022
    IdentityFile ~/.ssh/id_ed25519
chmod 600 ~/.ssh/config
# di Termux HP: pastikan sshd jalan + public key master terpasang
sshd
cat ~/.ssh/authorized_keys
# verifikasi (WAJIB lolos sebelum mpirun):
ssh 192.168.100.3 'uname -m'   # → aarch64, tanpa password

Catatan: jangan pakai --mca plm_rsh_agent "ssh -p 8022" — itu memaksa SEMUA host ke 8022, termasuk laptop di port 22. ssh config per-host yang benar.

Masalah 2: apakah pkg Termux kompatibel?

Muncul saat: memutuskan pakai paket Termux atau build dari source. Di mana: HP.

Pertanyaan

OpenMPI di laptop di-build dari source (4.1.5, prefix custom). Di HP terpasang dari pkg. Antar-node, versi dan build harus cukup cocok agar handshake peluncuran tidak gagal (lihat error "Data unpack" di halaman sebelumnya). Apakah pkg bisa dipakai?

Diagnosis

mpirun --version
ompi_info | grep -iE 'configure command|pmix'

Hasil di HP:

mpirun (Open MPI) 4.1.5
Configure command line: ... '--host=aarch64-linux-android' '--disable-dlopen'
   'ac_cv_header_ifaddrs_h=no' ... '--enable-shared' '--enable-static'
MCA pmix: isolated (... Component v4.1.5)
MCA pmix: pmix3x (... Component v4.1.5)

Kesimpulan

Cocok. Versi (4.1.5) dan PMIx (pmix3x internal v4.1.5) identik dengan laptop — ini faktor penentu handshake, dan dia match. Jadi pkg layak dipakai; tidak perlu build dari source.

Dua flag pada build pkg sempat jadi kekhawatiran:

  • ac_cv_header_ifaddrs_h=no — getifaddrs() dimatikan; deteksi interface jatuh ke fallback (SIOCGIFCONF). Sempat dicurigai bikin HP gagal mengenali IP-nya di multi-node.
  • --disable-dlopen — komponen di-static-link, bukan plugin runtime. Tidak masalah untuk handshake.

Catatan penting (terbukti kemudian): kekhawatiran ifaddrs ternyata tidak terbukti — fallback SIOCGIFCONF membaca eth0 dengan benar. pkg berjalan tanpa modifikasi. Penyebab kegagalan sebenarnya ada di tempat lain (Masalah 5).

Masalah 3: orted tidak ditemukan di HP

Muncul saat: mpirun meluncurkan orted di HP (SSH sudah berhasil). Di mana: HP.

Gejala

/data/data/com.termux/files/usr/bin/bash: line 1: /home/haidhi/ompi4/bin/orted: No such file or directory

Penyebab

Dua hal:

  1. --prefix per-context tidak ke-propagate di OpenMPI 4.1.5. Walau tiap section MPMD diberi --prefix sendiri, mpirun hanya memakai SATU prefix global untuk semua orted. Akibatnya prefix laptop (/home/haidhi/ompi4) dipaksakan ke HP, yang tidak punya path itu.
  2. Tidak bisa membuat /home/haidhi di Android. Ini bukan soal root — root filesystem / di Android read-only (partisi system + verified boot). su tidak menolong karena mount-nya memang ro; remount rw diblok/merusak boot. Jadi trik symlink "biasa" (bikin path laptop di HP) mati.

Solusi

Balik arah triknya. Karena / di laptop writable tapi di HP tidak, buat path HP di laptop, menunjuk ke instalasi laptop:

# di KEDUA laptop:
sudo mkdir -p /data/data/com.termux/files
sudo ln -s /home/haidhi/ompi4 /data/data/com.termux/files/usr

Sekarang path /data/data/com.termux/files/usr/bin/orted valid di semua node — di HP itu pkg asli, di laptop itu symlink ke ompi4. Lalu pakai SATU --prefix global = path HP (buang per-context):

mpirun ... --prefix /data/data/com.termux/files/usr ...

Tentang executable: di MPMD, path tiap app di-resolve di node masing-masing, dan tiap section menyebut app-nya sendiri, jadi binary boleh beda path antar-arch. Wajib pakai path absolut untuk HP — jangan ~, karena tilde di-expand oleh shell laptop menjadi home laptop sebelum mpirun melihatnya.

Masalah 4 & 5: TCP gagal — sebenarnya routing Android

Muncul saat: orted sudah jalan di semua node, masuk fase komunikasi antar-rank. Di mana: HP ↔ master.

Gejala

A process or daemon was unable to complete a TCP connection to another process:
  Local host:    localhost
  Remote host:   darmogandolz
This is usually caused by a firewall on the remote host.

Investigasi: dari HP, ping 192.168.100.1 gagal.

Penyebab

Pesan menuduh firewall, tapi penyebab sebenarnya adalah policy routing Android. Bukti:

su -c 'ip addr show eth0'             # 192.168.100.3 ADA, eth0 UP
su -c 'ip route get 192.168.100.1'
# 192.168.100.1 via 192.168.1.1 dev wlan0 table wlan0 src 192.168.1.136

HP mengirim paket untuk 192.168.100.1 lewat WiFi (dev wlan0, via gateway router 192.168.1.1), bukan lewat eth0 — padahal eth0 sudah punya IP di subnet itu. Router WiFi tidak kenal subnet 192.168.100.x, jadi paket nyasar.

Android tidak memakai tabel routing main seperti Linux desktop. Ia memakai banyak tabel + ip rule per-jaringan; rule untuk jaringan WiFi (table wlan0) dibaca lebih dulu, membypass route eth0 yang ada di tabel main. Asimetri ini (inbound via eth0 jalan, outbound lari ke WiFi) yang membuat koneksi TCP balik ke master gagal.

Catatan: "Local host: localhost" hanyalah label hostname default Termux — bukan indikasi masalah ifaddrs. Itu sempat menyesatkan ke arah rebuild source yang sebenarnya tidak perlu.

Solusi

Paksa tujuan 192.168.100.0/24 membaca tabel main (yang punya route eth0), pada prioritas tinggi:

su -c 'ip route replace 192.168.100.0/24 dev eth0 src 192.168.100.3 table main'
su -c 'ip rule add to 192.168.100.0/24 lookup main priority 100'
# verifikasi:
su -c 'ip route get 192.168.100.1'   # harus jadi: dev eth0 src 192.168.100.3

Rule prioritas 100 dibaca sebelum rule WiFi Android (~10000-an), memaksa paket ke subnet wired lewat eth0.

Catatan operasional: hanya perlu di HP (laptop Arch routing-nya normal). Android sering me-reset rule ini saat layar mati / USB re-enumerate / reboot — jika putus, terapkan ulang (bisa dibuat skrip). ping mungkin tetap gagal jika laptop men-drop ICMP, tapi itu tidak relevan — MPI memakai TCP, bukan ICMP.

Konfigurasi final yang berhasil

Skrip pembungkus di HP (env OpenCL Adreno)

Rank HP butuh env khusus (vendor-first untuk Adreno + preload libc++), sementara laptop tidak boleh terkena. Dibungkus skrip yang men-set env lalu exec app (path di-hardcode karena env spawn bisa kosong):

#!/data/data/com.termux/files/usr/bin/bash
PREFIX=/data/data/com.termux/files/usr
HOME=/data/data/com.termux/files/home
export LD_LIBRARY_PATH=/vendor/lib64:/system/vendor/lib64:/system/lib64:$PREFIX/lib
export LD_PRELOAD=$PREFIX/lib/libc++_shared.so
exec "$HOME/app_arm" "$@"

Simpan sebagai /data/data/com.termux/files/home/phone_launch.sh, lalu chmod +x. (app_arm = matmul yang dikompilasi di HP untuk ARM.)

Perintah peluncuran (MPMD)

mpirun \
  --mca btl_tcp_if_include 192.168.100.0/24 \
  --mca oob_tcp_if_include 192.168.100.0/24 \
  --mca hwloc_base_binding_policy none \
  --prefix /data/data/com.termux/files/usr \
  --host 192.168.100.1,192.168.100.2 -np 2 ./matmul \
  : --host 192.168.100.3 -np 1 /data/data/com.termux/files/home/phone_launch.sh

Penjelasan flag: btl/oob_tcp_if_include mengunci jalur data & kontrol ke subnet wired; hwloc_base_binding_policy none mematikan binding proses (syscall-nya diblok seccomp Android); --prefix tunggal + symlink laptop menyeragamkan path; sintaks : (MPMD) memberi binary berbeda per-arch.

Hasil

Hello World from MPI rank 0/3 on host 'darmogandolz' using OpenCL device 'NVIDIA GeForce RTX 3050 6GB Laptop GPU'
Hello World from MPI rank 2/3 on host 'localhost' using OpenCL device 'QUALCOMM Adreno(TM)'
Hello World from MPI rank 1/3 on host 'tumbal' using OpenCL device 'cpu-ivybridge-AMD A8-6410 APU with AMD Radeon R5 Graphics'
Matrix multiply 512x512 * 512x512 = 512x512 selesai pada 3 proses MPI. Verifikasi: OK ✓

Tiga node, tiga arsitektur/OS, tiga vendor OpenCL, satu job MPI — terverifikasi benar.

Ringkasan

Masalah Penyebab inti Solusi inti
SSH refused (port 22) Termux sshd di port 8022 ~/.ssh/config per-host Port 8022
Kompatibilitas pkg (ternyata cocok: 4.1.5 + pmix3x internal) Pakai pkg apa adanya — tidak perlu build source
orted not found di HP per-context prefix tak propagate + / Android read-only Symlink terbalik (path HP di laptop) + satu --prefix global
TCP gagal / "localhost" Policy routing Android (paket wired lari ke WiFi) ip rule ... lookup main priority 100 + route eth0

Catatan / Pelajaran

  • pkg ternyata cukup. Faktor penentu interop adalah versi + PMIx, dan keduanya match. Flag ifaddrs=no / --disable-dlopen yang ditakutkan tidak mematahkan multi-node (fallback SIOCGIFCONF membaca eth0). Jangan rebuild dari source secara prematur — coba pkg dulu.
  • Blocker terberat justru jaringan Android, bukan MPI. Policy routing yang membypass eth0 adalah penyebab sebenarnya kegagalan TCP, bukan handshake MPI maupun ifaddrs.
  • Android / read-only walau di-root. Karena itu unifikasi path dibalik: buat path HP di laptop (yang writable), bukan sebaliknya.
  • ping ≠ MPI. ping memakai ICMP; banyak host men-drop ICMP tapi menerima TCP. Kegagalan ping bisa menyesatkan — uji TCP langsung (mis. ssh ke host; sampai prompt password pun berarti TCP nyampe).
  • "localhost" itu kosmetik. Hanya hostname default Termux, bukan kegagalan pengalamatan. Jika ingin output rapi, set hostname HP.
  • Per-context --prefix tidak bekerja di OpenMPI 4.1.5 untuk peluncuran orted — hanya satu prefix global. Atasi dengan menyeragamkan path (symlink), bukan mengandalkan prefix per-section.

Lihat pula