Preskočiť na obsah

GROMACS

Popis

GROMACS je všestranný balík na vykonávanie molekulárnej dynamiky pre systémy od stoviek po milióny častíc. Je primárne navrhnutý pre biochemické molekuly ako bielkoviny, lipidy a nukleové kyseliny, ktoré majú veľa zložitých väzbových interakcií, ale keďže GROMACS je extrémne rýchly pri výpočte neväzbových interakcií, dá sa použiť aj na dynamiku nebiologických systémov, ako sú polyméry a dynamika kvapalín.


Oficiálna dokumentácia


Dostupné verzie

Aktuálne sú dostupné nasledujúce verzie GROMACS:

  • Spúšťacie závislosti:
    • Žiadne, požadované knižnice a závislosti sa načítajú automaticky spolu s modulom GROMACS/2024.4-foss-2023b-CUDA-12.4.0.

Modul GROMACS môžete načítať pomocou nasledujúceho príkazu:

module load GROMACS/2024.4-foss-2023b-CUDA-12.4.0

  • Spúšťacie závislosti:
    • Žiadne, požadované knižnice a závislosti sa načítajú automaticky spolu s modulom GROMACS/2025.2-foss-2025a.

Modul GROMACS môžete načítať pomocou nasledujúceho príkazu:

module load GROMACS/2025.2-foss-2025a

  • Spúšťacie závislosti:
    • Žiadne, požadované knižnice a závislosti sa načítajú automaticky spolu s modulom GROMACS/2025.2-foss-2025b-CUDA-12.9.1.

CUDA (GPU) build použitý v GPU príklade spúšťacieho skriptu.

Modul GROMACS môžete načítať pomocou nasledujúceho príkazu:

module load GROMACS/2025.2-foss-2025b-CUDA-12.9.1

GROMACS Benchmark

Aby sme lepšie pochopili, ako GROMACS využíva dostupný hardvér na Devane a ako dosiahnuť dobrý výkon, môžeme preskúmať vplyv výberu počtu MPI rankov na uzol a OpenMP vlákien na výkon softvéru.

Na spustenie benchmarkov bol použitý nasledujúci príkaz:

mpiexec -np "${SLURM_NTASKS}" gmx_mpi mdrun -v -s "${trajectory}.tpr" -ntomp "${SLURM_CPUS_PER_TASK}" -pin on -nsteps 20000 -deffnm "${trajectory}" 

Viac informácií o týchto systémoch nájdete na nasledujúcej stránke.

Info

Jednouzlové benchmarky boli spustené na lokálnom NVMe disku /work/, ktorý je integrovaný

do každého výpočtového uzla a je zvyčajne rýchlejší než zdieľané súborové systémy /home/ a /scratch/.

Benchmarky boli zmerané pre nasledujúce systémy:

Simulácia molekulárnej dynamiky bielkoviny v membrane obklopenej molekulami vody

(81743 atómov so veľkosťou systému 10.8 x 10.2 x 9.6 Å3) s časovým krokom 2fs celkom 40ps. Stiahnuteľné tu.

Výkon na jednom uzle        | Výkon na viacerých uzloch
:------------------------------:|:----------------------------:
![GROMACS_single_node_perf](../../img/shared/GROMACS_speedup_benchMEM.png "Výkon GROMACS na jednom uzle pre benchmark benchMEM") | ![GROMACS_cross_node_perf](../../img/shared/GROMACS_cross_node_perf_benchMEM.png "Výkon GROMACS na viacerých uzloch pre benchmark benchMEM")

Binding affinity benchmark systému bielkovina-ligand obklopeného molekulami vody

(cca 107k atómov) s hodnotením energie v každom kroku (TI). Stiahnuteľné tu.

Výkon na jednom uzle        | Výkon na viacerých uzloch
:------------------------------:|:----------------------------:
![GROMACS_single_node_perf](../../img/shared/GROMACS_speedup_SHP2.png "Výkon GROMACS na jednom uzle pre benchmark SHP2") | ![GROMACS_cross_node_perf](../../img/shared/GROMACS_cross_node_perf_SHP2.png "Výkon GROMACS na viacerých uzloch pre benchmark SHP2")

Binding affinity benchmark väzby bromosporine na bromodomain obklopený molekulami vody

(43952 atómov so veľkosťou systému 8.55 x 8.55 x 6.04 Å3) s časovým krokom 2fs celkom 400ps. Voľná energia sa riadi vektormi init-lambda-state, coul-lambdas a vdw-lambdas, vypočítajú sa všetky 20 lambda stavov, hodnotenie energie sa vykonáva v každom kroku. Stiahnuteľné tu.

Výkon na jednom uzle        | Výkon na viacerých uzloch
:------------------------------:|:----------------------------:
![GROMACS_single_node_perf](../../img/shared/GROMACS_speedup_benchBFI.png "Výkon GROMACS na jednom uzle pre benchmark benchBFI") | ![GROMACS_cross_node_perf](../../img/shared/GROMACS_cross_node_perf_benchBFI.png "Výkon GROMACS na viacerých uzloch pre benchmark benchBFI")

Hybrídna dekompozícia a využívanie uzlov

Výber MPI × OpenMP hybridnej dekompozície má významný vplyv na výkon. V benchmark heatmap diagonály reprezentujú konfigurácie s rovnakým celkovým počtom hardvérových vlákien (alebo Baseline Units, BUs); napríklad najvonkajšia diagonála zodpovedá 64 BUs, nasledujúca 32 BUs a tak ďalej.


Príklad spúšťacieho skriptu

CPU verzia

Tento skript si môžete skopírovať a upraviť na gromacs_run.sh a odoslať úlohu na výpočtový uzol príkazom sbatch gromacs_run.sh.


#!/bin/bash
#SBATCH --job-name=                     # Name of the job
#SBATCH --account=                      # Project account number
#SBATCH --partition=                    # Partition name (short, medium, long)
#SBATCH --nodes=                        # Number of nodes
#SBATCH --ntasks=                       # Total number of MPI ranks
#SBATCH --cpus-per-task=                # Number of threads per MPI rank
#SBATCH --time=hh:mm:ss                 # Time limit (hh:mm:ss)
#SBATCH --output=stdout.%j.out          # Standard output (%j = Job ID)
#SBATCH --error=stderr.%j.err           # Standard error
#SBATCH --mail-type=END,FAIL            # Notifications for job done or failed
#SBATCH --mail-user=                    # Email address for notifications

# === Metadata functions ===
log_job_start() {
    echo "================== SLURM JOB METADATA =================="
    printf " Job ID        : %s\n" "$SLURM_JOB_ID"
    printf " Job Name      : %s\n" "$SLURM_JOB_NAME"
    printf " Partition     : %s\n" "$SLURM_JOB_PARTITION"
    printf " Nodes         : %s\n" "$SLURM_JOB_NUM_NODES"
    printf " Tasks (MPI)   : %s\n" "$SLURM_NTASKS"
    printf " CPUs per Task : %s\n" "$SLURM_CPUS_PER_TASK"
    printf " Account       : %s\n" "$SLURM_JOB_ACCOUNT"
    printf " Submit Dir    : %s\n" "$SLURM_SUBMIT_DIR"
    printf " Work Dir      : %s\n" "$PWD"
    printf " Start Time    : %s\n" "$(date)"
    echo "========================================================"
}

log_job_end() {
    printf " End Time      : %s\n" "$(date)" 
    echo "========================================================"
}

# === Load required module(s) ===
module purge
module load GROMACS/2024.4-foss-2023b-CUDA-12.4.0

# === Set working directories ===
# Use shared filesystems for cross-node calculations
INIT_DIR="${SLURM_SUBMIT_DIR}"
WORK_DIR="/project/${SLURM_JOB_ACCOUNT}/${SLURM_JOB_ID}"
mkdir -p "$WORK_DIR"

# === Input/output file declarations ===
INPUT_FILES=""                          # Adjust as needed
OUTPUT_FILES=""                         # Adjust as needed

# === Copy input files to scratch ===
cp $INPUT_FILES "$WORK_DIR"

# === Change to working directory ===
cd "$WORK_DIR" || { echo "Failed to cd into $WORK_DIR"; exit 1; }

log_job_start >> "$INIT_DIR/jobinfo.$SLURM_JOB_ID.log"

# === Run GROMACS ===
mpiexec -np ${SLURM_NTASKS} gmx mdrun -ntomp ${SLURM_CPUS_PER_TASK} ...

# === Copy output files back ===
cp $OUTPUT_FILES "$INIT_DIR"

# === Optional: clean up scratch ===
# rm -rf "$WORK_DIR"

log_job_end >> "$INIT_DIR/jobinfo.$SLURM_JOB_ID.log"

GPU akcelerované verzie

Podpora GPU je k dispozícii v module GROMACS/2024.4 na Devane.

Tento skript si môžete skopírovať a upraviť na gromacs_run_gpu.sh a odoslať úlohu na výpočtový uzol príkazom sbatch gromacs_run_gpu.sh.


#!/bin/bash
#SBATCH --job-name=                     # Name of the job
#SBATCH --account=                      # Project account number
#SBATCH --partition=gpu                 # GPU-enabled partition
#SBATCH --nodes=                        # Number of nodes
#SBATCH --ntasks=                       # Total number of MPI ranks
#SBATCH --cpus-per-task=                # Number of threads per MPI rank
#SBATCH --gres=gpu:1                    # Request 1 GPU
#SBATCH --time=hh:mm:ss                 # Time limit (hh:mm:ss)
#SBATCH --output=stdout.%j.out          # Standard output (%j = Job ID)
#SBATCH --error=stderr.%j.err           # Standard error
#SBATCH --mail-type=END,FAIL            # Notifications for job done or failed
#SBATCH --mail-user=                    # Email address for notifications

# === Metadata functions ===
log_job_start() {
    echo "================== SLURM JOB METADATA =================="
    printf " Job ID        : %s\n" "$SLURM_JOB_ID"
    printf " Job Name      : %s\n" "$SLURM_JOB_NAME"
    printf " Partition     : %s\n" "$SLURM_JOB_PARTITION"
    printf " Nodes         : %s\n" "$SLURM_JOB_NUM_NODES"
    printf " Tasks (MPI)   : %s\n" "$SLURM_NTASKS"
    printf " CPUs per Task : %s\n" "$SLURM_CPUS_PER_TASK"
    printf " GPU Count     : %s\n" "$SLURM_JOB_NUM_GPUS"
    printf " Account       : %s\n" "$SLURM_JOB_ACCOUNT"
    printf " Submit Dir    : %s\n" "$SLURM_SUBMIT_DIR"
    printf " Work Dir      : %s\n" "$PWD"
    printf " Start Time    : %s\n" "$(date)"
    echo "========================================================"
}

log_job_end() {
    printf " End Time      : %s\n" "$(date)" 
    echo "========================================================"
}

# === Load required module(s) ===
module purge
module load GROMACS/2023.2-intelmkl-CUDA-12.0

# === Set working directories ===
# Use shared filesystems for cross-node calculations
INIT_DIR="${SLURM_SUBMIT_DIR}"
WORK_DIR="/scratch/${SLURM_JOB_ACCOUNT}/${SLURM_JOB_ID}"
mkdir -p "$WORK_DIR"

# === Input/output file declarations ===
INPUT_FILES=""                          # Adjust as needed
OUTPUT_FILES=""                         # Adjust as needed

# === Copy input files to scratch ===
cp $INPUT_FILES "$WORK_DIR"

# === Change to working directory ===
cd "$WORK_DIR" || { echo "Failed to cd into $WORK_DIR"; exit 1; }

log_job_start >> "$INIT_DIR/jobinfo.$SLURM_JOB_ID.log"

# === Run GROMACS ===
mpiexec -np ${SLURM_NTASKS} gmx mdrun -ntomp ${SLURM_CPUS_PER_TASK} -nb gpu ...

# === Copy output files back ===
cp $OUTPUT_FILES "$INIT_DIR"

# === Optional: clean up scratch ===
# rm -rf "$WORK_DIR"

log_job_end >> "$INIT_DIR/jobinfo.$SLURM_JOB_ID.log"

Skript odložuje kratko dosahové neväzbové interakcie na GPU pomocou -nb gpu, čo zaručuje väčšinu zrýchlenia v porovnaní s výlučne CPU výpočtami.

Môžete tiež odložiť:

  • PME výpočty: -pme gpu
  • Väzbové interakcie: -bonded gpu

Viac podrobností nájdete v návod pre GPU výkon GROMACS.

Priradenie GPU

Ručné priraďovanie taskov na konkrétne GPU momentálne nie je podporované. Počet MPI rankov určuje počet spustených GPU taskov, ktoré sa rovnomerne rozložia medzi dostupné GPU.

Created by: Marek Štekláč, Marek Štekláč