Contoh SLURM Script

Dari ALELEON by EFISON

Halaman ini menyertakan beberapa contoh SLURM script untuk penggunaan manajemen SLURM dalam berbagai skenario komputasi. User dapat membuat SLURM script dengan text editor kesukaan masing-masing.

Perlu diketahui untuk memperlakukan contoh SLURM script pada halaman ini sebagai panduan, bukan contoh mutlak yang wajib diikuti hingga contoh angka pada parameter resources SBATCH.

SLURM Script untuk Satu Node CPU

Bagian ini memberikan contoh SLURM script yang paling dasar untuk komputasi standar yang berjalan pada satu Compute Node.

Satu Node CPU

Pada contoh dibawah ini, user menjalankan program dengan 32 core CPU.

#!/bin/bash                      

#SBATCH --ntasks=32              # Contoh menggunakan 32 core CPU.
#SBATCH --mem=16GB               # Contoh menggunakan RAM 16GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load rasa_kelapamuda 
./esputer 

Satu Node dengan CPU Threading

User dapat menjalankan komputasi yang menggunakan CPU threading (contoh ketika program menggunakan OMP, OpenBLAS, MKL, BLIS, dll) dengan mendeklarasikan jumlah thread per CPU pada parameter SBATCH cpus-per-task dan nilai variabel SLURM_CPUS_PER_TASK. Total resources CPU threading mengikuti rumus:

Total core CPU terpakai = jumlah core CPU * jumlah thread per core
// pada SLURM:
Total core CPU terpakai = ntasks * cpus-per-task

Pada contoh dibawah ini, user menggunakan 8 core CPU dengan 4 thread per core (total 32 core CPU).

#!/bin/bash                      

#SBATCH --ntasks=8               # Contoh menggunakan 8 core CPU ...
#SBATCH --cpus-per-task=4        # dengan 4 thread per core.
                                 # Sehingga total menggunakan 32 core CPU.
#SBATCH --mem=16GB               # Contoh menggunakan RAM 16GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Contoh menggunakan threading OMP
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

Sebagai tambahan info, user dapat melihat Software HPC AMD untuk panduan lebih lanjut mengenai CPU threading pada library matematika yang tersedia di HPC Aleleon Mk.II.



SLURM Script untuk Komputasi Paralel MPI

User dapat menggunakan MPI default pada HPC Aleleon Mk.II yang telah dioptimasi khusus untuk HPC Aleleon Mk.II melalui modul:

$ module load openmpi

Perintah MPI pada SLURM HPC Aleleon Mk.II

Admin EFISON merekomendasikan user untuk mengikuti format perintah menjalankan MPI berikut pada SLURM script:

mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx <program-user>

Keterangan:

  • Tetap gunakan perintah mpirun, bukan srun yang biasa digunakan pada SLURM.
  • Flag --mca pml ucx --mca osc ucx bertujuan supaya MPI dapat berjalan optimal pada jaringan Mellanox RDMA yang digunakan pada HPC Aleleon Mk.II dengan memanfaatkan protokol UCX (Unified Communication-X).
  • Variabel $SLURM_NTASKS menangkap jumlah core CPU dari parameter SBATCH ntasks sehingga user tidak perlu memasukkan angka mpirun np secara manual.

MPI Satu Node

Konsep SLURM Script untuk komputasi MPI satu node sama dengan SLURM script untuk komputasi standar satu node. Pada contoh dibawah ini, user menjalankan MPI dengan jumlah 32 proses MPI atau memanfaatkan 32 core CPU.

#!/bin/bash                      

#SBATCH --ntasks=32              # Contoh menggunakan 32 core CPU.
#SBATCH --mem=16GB               # Contoh menggunakan RAM 16GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load openmpi rasa_coklat rasa_vanila
mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ./esputer 

MPI Multi Node

Untuk menjalankan MPI multi-node (atau paralel), user harus menggunakan parameter SBATCH --nodes (jumlah node yang digunakan) dan --ntasks-per-node (jumlah core CPU per node) menggantikan --ntasks. Terdapat rule of thumb pada komputasi MPI multi-node:

  • Jumlah proses MPI atau core CPU yang digunakan pada setiap node adalah sama.

Berikut adalah perumusan yang dapat dijadikan panduan user menentukan jumlah core CPU per node:

ntasks-per-node = Total proses MPI / nodes

Contoh dengan acuan jumlah core maksimal per node di HPC Aleleon Mk.II adalah 128:

  • User mau menjalankan program MPI dengan 192 core CPU. Terdapat dua opsi yaitu 2 node dengan 96 core CPU per node atau 3 node dengan 64 core per node.
  • Perlu diketahui bahwa kedua opsi diatas dapat menghasilkan perbedaan performa. Manakah opsi yang lebih baik? Jawabannya tergantung dengan efisiensi coding pada program user. User disarankan untuk menguji kedua opsi dengan file input kecil sebelum menjalankan dengan file input besar atau komputasi sesungguhnya.

Sementara itu terdapat aturan lain untuk SLURM script MPI multi-node:

  • User mengalokasikan RAM per node dengan parameter --mem.
  • Variabel $SLURM_NTASKS pada mpirun -np menangkap total proses MPI (nodes * ntasks-per-node).

Opsi 3 node dengan 64 core per node diilustrasikan pada contoh SLURM script dibawah ini:

#!/bin/bash                      

#SBATCH --nodes=3                # Contoh menggunakan 3 node ...
#SBATCH --ntasks-per-node=64     # dengan 64 core CPU per node.
                                 # Maka dari itu total menggunakan 192 core CPU.
#SBATCH --mem=64GB               # Contoh menggunakan RAM 64GB per node.
#SBATCH --time=02:00:00          # Contoh menetapkan walltime maks 2 jam.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load openmpi rasa_coklat rasa_vanila

# SLURM_NTASKS menangkap total proses MPI (nodes * ntasks-per-node)
mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ./esputer 


SLURM Script untuk Komputasi Hybrid MPI

Komputasi hybrid MPI adalah MPI yang dijalankan bersama dengan CPU threading, entah melalui OpenMP atau library matematika. Total resources komputasi hybrid MPI mengikuti rumus:

Total core CPU terpakai = jumlah proses MPI * jumlah thread per MPI
// pada SLURM:
Total core CPU terpakai = ntasks * cpus-per-task

Rekomendasi Kombinasi Hybrid MPI

Kombinasi jumlah proses MPI dan thread per MPI yang berbeda dapat menghasilkan performa yang berbeda. Misalkan user ingin menjalankan 32 proses hybrid MPI dengan OMP, maka terdapat banyak variasi MPI-OMP: 1-32; 2-16; 4-8; 8-4; 16-2; 32-1. Setiap variasi kombinasi tersebut akan menghasilkan performa berbeda.

Berdasarkan arsitektur AMD Zen2 yang digunakan pada HPC Aleleon Mk.II, EFISON menyarankan jumlah 4 atau 8 untuk thread per MPI.

MPI Hybrid Satu Node

Pada contoh dibawah ini, user menjalankan hybrid MPI - OpenMP dengan 64 core CPU dengan 8 proses MPI dan 8 thread per proses MPI (8 MPI * 8 thread per MPI = 64 core).

#!/bin/bash                      

#SBATCH --ntasks=8               # Contoh menggunakan 8 core CPU atau 8 proses MPI ...
#SBATCH --cpus-per-task=8        # dengan 8 thread per proses MPI.
                                 # Maka dari itu total menggunakan 64 core CPU.
#SBATCH --mem=16GB               # Contoh menggunakan RAM 16GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Contoh menggunakan threading OMP
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load openmpi rasa_coklat rasa_vanila
mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ./esputer 

MPI Hybrid Multi Node

Salah satu aspek tersulit dalam menjalankan komputasi paralel di superkomputer adalah menjalankan komputasi hybrid MPI pada multi-node. Kebanyakan pengguna kesulitan dalam menentukan kombinasi jumlah proses MPI, thread per MPI, dan node untuk mengeluarkan performa terbaik.

Rekomendasi EFISON untuk menentukan kombinasi untuk mengeluarkan performa terbaik:

  • Pilih kombinasi jumlah MPI dan thread per MPI terbaik pada komputasi satu node.
  • Setelah itu naikkan jumlah node.

Jumlah core CPU yang digunakan pada hybrid MPI multi-node mengikuti rumus:

Total core CPU terpakai = (ntasks-per-node * cpus-per-task) * nodes

Pada contoh dibawah ini, user menjalankan hybrid MPI - OpenMP pada 3 node dengan 64 core CPU per node, dimana masing-masing node menggunakan 8 proses MPI dan 8 thread per proses MPI (total 3 nodes * 8 proses MPI per node * 8 thread per MPI = 192 core).

#!/bin/bash                      

#SBATCH --nodes=3                # Contoh menggunakan 3 node ...
#SBATCH --ntasks-per-node=8      # dengan 8 core CPU atau 8 proses MPI ...
#SBATCH --cpus-per-task=8        # plus 8 thread per proses MPI.
                                 # Maka dari itu total menggunakan 192 core CPU.
#SBATCH --mem=64GB               # Contoh menggunakan RAM 64GB.
#SBATCH --time=02:00:00          # Contoh menetapkan walltime maks 2 jam
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Contoh menggunakan threading OMP
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load openmpi rasa_coklat rasa_vanila
mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ./esputer 


SLURM Script untuk Komputasi GPU

Untuk menggunakan Compute Node GPU, user harus menyertakan dua parameter SBATCH berikut:

#SBATCH --partition=gpu_ampere     # Menggunakan Compute Node GPU 

#SBATCH --gres=gpu:1               # Menggunakan 1 GPU
// atau:
#SBATCH --gres=gpu:2               # Menggunakan 2 GPU

Komputasi GPU Biasa

Pada contoh dibawah ini, user menjalankan komputasi GPU menggunakan 2 GPU dan CPU 32 core.

#!/bin/bash                      

#SBATCH --partition=gpu_ampere   # Menggunakan Compute Node GPU
#SBATCH --ntasks=32              # Contoh menggunakan 32 core CPU ...
#SBATCH --gres=gpu:2             # dengan 2 GPU.
#SBATCH --mem=32GB               # Contoh menggunakan RAM 32GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load cuda anaconda3 rasa_durian 
python esputerRahasia.py 

Komputasi GPU MPI

Pada komputasi MPI yang menggunakan GPU, jumlah mpirun -np disamakan dengan jumlah GPU yang dipakai, bukan jumlah ntasks. Pada prakteknya, user harus mendeklarasikan jumlah mpirun tersebut secara manual.

Misalnya pada contoh dibawah ini, user menjalankan komputasi GPU MPI menggunakan 2 GPU dan CPU 8 core. Perhatikan bahwa jumlah proses mpirun adalah 2, bukan 8.

#!/bin/bash                      

#SBATCH --partition=gpu_ampere   # Menggunakan Compute Node GPU
#SBATCH --ntasks=8               # Contoh menggunakan 8 core CPU ...
#SBATCH --gres=gpu:2             # dengan 2 GPU.
#SBATCH --mem=32GB               # Contoh menggunakan RAM 32GB.
#SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
#SBATCH --output=result-%j.out   # Output terminal program.
#SBATCH --error=result-%j.err    # Output verbose program.

# Tulis alur jalannya program user dibawah ini ...
# dan load modul software yang dibutuhkan.

# Contoh (ngawur):
module load openmpi cuda nwchem rasa_mix
mpirun -np 2 --mca pml ucx --mca osc ucx nwchem esputer.nw