MPI εργασίες με Python¶
Μία σύντομη εισαγωγή στον παράλληλο προγραμματισμό και στη χρήση του MPI, υπάρχει εδώ.
Έστω ότι θέλουμε να τρέξουμε παράλληλα ενα MPI script γραμμένο σε Python με όνομα mpi-python-example.py.
Αρχικά, στο τερματικό κάνουμε load κατάλληλο compiler (gcc) ,την πιο πρόσφατη έκδοση της βιβλιοθήκης openmpi και της python και δημιουργούμε ένα virtual environment της python, αναλυτικές οδηγίες για το πως το κάνουμε αυτό υπάρχουν εδώ. Σε
Έπειτα, εγκαθιστούμε την βιβλιοθήκη mpi4py, χρησιμοποιώντας τον compliler mpicc της γλώσσας C.
module load gcc/15.2.0 openmpi/5.0.8 python/3.13.5
python3 -m venv mpivenv
source mpivenv/bin/activate
MPICC=mpicc pip install --no-cache-dir mpi4py
Στη συνέχεια, δημιουργούμε το batch script προς υποβολή, έστω mpi-pyhton-example.sh με τις κατάλληλες SBATCH μακροεντολές, οι οποίες θα επιτρέψουν την παράλληλη χρήση επεξεργαστών.
Στο batch script του παραδείγματος, ορίζουμε επιπλέον τις #SBATCH directives: --ntasks-per-node και --nodes, πέρα από τις υπόλοιπες #SBATCH directives που υπάρχουν σε ένα συνηθισμένο batch script. Στη συνέχεια αφαιρούμε τυχόν ήδη φορτωμένα modules (purge), κάνουμε loadκατάλληλο compiler και το mpi module που επιθυμούμε. Έπειτα, κάνουμε activate το virtual environment που εχουμε ήδη φτιάξει και τρέχουμε παράλληλα το script σε όσους κόμβους έχουμε ορίσει για το job μας με την srun. Στο παράδειγμά μας έχουμε ορίσει 2 κόμβους και 4 επεξεργαστές στον κάθε κόμβο, άρα συνολικά 8 παράλληλες εργασίες. Η παράμετρος --mpi=pmix ορίζει τον τύπο του PMI(Process Management Interface) που θα χρησιμοποιηθεί για την επικοινωνία μεταξύ του Slurm και της βιβλιοθήκης mpi.
Παράδειγμα
#!/bin/bash
#SBATCH --job-name=mpi_parallel
#SBATCH --output=parallel_res_%j.out
#SBATCH --error=parallel_err_%j.err
#SBATCH --partition=batch
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --time=00:10:00
#SBATCH --mem=2G
module purge
module load gcc/15.2.0
module load openmpi/5.0.8
source /home/username/mpivenv/bin/activate
srun --mpi=pmix python3 -u parallel_test.py
Στη συνέχεια, με την εντολή cat parallel_res_x.out προβάλλουμε στην οθόνη μας το τελικό αποτέλεσμα:
Terminal Output
cat parallel_res_x.out
Hello from node cn1.it.auth.gr, I am job 2 out of 8 in total.
Hello from node cn1.it.auth.gr, I am job 0 out of 8 in total.
Hello from node cn1.it.auth.gr, I am job 1 out of 8 in total.
Hello from node cn1.it.auth.gr, I am job 3 out of 8 in total.
Hello from node cn2.it.auth.gr, I am job 4 out of 8 in total.
Hello from node cn2.it.auth.gr, I am job 5 out of 8 in total.
Hello from node cn2.it.auth.gr, I am job 6 out of 8 in total.
Hello from node cn2.it.auth.gr, I am job 7 out of 8 in total.