Contoh SLURM Script: Perbedaan antara revisi

Dari ALELEON by EFISON
(Menambahkan bagian MPI)
(major update pada MPI)
Baris 4: Baris 4:


== '''SLURM Script untuk Satu Node CPU''' ==
== '''SLURM Script untuk Satu Node CPU''' ==
Bagian ini memberikan contoh SLURM script yang paling dasar untuk komputasi standar yang berjalan pada satu Compute Node. Pada contih dibawah ini, user menjalankan program pada 32 core 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                       
  #!/bin/bash                       
   
   
Baris 17: Baris 20:
   
   
  # Contoh (ngawur):
  # Contoh (ngawur):
  module load rasakelapamuda
  module load rasa_kelapamuda
  ./esputer >> resep_rahasia.txt
  ./esputer >> resep_rahasia.txt


=== '''Satu Node dengan CPU Threading''' ===
=== '''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 CPU threading pada '''parameter SBATCH cpus-per-task''' dan '''nilai''' '''variabel SLURM_CPUS_PER_TASK.''' Pada contoh dibawah ini, user menjalankan 32 threading per 1 core CPU.
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                       
  #!/bin/bash                       
   
   
  #SBATCH --ntasks=1               # Contoh menggunakan 1 core CPU ...
  #SBATCH --ntasks=8               # Contoh menggunakan 8 core CPU ...
  '''#SBATCH --cpus-per-task='''32      # dengan 32 threading per core.
  '''#SBATCH --cpus-per-task=4'''       # dengan 4 thread per core.
                                  # Sehingga total menggunakan 32 core CPU.
  #SBATCH --mem=16GB              # Contoh menggunakan RAM 16GB.
  #SBATCH --mem=16GB              # Contoh menggunakan RAM 16GB.
  #SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
  #SBATCH --time=00:30:00          # Contoh menetapkan walltime maks 30 menit.
Baris 72: Baris 80:
* '''Jumlah proses MPI atau core CPU yang digunakan pada setiap node adalah sama.'''
* '''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 dan node:
Berikut adalah perumusan yang dapat dijadikan panduan user menentukan jumlah core CPU per node:
'''Total proses MPI''' = nodes * ntasks-per-node
// atau:
  '''ntasks-per-node''' = Total proses MPI / nodes
  '''ntasks-per-node''' = Total proses MPI / nodes
Contoh dengan acuan jumlah core maksimal per node di HPC Aleleon Mk.II adalah 128:
Contoh dengan acuan jumlah core maksimal per node di HPC Aleleon Mk.II adalah 128:
Baris 83: Baris 89:
Sementara itu terdapat aturan lain untuk SLURM script MPI multi-node:  
Sementara itu terdapat aturan lain untuk SLURM script MPI multi-node:  


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


Baris 91: Baris 97:
  #SBATCH --nodes=3                # Contoh menggunakan 3 node ...
  #SBATCH --nodes=3                # Contoh menggunakan 3 node ...
  #SBATCH --ntasks-per-node=64    # dengan 64 core CPU per 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 --mem=64GB              # Contoh menggunakan RAM 64GB per node.
  #SBATCH --time=02:00:00          # Contoh menetapkan walltime maks 2 jam.
  #SBATCH --time=02:00:00          # Contoh menetapkan walltime maks 2 jam.
Baris 101: Baris 108:
  module load openmpi rasa_coklat rasa_vanila
  module load openmpi rasa_coklat rasa_vanila
   
   
  # SLURM_NTASKS dibawah ini menangkap total proses MPI (nodes * ntasks-per-node)
  # 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
  '''mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx''' ./esputer >> resep_10_liter.txt


== '''SLURM Script untuk Komputasi Hybrid MPI/OMP''' ==
== '''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.
 
[https://wiki.efisonlt.com/wiki/Software_HPC_AMD#Threading_di_AMD_Zen2_dan_Contoh_SLURM_Script '''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.
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.
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''' ==
== '''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:

Revisi per 10 September 2021 10.05

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.

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.

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.

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.

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: