MPI4py/fr
MPI for Python fournit une interface Python pour la norme de communication MPI (Message Passing Interface), permettant aux applications Python d'exploiter plusieurs processeurs sur des postes de travail, des grappes et des supercalculateurs.
Versions disponibles¶
Dans notre environnement, mpi4py est un module et non un paquet précompilé (wheel) comme la plupart des paquets Python. Pour trouver les versions disponibles, utilisez
Pour plus d’information sur une version particulière, utilisez
où X.Y.Z est le numéro de la version, par exemple 4.0.0.
Exemple avec Hello World¶
-
Démarrez une courte tâche interactive.
-
Chargez le module.
-
Faites un test de type Hello World.
Output:
Hello, World! I am process 0 of 5 on node1. Hello, World! I am process 1 of 5 on node1. Hello, World! I am process 2 of 5 on node3. Hello, World! I am process 3 of 5 on node3. Hello, World! I am process 4 of 5 on node3.Dans cet exemple, deux nœuds (node1 et node3) ont été alloués et les tâches ont été distribuées sur les ressources disponibles.
mpi4py comme dépendance d'un autre paquet¶
Quand un autre paquet dépend de mpi4py,
-
Désactivez tout environnement virtuel Python.
Note
Si un environnement virtuel est actif, il est important de le désactiver avant de charger le module. Une fois le module chargé, activez à nouveau votre environnement virtuel.
-
Chargez le module.
-
Vérifiez que le module est visible par
pipOutput:
et que le module Python que vous avez chargé lui a accès.
Si aucune erreur ne survient, tout va bien.
-
Créer un environnement virtuel et installez les paquets.
Exécuter des tâches¶
Les tâches MPI peuvent être distribuées sur plusieurs cœurs ou plusieurs nœuds. Pour plus d’information, voir * MPI job * Advanced MPI scheduling
Sur CPU¶
-
Préparez le code Python ci-dessous pour distribuer un tableau NumPy.
# mpi4py-np-bc.py from mpi4py import MPI import numpy as np comm = MPI.COMM_WORLD rank = comm.Get_rank() if rank == 0: data = np.arange(100, dtype='i') else: data = np.empty(100, dtype='i') comm.Bcast(data, root=0) for i in range(100): assert data[i] == iCet exemple est basé sur le tutoriel mpi4py.
-
Préparez le script de tâche
Script distribué
# submit-mpi4py-distributed.sh #!/bin/bash #SBATCH --account=def-someprof # ajustez ceci pour qu'il corresponde au groupe de comptabilité que vous utilisez pour soumettre des tâches #SBATCH --time=08:00:00 # ajustez ceci pour qu'il corresponde au temps d'exécution (walltime) de votre tâche #SBATCH --ntasks=4 # ajustez ceci pour qu'il corresponde au nombre de tâches/processus à exécuter #SBATCH --mem-per-cpu=4G # ajustez ceci en fonction de la mémoire dont vous avez besoin par processus # Exécution sur des cœurs à travers le système : [Exécution sur des cœurs à travers le système](https://docs.alliancecan.ca/wiki/Advanced_MPI_scheduling#Few_cores,_any_number_of_nodes) # Chargez les dépendances des modules. module load StdEnv/2023 gcc mpi4py/4.0.0 python/3.12 # créez l'environnement virtuel sur chaque nœud alloué : srun --ntasks $SLURM_NNODES --tasks-per-node=1 bash << EOF virtualenv --no-download $SLURM_TMPDIR/env source $SLURM_TMPDIR/env/bin/activate pip install --no-index --upgrade pip pip install --no-index numpy==2.1.1 EOF # activez seulement sur le nœud principal source $SLURM_TMPDIR/env/bin/activate; # srun exporte l'environnement actuel, qui contient les variables $VIRTUAL_ENV et $PATH srun python mpi4py-np-bc.py;Nœuds entiers
# submit-mpi4py-whole-nodes.sh #!/bin/bash #SBATCH --account=def-someprof # ajustez ceci pour qu'il corresponde au groupe de comptabilité que vous utilisez pour soumettre des tâches #SBATCH --time=01:00:00 # ajustez ceci pour qu'il corresponde au temps d'exécution (walltime) de votre tâche #SBATCH --nodes=2 # ajustez ceci pour qu'il corresponde au nombre de nœuds entiers #SBATCH --ntasks-per-node=40 # ajustez ceci pour qu'il corresponde au nombre de tâches/processus à exécuter par nœud #SBATCH --mem-per-cpu=1G # ajustez ceci en fonction de la mémoire dont vous avez besoin par processus # Exécution sur N nœuds entiers : [Exécution sur N nœuds entiers](https://docs.alliancecan.ca/wiki/Advanced_MPI_scheduling#Whole_nodes) # Chargez les dépendances des modules. module load StdEnv/2023 gcc openmpi mpi4py/4.0.0 python/3.12 # créez l'environnement virtuel sur chaque nœud alloué : srun --ntasks $SLURM_NNODES --tasks-per-node=1 bash << EOF virtualenv --no-download $SLURM_TMPDIR/env source $SLURM_TMPDIR/env/bin/activate pip install --no-index --upgrade pip pip install --no-index numpy==2.1.1 EOF # activez seulement sur le nœud principal source $SLURM_TMPDIR/env/bin/activate; # srun exporte l'environnement actuel, qui contient les variables $VIRTUAL_ENV et $PATH srun python mpi4py-np-bc.py; -
Testez votre script.
Avant de soumettre la tâche, il est important de tester le script pour des erreurs possibles. Faites un test rapide avec une tâche interactive.
-
Soumettez votre tâche.
GPU¶
-
Sur un nœud de connexion, téléchargez l’exemple tiré des démos.
-
Préparez votre script de soumission.
# submit-mpi4py-gpu.sh #!/bin/bash #SBATCH --account=def-someprof # ajustez ceci pour qu'il corresponde au groupe de comptabilité que vous utilisez pour soumettre des tâches #SBATCH --time=08:00:00 # ajustez ceci pour qu'il corresponde au temps d'exécution (walltime) de votre tâche #SBATCH --ntasks=2 # ajustez ceci pour qu'il corresponde au nombre de tâches/processus à exécuter #SBATCH --mem-per-cpu=2G # ajustez ceci en fonction de la mémoire dont vous avez besoin par processus #SBATCH --gpus=1 # Chargez les dépendances des modules. module load StdEnv/2023 gcc cuda/12 mpi4py/4.0.0 python/3.11 # créez l'environnement virtuel sur chaque nœud alloué : virtualenv --no-download $SLURM_TMPDIR/env source $SLURM_TMPDIR/env/bin/activate pip install --no-index --upgrade pip pip install --no-index cupy numba srun python use_cupy.py; -
Testez votre script.
Avant de soumettre la tâche, il est important de tester le script pour des erreurs possibles. Faites un test rapide avec une tâche interactive.
-
Soumettez votre tâche.
Dépannage¶
Message ModuleNotFoundError: No module named 'mpi4py'¶
Ce message peut survenir à l’importation quand mpi4py n’est pas accessible.
Solutions suggérées :
* avec module spider mpi4py/X.Y.Z, vérifiez quelles versions de Python sont compatibles avec le module mpi4py que vous avez chargé. Quand une version compatible est chargée, vérifiez si python -c 'import mpi4py' fonctionne;
* chargez le module avant d'activer votre environnement virtuel (voir mpi4py comme dépendance d'un autre paquet ci-dessus).
Voir aussi Message ModuleNotFoundError: No module named 'X'.