Μετάβαση στο περιεχόμενο

NAMD

Το NAMD (NAnoscale Molecular Dynamics) είναι μια εφαρμογή μοριακής δυναμικής υψηλών επιδόσεων, σχεδιασμένη για παράλληλη επεξεργασία. Αναπτύχθηκε από την Ομάδα Θεωρητικής και Υπολογιστικής Βιοφυσικής του Πανεπιστημίου του Illinois, με στόχο την προσομοίωση μεγάλων βιομοριακών συστημάτων. Διατίθεται δωρεάν ως λογισμικό ανοιχτού κώδικα και κλιμακώνεται αποδοτικά σε εκατοντάδες χιλιάδες πυρήνες, ενώ συχνά χρησιμοποιείται σε συνδυασμό με το VMD για την ανάλυση των αποτελεσμάτων.

Για περισσότερες πληροφορίες σχετικά με το λογισμικό, επισκεφθείτε την επίσημη ιστοσελίδα.

Σύνδεση στο Nefeli Cluster

Πριν από οποιαδήποτε ενέργεια, ο χρήστης πρέπει να έχει συνδεθεί επιτυχώς στο Nefeli cluster. Οι οδηγίες σύνδεσης παρέχονται στο ακόλουθο εγχειρίδιο.

NAMD nightly build version 3.0.2

Παράδειγμα χρήσης σε GPU nodes

Στο $HOME μας στο login node, δημιουργούμε ένα νέο φάκελο (έστω namd-test), μεταφερόμαστε εκεί και αντιγράφουμε τα κατάλληλα αρχεία (έστω της πρωτεΐνης bbl) καθώς και τον φάκελο toppar, ο οποίος περιέχει παραμέτρους τύπου Force Field CHARMM36. Όλα τα παραπάνω παρέχονται με την εγκατάσταση του λογισμικού στην κεντρική διαδρομή των εφαρμογών και απαιτείται απλώς η μεταφορά τους στο working directory μας.

mkdir namd-test
cd namd-test
module load namd/gpu-3.0.2
cp $NAMD_EXAMPLES/bbl/topology/* .
cp -r $NAMD_EXAMPLES/../toppar .

Μέσα στο ίδιο working directory, δημιουργούμε και τοποθετούμε το αρχείο εισόδου μας, έστω namd-test.conf στο οποίο ορίζουμε τις παραμέτρους προσομοίωσης του συστήματος. Μερικές από αυτές μπορεί να είναι η θερμοκρασία, το χρονικό βήμα (timestep) καθώς και ο αριθμός των βημάτων για ελαχιστοποίηση ενέργειας (minimization).

Μέσα στο αρχείο εισόδου μας κρίνεται απαραίτητο να δηλώσουμε τις διαδρομές για τα αρχεία παραμέτρων (.prm και .str) που βρίσκονται στον φάκελο toppar.

Δημιουργούμε ή μεταφέρουμε το script για την υποβολή της εργασίας, (έστω namd-case.sh) το οποίο θα εκτελεστεί σε GPU node. O κώδικάς του, παρουσιάζεται αναλυτικά παρακάτω:

SLURM submission script

#!/bin/bash
#SBATCH --job-name=namd-GPU-Job
#SBATCH --partition=a100        
#SBATCH --gres=gpu:1             
#SBATCH --ntasks=1              
#SBATCH --cpus-per-task=8        
#SBATCH --output=output.out    

module load namd/gpu-3.0.2

namd3 +setcpuaffinity +p8 test.conf > test.log

Στη συνέχεια, υποβάλουμε την εργασία με την εντολή sbatch <filename.sh> ως εξής:

  sbatch namd-case.sh

Παρακολουθούμε την εξέλιξη της εργασίας μέσω της εντολής squeue. Εφόσον η εργασία έχει εκκινήσει, μπορούμε να ελέγχουμε την πρόοδο της επίλυσης σε πραγματικό χρόνο:

  tail -f test.log

Η επιτυχής ολοκλήρωση επιβεβαιώνεται από τη δημιουργία των αρχείων εξόδου (όπως το αρχείο τροχιάς .dcd) και από την παρουσία των τιμών ενέργειας ENERGY: στο αρχείο καταγραφής.

Terminal output
# grep "ENERGY:" test.log
Info: ABSOLUTE IMPRECISION IN FAST TABLE ENERGY: 1.69407e-21 AT 11.9974
Info: RELATIVE IMPRECISION IN FAST TABLE ENERGY: 1.13046e-16 AT 11.9974
ENERGY:       0       140.1681       371.6800       356.7853        24.7048         -47678.4135      4292.1724         0.0000         0.0000         0.0000         -42492.9028         0.0000    -42492.9028    -42492.9028         0.0000
ENERGY:       1       166.2011       285.4899       347.8530        11.8055         -48062.3845      4119.4419         0.0000         0.0000         0.0000         -43131.5931         0.0000    -43131.5931    -43131.5931         0.0000
ENERGY:       2       811.0992       411.8933       349.3284        14.8386         -48414.5188      3977.2489         0.0000         0.0000         0.0000         -42850.1103         0.0000    -42850.1103    -42850.1103         0.0000
...                         ...                                ...                               ...
ENERGY:     100        56.7688       175.5095       304.3876         7.8865         -57516.1192      5456.5350         0.0000         0.0000      3006.9770         -48508.0548       112.6213    -51515.0318    -48505.5806       106.2274

Παράδειγμα χρήσης σε CPU nodes

Στο $HOME μας στο login node, δημιουργούμε ένα νέο φάκελο (έστω namd-cpu-test), μεταφερόμαστε εκεί και αντιγράφουμε ολόκληρο τον φάκελο topology, τα αρχεία πρωτεΐνης bbl καθώς και τον φάκελο toppar, ο οποίος περιέχει παραμέτρους τύπου Force Field CHARMM36. Όλα τα παραπάνω παρέχονται με την εγκατάσταση του λογισμικού στην κεντρική διαδρομή των εφαρμογών και απαιτείται απλώς η μεταφορά τους στο working directory μας.

Προετοιμασία Working Directory

mkdir namd-cpu-test
cd namd-cpu-test
module load namd/cpu-3.0.2
cp -r $NAMD_EXAMPLES/bbl/topology .
cp $NAMD_EXAMPLES/bbl/bbl.namd .
cp -r $NAMD_EXAMPLES/../toppar .

sed -i "s|../../|$NAMD_ROOT/lib/namdcph/|g" bbl.namd

Kρίνεται απαραίτητο να τρέξουμε την εντολή sed προκειμένου να βρεθούν αυτόματα και να αντικατασταθούν τα paths της εγκατάστασης.

Δημιουργούμε ή μεταφέρουμε στο working directory το script για την υποβολή της εργασίας, (έστω namd-cpu-case.sh) το οποίο θα εκτελεστεί σε CPU node. O κώδικάς του, παρουσιάζεται αναλυτικά παρακάτω:

SLURM submission script

#!/bin/bash
#SBATCH --job-name=NAMD-CPU
#SBATCH --output=output_cpu.out
#SBATCH --partition=highcpu
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16
#SBATCH --time=00:30:00

module load namd/cpu-3.0.2

echo "Starting NAMD Multicore job on $(hostname)"
export CONFIG_FILE="bbl.namd"

# NAMD runs using 16 CPUs
namd3 +setcpuaffinity +p$SLURM_CPUS_PER_TASK bbl.namd > test_cpu.log

Στη συνέχεια, υποβάλουμε την εργασία με την εντολή sbatch <filename.sh> ως εξής:

  sbatch namd-cpu-case.sh

Εφόσον η εργασία έχει εκκινήσει, μπορούμε να ελέγχουμε την πρόοδο της επίλυσης σε πραγματικό χρόνο μέσω της εντολής squeue.

```bash squeue -u username

```

Terminal output
JOBID   PARTITION NAME     USER       TIME   TIME_LIMIT ST   NODES   CPUS
11928   highcpu NAMD-CPU   username   1:19   30:00      CF   1       16   

Το NAMD ανακατευθύνει (redirects) την έξοδο της προσομοίωσης σε ένα νέο αρχείο με όνομα bbl-test.log. Επομένως, για να δούμε τα αποτελέσματα, τρέχουμε την εντολή grep όπως ακριβώς φαίνεται παρακάτω.

Terminal output
# grep "ENERGY:" bbl-test.log
ENERGY:       0       147.4506       384.8399       364.3042        25.1318         -51026.1306      4215.9813         0.0000         0.0000         0.0000         -45888.4227         0.0000    -45888.4227    -45888.4227         0.0000          19070.5958    -20174.8179    129726.3581     19070.5958    -20174.8179
ENERGY:       1        80.6371       304.0900       357.8785        15.5778         -51195.1088      4105.9046         0.0000         0.0000         0.0000         -46331.0208         0.0000    -46331.0208    -46331.0208         0.0000          18957.9009       216.3024    129726.3581     18957.9009       216.3024
...                         ...                              ...                              ...
ENERGY:     200        50.4170       140.6313       311.3595         6.1362         -58430.6193      3970.8185         0.0000         0.0000         0.0000         -53951.2567         0.0000    -53951.2567    -53951.2567         0.0000          17740.2093     17703.2098    129726.3581     17740.2093     17703.2098
Γιατί καθυστερεί η ολοκλήρωση της διεργασίας μου κατά την εκτέλεση σε CPU node;

Είναι απολύτως φυσιολογικό η προσομοίωσή σας να χρειάζεται πολλαπλάσιο χρόνο για να ολοκληρωθεί σε ένα CPU Partition σε σύγκριση με ένα GPU Partition. Μια GPU μπορεί να υπολογίσει χιλιάδες ζεύγη ατομικών αλληλεπιδράσεων την ίδια ακριβώς στιγμή, ενώ η CPU πρέπει να τα επεξεργαστεί σε πολύ μικρότερες "δόσεις". Αν ο χρόνος είναι κρίσιμος παράγοντας για την έρευνά σας, συνιστάται η αξιοποίηση των GPU nodes του cluster.

Γιατί στο παραπάνω αρχείο test_cpu.log τυπώνονται σφάλματα;

Τα έτοιμα παραδείγματα CpH που παρέχονται από το NAMD, είναι συχνά προγραμματισμένα να αναζητούν από προεπιλογή πόρους GPU για τα ενδιάμεσα βήματα υπολογισμών (π.χ. τα βήματα Monte Carlo που συμβαίνουν κάθε 100 steps). Ακόμα κι αν έχουμε φορτώσει σωστά το CPU module, το εσωτερικό script της προσομοίωσης θα αναζητήσει συγκεκριμένες μεταβλητές περιβάλλοντος όπως τα GPU_PATH και CONFIG_FILE για να κάνει επανεκκίνηση της διεργασίας. Εάν αυτές οι μεταβλητές είναι κενές, η προσομοίωση θα διακοπεί απότομα, τυπώνοντας ένα σφάλμα τύπου Environment variable GPU_PATH not specified. Για να παρακάμψουμε αυτή τη συμπεριφορά και να υποδείξουμε στο script ότι πρέπει να εκτελεστεί αποκλειστικά σε CPU, πρέπει να ορίσουμε ρητά τις απαραίτητες μεταβλητές μέσα στο Slurm script μας.