Contoh SLURM Script: Perbedaan antara revisi

Dari ALELEON by EFISON
(major update pada MPI)
(→‎SLURM Script untuk Komputasi GPU: menambahkan bagian GPU)
Baris 72: Baris 72:
  # dan load modul software yang dibutuhkan.
  # dan load modul software yang dibutuhkan.
   
   
# Contoh (ngawur):
  module load openmpi rasa_coklat rasa_vanila
  module load openmpi rasa_coklat rasa_vanila
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
Baris 106: Baris 107:
  # dan load modul software yang dibutuhkan.
  # dan load modul software yang dibutuhkan.
   
   
# Contoh (ngawur):
  module load openmpi rasa_coklat rasa_vanila
  module load openmpi rasa_coklat rasa_vanila
   
   
Baris 140: Baris 142:
  # dan load modul software yang dibutuhkan.
  # dan load modul software yang dibutuhkan.
   
   
# Contoh (ngawur):
  module load openmpi rasa_coklat rasa_vanila
  module load openmpi rasa_coklat rasa_vanila
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
Baris 171: Baris 174:
  # dan load modul software yang dibutuhkan.
  # dan load modul software yang dibutuhkan.
   
   
# Contoh (ngawur):
  module load openmpi rasa_coklat rasa_vanila
  module load openmpi rasa_coklat rasa_vanila
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt
Baris 176: Baris 180:
== '''SLURM Script untuk Komputasi GPU''' ==
== '''SLURM Script untuk Komputasi GPU''' ==
Untuk menggunakan Compute Node GPU, user harus menyertakan dua parameter SBATCH berikut:
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
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 rasa_durian
python esputerRahasia.py >> resep_rahasia.txt

Revisi per 10 September 2021 10.24

Halaman ini menyertakan beberapa contoh SLURM script untuk penggunaan 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 >> resep_rahasia.txt

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 >> resep_10_liter.txt

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 >> resep_10_liter.txt

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 >> resep_10_liter.txt

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 >> resep_10_liter.txt

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

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 rasa_durian 
python esputerRahasia.py >> resep_rahasia.txt