Membuat Cluster MPI
Tags: python, mpi, mpi4py
Published: 2022-12-18 13:48:00

Halo👋🏼
Artikel ini akan membahas bagaimana cara membuat **MPI _cluster_** dengan langkah-langkah yang disajikan. Tutorial ini menggunakan Ubuntu 22.04 sebagai _operating system_ yang digunakan.

## 0. Sebelum Bekerja

- Siapkan beberapa komputer. Tentukan satu komputer untuk _master_ dan beberapa komputer untuk _worker_.

- Pastikan seluruh komputer terhubung dalam satu jaringan (misalnya: terhubung dengan Wifi yang sama).

- _Update_ dan _upgrade package_ `sudo apt update && sudo apt upgrade`.

- _Install_ beberapa _package_ sebagai utilitas, yaitu `net-tools` dan `vim` (opsional).

```sh
sudo apt install net-tools vim
```

- Untuk memeriksa IP komputer, gunakan perintah `ifconfig`.

## 1. Konfigurasi File `/etc/hosts`
### 1.1 Untuk Master

Buka _file_ `/etc/hosts` melalui vim (atau vi, nano, yang lainnya). Tambahkan beberapa IP dan aliasnya dari masing-masing komputer. Berikut contohnya.

```sh
192.168.1.100 master
192.168.1.200 worker1
192.168.1.300 worker2
```

### 1.2 Untuk Worker

Sama seperti pada _master_, tambahkan IP dan aliasnya, namun hanya IP _master_ dan IP komputer itu sendiri.

```sh
192.168.1.100 master
192.168.1.200 worker1
```

## 2. Buat User Baru
### 2.1 Buat User

> _Lakukan di **Master** dan **Worker**_

Buat _user_ baru dengan nama yang sama di masing-masing komputer. Saya menamakannya `mpiuser`.

```sh
sudo adduser mpiuser
```

### 2.2 Beri Akses Root

> _Lakukan di **Master** dan **Worker**_

```sh
sudo usermod -aG mpiuser
```

### 2.3 Masuk ke User yang Telah Dibuat

> _Lakukan di **Master** dan **Worker**_
```sh
su - mpiuser
```

## 3. Konfigurasi SSH

Lakukan konfigurasi SSH setelah masuk ke _user_ yang telah dibuat sebelumnya.
### 3.1 Install SSH
> _Lakukan di **Master** dan **Worker**_
```sh
sudo apt install openssh-server
```
Anda dapat menghubungkan komputer dengan SSH.

```sh
ssh <nama user>@<host>
# Misal: ssh mpiuser@worker1
```

### 3.2 Buat Key

> _Lakukan di **Master**_

Ketik perintah di bawah.

```sh
ssh-keygen -t rsa
```

Anda akan diminta memasukkan beberapa _input_, lewati semuanya.

SSH _key_ akan disimpan di direktori `~/.ssh` dalam bentuk `id_rsa` (privasi) dan `id_rsa.pub` (publik).

### 3.3 Salin Key Publik ke Worker

> _Lakukan di **Master**_

_Key_ publik perlu disalin ke masing-masing _worker_ dan disimpan ke dalam _file_ `auhorized_keys`. Hal ini dapat dilakukan di _master_ dengan bantuan SSH.

```sh
cd ~/.ssh
cat id_rsa.pub | ssh <nama user>@<host> "mkdir .ssh; cat >> .ssh/authorized_keys"
```

Ganti `<nama user>` dengan nama _user_ dan `<host>` dengan _worker_. Lakukan perintah ini ke seluruh _worker_.

_File_ `authorized_keys` akan muncul di direktori `~/.ssh`.

## 4. Konfigurasi NFS
### 4.1 Buat Shared Folder

> _Lakukan di **Master** dan **Worker**_

Buat folder dengan nama bebas, misalnya `cloud`. Disarankan untuk meletakkannya di direktori `~/` atau `~/Desktop`.

```sh
mkdir ~/cloud
```

### 4.2 Install NFS Server

> _Lakukan di **Master**_

```sh
sudo apt install nfs-kernel-server
```

### 4.3 Konfigurasi File `/etc/exports`

> _Lakukan di **Master**_

Buka _file_ `/etc/exports` dengan vim `sudo vim /etc/exports` (atau dengan _text editor_ yang lainnya).

Tambahkan baris berkut.

```sh
<shared folder> *(rw,sync,no_root_squash,no_subtree_check)
# Misal: /home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check)
```

Selanjutnya jalankan perintah berikut.

```sh
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
```

### 4.4 Install NFS Client

> _Lakukan di **Worker**_

```sh
sudo apt install nfs-common
```

### 4.5 Mount Folder

> _Lakukan di **Worker**_

```sh
sudo mount <server host>:<shared folder di server> <shared folder di client>
# Misal: sudo mount master:/home/mpiuser/cloud /home/mpiuser/cloud
```

Lakukan percobaan pembuatan _file_/_folder_ di _shared folder_ di salah satu komputer. _File_/_folder_ tersebut seharusnya akan muncul di masing-masing komputer di _folder_ yang sama.

## 5. MPI
### 5.1 Install MPI

> _Lakukan di **Master** dan **Worker**_
```sh
sudo apt install openmpi-bin libopenmpi-dev
```

### 5.2 Install Library `mpi4py`

> _Lakukan di **Master** dan **Worker**_

_Install_ `mpi4py` dengan `pip`. Install package `python3-pip` jika belum memiliki `pip`.

```sh
sudo apt install python3-pip
pip install mpi4py
```

### 5.3 Testing MPI

> _Lakukan di **Master**_

Buat dan edit file `test.py` di _shared folder_ (`cloud`).

```sh
vim ~/cloud/test.py
```

Tabahkan baris berikut.

```py
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
worker = comm.Get_rank()
print("Hello world from worker", str(worker), "of", str(size))
```

Jalankan file `test.py` dengan MPI.

```sh
mpirun -np <jumlah prosesor> -host <daftar host> python3 test.py
# Misal: mpirun -np 3 -host master,worker1,worker2 python3 test.py
```

_Output_:

```sh
Hello world from worker 1 of 4
Hello world from worker 2 of 4
Hello world from worker 0 of 4
```

## Referensi
Tutorial untuk `mpi4py` bisa akses https://mpi4py.readthedocs.io/en/stable/tutorial.html

Referensi lebih lanjut:
- https://towardsdatascience.com/parallel-programming-in-python-with-message-passing-interface-mpi4py-551e3f198053
- https://www.geeksforgeeks.org/creating-an-mpi-cluster/