R/fr: Difference between revisions

Jump to navigation Jump to search
108 bytes added ,  6 months ago
Updating to match new version of source page
No edit summary
(Updating to match new version of source page)
Tags: Mobile edit Mobile web edit
Line 176: Line 176:
Si les processeurs de nos grappes sont on ne peut plus ordinaires, ce qui rend ces ''supercalculateurs'' intéressants, c'est qu'ils offrent des milliers de CPU sur un réseau très performant. Pour profiter de cet avantage, vous devez utiliser la programmation parallèle. Cependant, avant d'allouer beaucoup de temps et d'effort à paralléliser votre code R, assurez-vous que votre implémentation série est aussi efficiente que possible. Comme dans tout langage interprété, d'importants goulots d'étranglement (''bottlenecks'') sont causés par les boucles et particulièrement les boucles imbriquées, ce qui a un impact sur la performance. Lorsque possible, essayez d'utiliser les fonctions vectorielles et les autres éléments plus fonctionnels comme la famille des fonctions <tt>apply</tt> et la fonction <tt>ifelse</tt>. Vous obtiendrez souvent un gain de performance en éliminant une boucle plutôt que de paralléliser son exécution avec plusieurs cœurs CPU.  
Si les processeurs de nos grappes sont on ne peut plus ordinaires, ce qui rend ces ''supercalculateurs'' intéressants, c'est qu'ils offrent des milliers de CPU sur un réseau très performant. Pour profiter de cet avantage, vous devez utiliser la programmation parallèle. Cependant, avant d'allouer beaucoup de temps et d'effort à paralléliser votre code R, assurez-vous que votre implémentation série est aussi efficiente que possible. Comme dans tout langage interprété, d'importants goulots d'étranglement (''bottlenecks'') sont causés par les boucles et particulièrement les boucles imbriquées, ce qui a un impact sur la performance. Lorsque possible, essayez d'utiliser les fonctions vectorielles et les autres éléments plus fonctionnels comme la famille des fonctions <tt>apply</tt> et la fonction <tt>ifelse</tt>. Vous obtiendrez souvent un gain de performance en éliminant une boucle plutôt que de paralléliser son exécution avec plusieurs cœurs CPU.  


<div class="mw-translate-fuzzy">
La page [https://cran.r-project.org/web/views/HighPerformanceComputing.html CRAN Task View on High-Performance and Parallel Computing with R]
La page [https://cran.r-project.org/web/views/HighPerformanceComputing.html CRAN Task View on High-Performance and Parallel Computing with R]
mentionne un grand nombre de paquets pouvant être utilisés avec R pour la programmation parallèle. Nous décrivons ci-dessous deux méthodes de parallélisation qui sont possibles avec nos grappes.
mentionne un grand nombre de paquets pouvant être utilisés avec R pour la programmation parallèle. Nous décrivons ci-dessous deux méthodes de parallélisation qui sont possibles avec nos grappes.
</div>
The following subsections contain some further notes and examples.


'''Terminologie''' : Dans notre documentation, les termes ''nœud'' et ''hôte'' sont quelquefois employés pour désigner un ordinateur distinct; un regroupement de ''nœuds'' ou d'''hôtes'' constitue une ''grappe''.  
'''Terminologie''' : Dans notre documentation, les termes ''nœud'' et ''hôte'' sont quelquefois employés pour désigner un ordinateur distinct; un regroupement de ''nœuds'' ou d'''hôtes'' constitue une ''grappe''.  
Par contre, dans la documentation pour R, le terme ''nœud'' désigne souvent un ''processus de travail'' (worker process); un regroupement de ces processus constitue une ''grappe''. Prenons comme exemple la citation suivante : «&nbsp;Following '''snow''', a pool of worker processes listening ''via'' sockets for commands from the master is called a 'cluster' of nodes.&nbsp;»<ref>https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf</ref><br/>.
Par contre, dans la documentation pour R, le terme ''nœud'' désigne souvent un ''processus de travail'' (worker process); un regroupement de ces processus constitue une ''grappe''. Prenons comme exemple la citation suivante : «&nbsp;Following '''snow''', a pool of worker processes listening ''via'' sockets for commands from the master is called a 'cluster' of nodes.&nbsp;»<ref>https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf</ref><br/>.
=== Rmpi ===
Les directives qui suivent ne fonctionnent pas sur [[Cedar/fr|Cedar]]; utilisez plutôt une autre grappe.
====Installation====
La procédure suivante installe [https://cran.r-project.org/web/packages/Rmpi/index.html Rmpi], une interface (''wrapper'') pour les routines MPI qui permet d'exécuter R en parallèle.
1. Voyez les modules R disponibles avec la commande
<source lang="bash">
module spider r
</source>
2.  Sélectionnez la version et chargez le module OpenMPI approprié. Dans notre exemple, la version 4.0.3 est utilisée, pour que les processus s'exécutent correctement.
<source lang="bash">
module load gcc/11.3.0
module load r/4.2.1
module load openmpi/4.1.4
</source>
3. Téléchargez [https://cran.r-project.org/web/packages/Rmpi/index.html la dernière version de Rmpi]  en remplaçant le numéro de la version selon le cas.
<source lang="bash">
wget https://cran.r-project.org/src/contrib/Rmpi_0.6-9.2.tar.gz
</source>
4. Indiquez le répertoire dans lequel vous voulez copier les fichiers; vous devez avoir une permission d'écriture pour ce répertoire. Le nom du répertoire peut être modifié.
<source lang="bash">
mkdir -p ~/local/R_libs/
export R_LIBS=~/local/R_libs/
</source>
5. Lancez la commande d'installation.
<source lang="bash">
R CMD INSTALL --configure-args="--with-Rmpi-include=$EBROOTOPENMPI/include  --with-Rmpi-libpath=$EBROOTOPENMPI/lib --with-Rmpi-type='OPENMPI' " Rmpi_0.6-9.2.tar.gz
</source>
Portez attention au message d'erreur qui s'affiche quand l'installation d'un paquet échoue; il pourrait indiquer d'autres modules qui seraient nécessaires.
====Exécution====
1. Placez le code R dans un fichier script, ici le fichier ''test.R''.
{{File
  |name=test.R
  |lang="r"
  |contents=
#Tell all slaves to return a message identifying themselves.
library("Rmpi")
sprintf("TEST mpi.universe.size() =  %i", mpi.universe.size())
ns <- mpi.universe.size() - 1
sprintf("TEST attempt to spawn %i slaves", ns)
mpi.spawn.Rslaves(nslaves=ns)
mpi.remote.exec(paste("I am",mpi.comm.rank(),"of",mpi.comm.size()))
mpi.remote.exec(paste(mpi.comm.get.parent()))
#Send execution commands to the slaves
x<-5
#These would all be pretty correlated one would think
x<-mpi.remote.exec(rnorm,x)
length(x)
x
mpi.close.Rslaves()
mpi.quit()
}}
2. Copiez ce qui suit dans le script ''job.sh''.
{{File
  |name=job.sh
  |lang="bash"
  |contents=
#!/bin/bash
#SBATCH --account=def-someacct  # à remplacer par un compte approprié
#SBATCH --ntasks=5              # nombre de processus MPI
#SBATCH --mem-per-cpu=2048M      # mémoire par coeur CPU; valeur en Mo par défaut
#SBATCH --time=0-00:15          # temps (JJ-HH:MM)
module load gcc/11.3.0
module load r/4.2.1
module load openmpi/4.1.4
export R_LIBS=~/local/R_libs/
mpirun -np 1 R CMD BATCH test.R test.txt
}}
3. Soumettez la tâche.
<source lang="bash">
sbatch job.sh
</source>
Pour plus d'information sur comment soumettre des tâches, consultez [[Running jobs/fr|Exécuter des tâches]].


=== doParallel et foreach ===
=== doParallel et foreach ===
Line 407: Line 322:
{{Command|sbatch job_makecluster.sh}}
{{Command|sbatch job_makecluster.sh}}
Pour plus d'information sur comment soumettre une tâche, voyez [[Running jobs/fr|Exécuter des tâches]].
Pour plus d'information sur comment soumettre une tâche, voyez [[Running jobs/fr|Exécuter des tâches]].
=== Rmpi ===
Les directives qui suivent ne fonctionnent pas sur [[Cedar/fr|Cedar]]; utilisez plutôt une autre grappe.
====Installation====
La procédure suivante installe [https://cran.r-project.org/web/packages/Rmpi/index.html Rmpi], une interface (''wrapper'') pour les routines MPI qui permet d'exécuter R en parallèle.
1. Voyez les modules R disponibles avec la commande
<source lang="bash">
module spider r
</source>
2.  Sélectionnez la version et chargez le module OpenMPI approprié. Dans notre exemple, la version 4.0.3 est utilisée, pour que les processus s'exécutent correctement.
<source lang="bash">
module load gcc/11.3.0
module load r/4.2.1
module load openmpi/4.1.4
</source>
3. Téléchargez [https://cran.r-project.org/web/packages/Rmpi/index.html la dernière version de Rmpi]  en remplaçant le numéro de la version selon le cas.
<source lang="bash">
wget https://cran.r-project.org/src/contrib/Rmpi_0.6-9.2.tar.gz
</source>
4. Indiquez le répertoire dans lequel vous voulez copier les fichiers; vous devez avoir une permission d'écriture pour ce répertoire. Le nom du répertoire peut être modifié.
<source lang="bash">
mkdir -p ~/local/R_libs/
export R_LIBS=~/local/R_libs/
</source>
5. Lancez la commande d'installation.
<source lang="bash">
R CMD INSTALL --configure-args="--with-Rmpi-include=$EBROOTOPENMPI/include  --with-Rmpi-libpath=$EBROOTOPENMPI/lib --with-Rmpi-type='OPENMPI' " Rmpi_0.6-9.2.tar.gz
</source>
Portez attention au message d'erreur qui s'affiche quand l'installation d'un paquet échoue; il pourrait indiquer d'autres modules qui seraient nécessaires.
====Exécution====
1. Placez le code R dans un fichier script, ici le fichier ''test.R''.
{{File
  |name=test.R
  |lang="r"
  |contents=
#Tell all slaves to return a message identifying themselves.
library("Rmpi")
sprintf("TEST mpi.universe.size() =  %i", mpi.universe.size())
ns <- mpi.universe.size() - 1
sprintf("TEST attempt to spawn %i slaves", ns)
mpi.spawn.Rslaves(nslaves=ns)
mpi.remote.exec(paste("I am",mpi.comm.rank(),"of",mpi.comm.size()))
mpi.remote.exec(paste(mpi.comm.get.parent()))
#Send execution commands to the slaves
x<-5
#These would all be pretty correlated one would think
x<-mpi.remote.exec(rnorm,x)
length(x)
x
mpi.close.Rslaves()
mpi.quit()
}}
2. Copiez ce qui suit dans le script ''job.sh''.
{{File
  |name=job.sh
  |lang="bash"
  |contents=
#!/bin/bash
#SBATCH --account=def-someacct  # à remplacer par un compte approprié
#SBATCH --ntasks=5              # nombre de processus MPI
#SBATCH --mem-per-cpu=2048M      # mémoire par coeur CPU; valeur en Mo par défaut
#SBATCH --time=0-00:15          # temps (JJ-HH:MM)
module load gcc/11.3.0
module load r/4.2.1
module load openmpi/4.1.4
export R_LIBS=~/local/R_libs/
mpirun -np 1 R CMD BATCH test.R test.txt
}}
3. Soumettez la tâche.
<source lang="bash">
sbatch job.sh
</source>
Pour plus d'information sur comment soumettre des tâches, consultez [[Running jobs/fr|Exécuter des tâches]].
35,877

edits

Navigation menu