Hyppää sisältöön

Significant changes to Puhti & Mahti authentication coming in April! Read about the SSH key and multi-factor authentication requirements.

Suurelaskentainen laskenta GROMACSin kanssa

Huomio

Suurelaskentaiset simulaatiot voivat helposti tuottaa paljon dataa, joten suunnittele datanhallintasi (datavirta, tallennustarpeet) ja analyysiputket etukäteen. Älä epäröi ottaa yhteyttä CSC-palvelupisteeseen, jos olet epävarma mistään työnkulkuusi liittyvästä asiasta.

GROMACS sisältää sisäänrakennetun multidir-toiminnallisuuden, joka mahdollistaa useiden samanaikaisten simulaatioiden suorittamisen yhden Slurm-varauksen sisällä. Tämä on erinomainen vaihtoehto suurelaskentaisille käyttötilanteille, joissa tavoitteena on suorittaa useita samanlaisia, mutta riippumattomia, tehtäviä. Merkittävästi, useita sbatch tai srun komentoja ei tarvita, mikä vähentää eräjonojärjestelmän kuormitusta. Mieti tätä vaihtoehtoa, jos suoritat suurelaskentaisia työnkulkuja tai tehostettuja näytteenottoja, kuten replikanvaihtoa tai vapaan energian simulaatioita ensemblepohjaisia etäisyys- tai orientaatiorajoituksia käyttäen.

Toinen multidir hyöty on, että sitä voidaan käyttää pienten järjestelmien rinnakkaistehokkuuden lisäämiseen. Käynnistämällä useita trajektoreja per GPU (tai CPU-solmu), jokaisen riippumattoman simulaation kokonaisteho kasvaa paremman resurssien hyödyntämisen kautta. Tämä on erityisen hyödyllistä pienten järjestelmien suorituskyvyn maksimoimiseksi LUMI-G:llä sekä Mahtissa, missä vain kokonaisia CPU-solmuja voidaan varata.

Esimerkki eräkäsittelyskripti Mahtille

Tämä esimerkki mukauttaa lysozyma-tutoriaalin tuotanto-osan huomioimalla 8 samankaltaista järjestelmän kopiota, jotka on tasapainotettu erilaisilla nopeusinitiaalilla. Kunkin kopion syötteet on nimetty identtisesti md_0_1.tpr ja sijoitettu alihakemistoihin run* kuten alla kuvataan tree-komennon tuloksena.

$ tree
.
├── multidir.sh
├── run1
│   └── md_0_1.tpr
├── run2
│   └── md_0_1.tpr
├── run3
│   └── md_0_1.tpr
├── run4
│   └── md_0_1.tpr
├── run5
│   └── md_0_1.tpr
├── run6
│   └── md_0_1.tpr
├── run7
│   └── md_0_1.tpr
└── run8
    └── md_0_1.tpr
#!/bin/bash
#SBATCH --time=00:30:00
#SBATCH --partition=medium
#SBATCH --ntasks-per-node=128
#SBATCH --nodes=1
#SBATCH --account=<project>

# tämä skripti suorittaa 128 ytimisen gromacs multidir työtä (8 simulaatiota, 16 ydintä per simulaatio)

module purge
module load gromacs-env

export OMP_NUM_THREADS=1

srun gmx_mpi mdrun -multidir run* -s md_0_1.tpr -dlb yes

Antamalla komennon sbatch multidir.sh päähakemistossa, kaikki simulaatiot suoritetaan samanaikaisesti käyttäen yhtä kokonaista Mahti-solmua ilman hyperlangoitusta siten, että jokaiselle järjestelmälle annetaan 16 ydintä. Koska järjestelmät alustoitettiin eri nopeuksilla, saamme 8 erilaista trajektoria ja parannetun vaiheavaruuden näytteenoton (katso RMSD-analyysi alla). Tämä on hyvä tapa nopeuttaa näytteenottoa, jos järjestelmäsi ei skaalaudu kokonaiseen Mahti-solmuun.

Simuloitujen replikaatioiden keskineliöjuuripoikkeamat

Esimerkki eräkäsittelyskripti LUMI:lle

Keskikokoiset ja suuret järjestelmät (muutamia 100k–1M+ atomeja) kykenevät tyypillisesti hyödyntämään useita GPU:ita LUMI:lla tehokkaasti. Monet pienemmät käyttötilanteet toimivat hyvin myös yhdellä GCD:llä (puoli GPU:ta), mutta mitä pienemmäksi järjestelmä saa, sitä huonommin se pystyy hyödyntämään kiihdyttimen koko kapasiteettia.

multidir-ominaisuudella voidaan lisätä pienten järjestelmien GPU:n hyödyntämistä ajamalla useita trajektoreita per GCD. Alla on esimerkki eräkäsittelyskriptistä, joka käynnistää 4 trajektoria per GCD kahden GPU-solmun (16 GCD:n) resurssivarauksessa. Kukin 64 .tpr-tiedostoista on järjestetty erillisiin hakemistoihin run1 kautta run64, kuten Mahti-esimerkin kanssa yllä.

#!/bin/bash
#SBATCH --partition=standard-g
#SBATCH --account=<project>
#SBATCH --time=01:00:00
#SBATCH --nodes=2
#SBATCH --gpus-per-node=8
#SBATCH --ntasks-per-node=32

module use /appl/local/csc/modulefiles
module load gromacs/2024.4-gpu

export OMP_NUM_THREADS=1

export MPICH_GPU_SUPPORT_ENABLED=1
export GMX_ENABLE_DIRECT_GPU_COMM=1
export GMX_FORCE_GPU_AWARE_MPI=1

cat << EOF > select_gpu
#!/bin/bash

export ROCR_VISIBLE_DEVICES=\$((SLURM_LOCALID%SLURM_GPUS_PER_NODE))
exec \$*
EOF

chmod +x ./select_gpu

CPU_BIND="mask_cpu:fe000000000000,fe00000000000000"
CPU_BIND="${CPU_BIND},fe0000,fe000000"
CPU_BIND="${CPU_BIND},fe,fe00"
CPU_BIND="${CPU_BIND},fe00000000,fe0000000000"

srun --cpu-bind=${CPU_BIND} ./select_gpu gmx_mpi mdrun -s topol -nb gpu -bonded gpu -pme gpu -update gpu -multidir run*

Huomaa, että pyydettyjen MPI-tehtävien määrän tulisi olla jaollinen itsenäisten syötteiden määrällä, tässä tapauksessa 1 tehtävä per syöte. Koska LUMI-G solmussa on vain 56 CPU-ydintä käytettävissä, käytämme vain yhtä säiettä per tehtävä. Lisätietoja CPU-GPU sitomisesta löytyy GROMACS-sovellussivulta sekä LUMI-dokumenteista.

Alla oleva kuvaaja näyttää kokonaisläpäisyn, joka saadaan ajamalla useita replikaatioita 96k atomin alkoholi dehydrogenaasi (ADH) benchmarkista kahdella LUMI-G solmulla (2 fs aikajakso). Kun trajektorien määrä per GCD nostetaan yhdestä neljään, kokonaisuus suorituskyky (jokaisen riippumattoman trajektorin summa) kasvaa noin yhden mikrosekunnin päivässä paremman GPU:n hyödyntämisen ansiosta. Koska kukin simulaatio on itsenäinen, tätä käyttötapausta voitaisiin laajentaa suurelle solmujoukolle maksimaalisen läpäisyn saamiseksi.

GCD-jako LUMI-G:llä multidir-toiminnolla

Lisätietoa