Jump to content

OpenMPI Multinode Troubleshooting

From Haidhi Wiki

Catatan: Halaman ini mendokumentasikan proses membangun cluster OpenMPI heterogen (2 laptop x86_64, rencana ditambah HP Android ARM64) dari masalah build OpenMPI sampai masalah koneksi antar-node. Tiap masalah ditulis dengan format Gejala / Penyebab / Solusi. Nilai-nilai (hostname, IP, path) di sini adalah contoh dari setup nyata; sesuaikan dengan punyamu.

Cluster yang dibahas terdiri dari dua laptop yang dihubungkan lewat switch kabel (LAN khusus), masing-masing menjalankan OpenMPI 4.1.5 dari source. Tujuannya menjalankan program MPI + OpenCL (matmul terdistribusi) di mana tiap rank memakai device OpenCL berbeda (GPU NVIDIA di satu node, CPU pocl di node lain).

Lingkungan

Komponen Master (darmogandolz) Node (tumbal / mpi-node1-amd-a8)
Arsitektur x86_64 x86_64
OS Arch Linux Arch Linux
CPU/Device OpenCL NVIDIA GeForce RTX 3050 (GPU) AMD A8-6410 APU via pocl (CPU)
OpenMPI 4.1.5 (build dari source) 4.1.5 (build dari source)
Prefix instalasi /home/haidhi/ompi4 /home/haidhi/ompi4
NIC kabel (cluster) enp8s0 → 192.168.100.1/24 eno1 → 192.168.100.2/24
NIC wifi (internet) wlp0s20f3 → 192.168.1.130/24 wlo1 → 192.168.1.156/24

Catatan penting: kedua mesin multi-homed punya dua jaringan aktif sekaligus (kabel dan wifi). Fakta ini jadi sumber salah satu masalah di bawah.

Ikhtisar masalah

# Tahap Gejala singkat
1 Build call to undeclared function 'realloc' (Clang 16+)
2 Build incompatible integer to pointer conversion pada backtrace_symbols
3 Launch orted: command not found
4 Launch Data unpack had inadequate space ... plm_base_launch_support.c
5 Koneksi connect() to ... failed, Operation now in progress (115)

Bagian 1: Build OpenMPI

Awalnya OpenMPI 5.0.10 dicoba di-build langsung di Termux (Android). Dua error muncul. Pada akhirnya diputuskan tidak memakai v5 di HP, tapi pencatatan ini tetap berguna karena penyebabnya umum di toolchain modern.

Masalah 1: realloc undeclared (Clang 16+)

Gejala

Saat make, kompilasi gagal:

error: call to undeclared function 'realloc'; ISO C99 and later
do not support implicit function declarations

Penyebab

Clang versi 16 ke atas mengubah -Wimplicit-function-declaration dari warning menjadi error (mengikuti C99). Beberapa berkas sumber memanggil fungsi tanpa #include header yang tepat pada lingkungan Android; di compiler lama ini cuma warning, di Clang baru jadi fatal.

Solusi

Turunkan kembali jadi warning lewat CFLAGS, lalu reconfigure:

export CFLAGS="-Wno-implicit-function-declaration"
./configure --prefix=$HOME/ompi ...   # ulang configure agar CFLAGS terpakai
make -j$(nproc)

Aman, karena Clang tetap memakai signature builtin yang benar untuk fungsi standar seperti realloc; yang dimatikan hanya pengetatan diagnostiknya.

Masalah 2: backtrace_symbols (execinfo)

Gejala

error: incompatible integer to pointer conversion ...
(pada kode yang memakai backtrace() / backtrace_symbols())

Penyebab

bionic (libc Android) baru meng-expose <execinfo.h> pada API level ≥ 33. Pada target API Termux yang lebih rendah, deklarasi fungsinya disembunyikan walaupun symbol-nya sebenarnya ada di device Android 13. Karena deklarasi hilang, compiler menebak tipe return jadi int → muncul konversi int-ke-pointer.

Solusi

Beberapa opsi:

# Opsi A: matikan diagnostik (backtrace jadi agak rusak, hanya dipakai saat crash)
export CFLAGS="$CFLAGS -Wno-int-conversion"

# Opsi B: paksa target API agar header execinfo terbuka
export CFLAGS="$CFLAGS -D__ANDROID_API__=33"

Atau yang dipilih akhirnya: hindari masalah ini sama sekali dengan mem-build OpenMPI di laptop, bukan di HP.

Keputusan: standardisasi OpenMPI 4.1.5

Karena build v5 di Termux rewel, diambil keputusan:

  • Laptop: build OpenMPI 4.1.5 dari source ke prefix khusus.
  • HP: tetap pakai paket Termux (juga seri v4).

Alasan tambahan ada di bagian berikutnya: antar-node, versi MPI wajib cocok.

Syarat: versi & build harus identik antar-node

Kondisi Kompatibel?
Beda MAJOR (mis. 4.x vs 5.x) Tidak v4 memakai ORTE, v5 memakai PRRTE; arsitektur runtime beda total
Sama MAJOR.MINOR, beda PATCH Biasanya jalan, tapi tidak dijamin
Identik (versi + opsi build) Paling aman

Pola build yang dipakai (langkah identik di tiap laptop):

tar xf openmpi-4.1.5.tar.bz2 && cd openmpi-4.1.5
./configure --prefix=$HOME/ompi4 \
    --enable-orterun-prefix-by-default \
    --with-pmix=internal \
    --with-hwloc=internal \
    --with-libevent=internal
make -j$(nproc) && make install

Memaksa pmix/hwloc/libevent ke versi internal (bawaan tarball) membuat tiap build self-contained dan dijamin sama wire-format-nya antar-node relevan untuk Masalah 4.

Bagian 2 Launch & koneksi multi-node

Masalah 3: orted: command not found

Gejala

bash: line 1: orted: command not found
--------------------------------------------------------------------------
ORTE was unable to reliably start one or more daemons.
--------------------------------------------------------------------------

Penyebab

Dua hal yang menumpuk:

  1. Dua instalasi OpenMPI di mesin yang sama (~/ompi dan ~/ompi4). PATH menunjuk ke salah satu, padahal yang di-rebuild / di-configure adalah yang lain. Gejalanya: which mpirun menunjukkan folder berbeda dari yang dikira.
  2. Sesi SSH non-interaktif tidak punya OpenMPI di PATH. Saat mpirun SSH ke node remote untuk menjalankan orted, shell non-interaktif tidak menemukan orted. Penyebabnya, banyak ~/.bashrc punya baris di awal:
[[ $- != *i* ]] && return   # keluar lebih dulu kalau non-interaktif
Bash memang membaca ~/.bashrc saat dipanggil sshd, tetapi export PATH=... yang ditaruh setelah baris itu jadi terlewat.

Solusi

Cara 1 (disarankan) --prefix:

mpirun --prefix /home/haidhi/ompi4 --hostfile hostfile -np 2 ./app

--prefix membuat mpirun memanggil orted remote lewat path lengkap sekaligus men-set LD_LIBRARY_PATH-nya, jadi PATH remote tidak relevan. Node remote tidak perlu disentuh. Syarat: remote punya OpenMPI di path yang sama. (Atau build dengan --enable-orterun-prefix-by-default agar otomatis.)

Cara 2 perbaiki .bashrc remote: Taruh export di paling atas ~/.bashrc remote, di atas baris interactive-guard:

# baris paling atas ~/.bashrc
export PATH=$HOME/ompi4/bin:$PATH
export LD_LIBRARY_PATH=$HOME/ompi4/lib:$LD_LIBRARY_PATH

Uji: ssh NODE 'which orted' harus memunculkan path-nya.

Bersihkan ambiguitas: pilih satu instalasi, hapus yang lain (rm -rf ~/ompi), dan samakan PATH di semua tempat. Dua instalasi yang hidup berdampingan adalah akar dari kebingungan ini (dan Masalah 4).

Masalah 4: Data unpack had inadequate space

Gejala

[host:NNN] [[X,0],0] ORTE_ERROR_LOG: Data unpack had inadequate space
in file base/plm_base_launch_support.c at line 1213
--------------------------------------------------------------------------
ORTE was unable to reliably start one or more daemons.
--------------------------------------------------------------------------

Penyebab

Ketidakcocokan wire-format antara mpirun (lokal) dan orted (remote) saat handshake peluncuran. Pesan ini adalah tanda khasnya. Urutan kemungkinan penyebab:

  1. Beda versi OpenMPI antar-node (paling sering).
  2. Versi sama, tapi beda build mis. PMIx/hwloc/libevent internal di satu node, eksternal (paket sistem) di node lain. Protokol launch OpenMPI 4.x lewat PMIx, jadi PMIx beda → struktur pesan beda.
  3. mpirun yang benar-benar jalan ambigu ini kasus nyatanya: ada dua instalasi (~/ompi vs ~/ompi4), dan job ter-launch dengan mpirun dari satu instalasi tetapi orted dari instalasi lain (lewat --prefix yang menunjuk folder berbeda).

Diagnosis

Bandingkan versi dan build di kedua sisi:

# versi
/home/haidhi/ompi4/bin/mpirun --version
ssh NODE '/home/haidhi/ompi4/bin/mpirun --version'

# build + PMIx (perhatikan baris "Configure command line")
/home/haidhi/ompi4/bin/ompi_info | grep -iE 'configure command|pmix'
ssh NODE '/home/haidhi/ompi4/bin/ompi_info | grep -iE "configure command|pmix"'

Pada kasus ini versi (4.1.5), configure command line, dan PMIx (pmix3x internal) ternyata identik di dua node jadi yang salah bukan build ompi4-nya, melainkan mpirun mana yang dipakai.

Solusi

Buang ambiguitas: paksa lokal = ompi4 lewat path lengkap + LD_LIBRARY_PATH eksplisit, dan pastikan semua node memakai instalasi identik di path sama:

LD_LIBRARY_PATH=/home/haidhi/ompi4/lib \
/home/haidhi/ompi4/bin/mpirun --prefix /home/haidhi/ompi4 \
  --hostfile hostfile -np 2 ./app

Kalau memang build-nya beda dependency: rebuild semua node dengan --with-pmix=internal --with-hwloc=internal --with-libevent=internal agar self-contained dan seragam (lihat bagian standardisasi). Solusi permanen: kunci path mpirun di Makefile (lihat Konfigurasi final).

Masalah 5: connect() Operation now in progress (115)

Gejala

Kedua rank launch dan device OpenCL terdeteksi, tapi lalu:

WARNING: Open MPI failed to TCP connect to a peer MPI process.
  Local host: tumbal
  Message:    connect() to 192.168.1.130:1024 failed
  Error:      Operation now in progress (115)

Penyebab

  • Mesin multi-homed. Kedua node punya dua jaringan UP: kabel 192.168.100.x (switch cluster) dan wifi 192.168.1.x (router rumah). mpirun polos mencoba semua interface dan nyasar ke wifi. Perhatikan IP gagal 192.168.1.130 itu IP wifi master.
  • "Operation now in progress" (bukan "connection refused") berarti paket di-DROP, bukan ditolak ciri khas firewall (atau AP isolation di router). SSH (port 22) terbuka sehingga launch berhasil, tapi port ephemeral MPI diblok.

Solusi

1. Pin OpenMPI ke subnet cluster (pakai CIDR agar aman walau nama interface beda di tiap node):

mpirun --prefix /home/haidhi/ompi4 \
  --mca btl_tcp_if_include 192.168.100.0/24 \
  --mca oob_tcp_if_include 192.168.100.0/24 \
  --hostfile hostfile -np 2 ./app

btl_tcp_if_include mengunci jalur data antar-rank; oob_tcp_if_include mengunci jalur kontrol (orted ↔ mpirun). Keduanya perlu.

2. Buka firewall untuk subnet cluster (atau matikan saat menguji):

sudo systemctl is-active firewalld nftables ufw 2>/dev/null   # cek yang aktif
sudo ufw allow from 192.168.100.0/24                          # ufw
sudo firewall-cmd --zone=trusted --add-source=192.168.100.0/24 # firewalld (+ --permanent)

3. Rapikan hostfile jangan campur IP dan hostname yang bisa resolve ke wifi. Cek dulu:

getent hosts mpi-node1-amd-a8   # pastikan menunjuk ke IP kabel, bukan wifi

Pakai IP kabel secara konsisten (lihat Konfigurasi final).

Konfigurasi final yang berhasil

hostfile

192.168.100.1   slots=1
192.168.100.2   slots=1

Memakai IP kabel di kedua baris membuat topologi eksplisit dan menghilangkan ketergantungan pada resolusi hostname (yang bisa nyasar ke wifi).

Makefile (target run-host)

OMPI_PREFIX ?= /home/haidhi/ompi4
MPIRUN      ?= $(OMPI_PREFIX)/bin/mpirun
CLUSTER_NET ?= 192.168.100.0/24

run-host:
	$(MPIRUN) --prefix $(OMPI_PREFIX) \
	  --mca btl_tcp_if_include $(CLUSTER_NET) \
	  --mca oob_tcp_if_include $(CLUSTER_NET) \
	  --hostfile $(HOSTFILE) -np $(NP) $(TARGET) $(M) $(K) $(N)

Memakai path lengkap MPIRUN mematikan ambiguitas ompi-vs-ompi4 secara permanen. (Ingat: baris recipe Makefile harus di-indent TAB, bukan spasi.)

Hasil

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

Ringkasan

Masalah Penyebab inti Solusi inti
realloc undeclared Clang 16+ menjadikan implicit-decl sebagai error CFLAGS="-Wno-implicit-function-declaration" + reconfigure
backtrace_symbols int-conversion execinfo bionic hanya pada API ≥ 33 -Wno-int-conversion / -D__ANDROID_API__=33, atau build di laptop
orted: command not found Dua instalasi + PATH SSH non-interaktif kosong --prefix (atau prefix-by-default); rapikan jadi satu instalasi
Data unpack had inadequate space Wire-format mismatch (versi/build/instalasi beda) Path lengkap mpirun + instalasi identik di semua node
connect() ... in progress (115) Multi-homed → nyasar ke wifi + firewall --mca btl/oob_tcp_if_include ke subnet kabel + buka firewall

Catatan

  • Mesin multi-homed wajib di-pin. Begitu sebuah node punya lebih dari satu interface (wifi, kabel, docker0, virbr0), OpenMPI harus diberi tahu subnet mana yang dipakai lewat btl_tcp_if_include dan oob_tcp_if_include.
  • "In progress" vs "refused". Operation now in progress (115) = paket di-DROP (firewall / isolasi). Connection refused = sampai ke host tapi tidak ada yang listen. Bedanya menentukan arah perbaikan.
  • SSH jalan ≠ MPI jalan. Launch lewat SSH (port 22) dan komunikasi MPI (port ephemeral) adalah jalur berbeda; firewall bisa membuka satu dan memblok yang lain.
  • Satu instalasi saja. Memiliki ~/ompi dan ~/ompi4 sekaligus adalah sumber Masalah 3 dan 4. Pilih satu, hapus sisanya, dan kunci path-nya di Makefile.
  • Identik antar-node. Versi + opsi build yang sama di semua node mencegah Data unpack error. Build dengan dependency internal membuatnya seragam tanpa bergantung paket sistem tiap mesin.
  • Skala ke HP. Saat node Android ditambahkan, pastikan ia mendapat IP 192.168.100.x di switch yang sama; karena beda arsitektur (ARM64 vs x86_64), program perlu di-launch sebagai binary terpisah per-arch (MPMD).

Lihat pula