MATLAB/fr: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
No edit summary
No edit summary
 
(266 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<languages />
<languages />
[[Category:Software]]
[[Category:Software]]
=Utiliser MATLAB sur les grappes de Calcul Canada=
Il y a deux façons d'utiliser MATLAB sur nos grappes&nbsp;:
Vous pouvez utiliser MATLAB
* avec votre licence, habituellement détenue par votre institution, faculté, département ou laboratoire, ou
* en compilant votre code en un binaire pouvant être exécuté sur les bibliothèques MATLAB Compiler Runtime (MCR).


==Votre licence==
<b>1. Exécuter directement MATLAB</b>, mais vous devez avoir accès à une licence, soit :
Calcul Canada est fournisseur d'hébergement pour MATLAB. Dans ce contexte, MATLAB est installé sur nos grappes, mais nous n'avons pas une licence générique fournissant l'accès à tous nos utilisateurs. Cependant, plusieurs institutions, facultés et départements possèdent des licences qui peuvent être utilisées sur nos grappes. De façon générale, toute licence émise à des fins de recherche peut être utilisée sur nos grappes; plus précisément, toute licence ''Total Academic Headcount'' de MATLAB peut être utilisée avec notre infrastructure, comme en fait foi une confirmation écrite de MathWorks.
* la licence fournie sur [[Cedar/fr|Cedar]], [[Béluga]] ou [[Narval]] pour les étudiants, professeurs et chercheurs; </li>
Le libellé de la licence n'est pas clair à cet effet et il peut sembler que votre licence ne puisse pas être utilisée hors de votre campus. Nous vous suggérons de demander au responsable de la gestion des licences pour votre établissement de communiquer avec un représentant MathWorks.  
* une licence externe détenue par votre établissement, faculté, département ou laboratoire (voir la section <i>Utiliser une licence externe</i> ci-dessous).


En ce qui a trait à l'aspect technique, nos nœuds de calcul doivent pouvoir communiquer avec votre serveur de licence. Si ce n'est déjà fait, notre équipe technique coordonnera ceci avec votre gestionnaire de licence. Quand tout sera en place, vous pourrez charger le module MATLAB qui localisera de lui-même la licence. En cas de difficulté, contactez le [[Technical support/fr|soutien technique]].
<b>2. Compiler votre code MATLAB</b> avec le compilateur <code>mcc</code> et utiliser le fichier exécutable généré sur une de nos grappes. Vous pouvez utiliser cet exécutable sans tenir compte de la licence.


'''Important :''' Comme pour toutes les tâches aux exigences élevées, le code MATLAB doit toujours être inclus dans une tâche soumise à l'ordonnanceur; consultez [[Running_jobs/fr|Exécuter des tâches]].
Vous trouverez ci-dessous les détails pour ces approches.


Voici un script simple pour l'ordonnanceur qui soumet le script ''cosplot.m'' montré plus bas.
=Utiliser une licence externe=
Nous sommes fournisseurs d'hébergement pour MATLAB. Dans ce contexte, MATLAB est installé sur nos grappes et vous pouvez avoir accès à une licence externe pour utiliser notre infrastructure; dans le cas de certains établissements, ceci s'effectue de façon automatique. Pour savoir si vous avez accès à une licence, faites le test suivant :


<pre>
[name@cluster ~]$ module load matlab/2023b.2
[name@cluster ~]$ matlab -nojvm -nodisplay -batch license
987654
[name@cluster ~]$
</pre>
Si tout est en ordre, un numéro de licence sera imprimé. Assurez-vous d'effectuer ce test sur chaque grappe avec laquelle vous voulez utiliser MATLAB puisque certaines licences ne sont pas disponibles partout.
Si vous obtenez le message <i>This version is newer than the version of the license.dat file and/or network license manager on the server machine</i>, essayez d'entrer une version moins récente de MATLAB dans la ligne <code>module load</code>.
Autrement, il se peut que votre établissement n'ait pas de licence, qu'il ne soit pas possible d'utiliser la licence de cette manière ou qu'aucune entente n'ait été conclue avec nous pour utiliser la licence. Pour savoir si vous pouvez utiliser une licence externe, contactez l'administrateur de la licence MATLAB de votre établissement ou votre gestionnaire de compte MATLAB. 
Si vous pouvez utiliser une licence externe, certaines opérations de configuration sont requises. D'abord, vous devez créer un fichier semblable à
{{File
{{File
|name=matlab_slurm.sl
|name=matlab.lic
|lang="bash"
|lang="bash"
|contents=
|contents=
#!/bin/bash -l
# spécifications du serveur de licence
#SBATCH --job-name=matlab_test
SERVER <ip address> ANY <port>
#SBATCH --account=def-bmoa #adjust this to match the accounting group you are using to submit jobs
USE_SERVER
#SBATCH --time=0-03:00    #adjust this to match the walltime of your job
}}
#SBATCH --nodes=1     
et placer ce fichier dans le répertoire <code>$HOME/.licenses/</code> où l'adresse IP et le numéro du port correspondent aux valeurs du serveur de licence de votre établissement. Notre équipe technique devra alors contacter le personnel technique qui gère votre licence pour que votre serveur puisse se connecter à nos nœuds de calcul. Pour organiser ceci, contactez le [[Technical support/fr|soutien technique]].
#SBATCH --ntasks=1
 
#SBATCH --cpus-per-task=1  #adjust this if you are using PCT
Consultez la documentation technique http://www.mathworks.com/support et l'information sur le produit http://www.mathworks.com.
#SBATCH --mem=4000        #adjust this according to your the memory requirement per node you need
 
#SBATCH --mail-user=bmoa@uvic.ca #adjust this to match your email address
= Préparer votre répertoire <code>.matlab</code> =
#SBATCH --mail-type=ALL
Puisque le répertoire /home de certains nœuds de calcul n'est accessible qu'en lecture, vous devez créer un lien symbolique <code>.matlab</code> pour que le profil et des données des tâches soient plutôt consignés dans /scratch.


#Chargez le module matlab.
<pre>
module load matlab/2018a
[name@cluster ~]$ cd $HOME
#Omettez -singleCompThread si vous utilisez PCT.
[name@cluster ~]$ if [ -d ".matlab" ]; then
matlab -nodisplay -nosplash -singleCompThread -r "cosplot"
  mv .matlab scratch/
}}
else
  mkdir -p scratch/.matlab
fi && ln -sn scratch/.matlab .matlab
</pre>


Vous pouvez maintenant soumettre la tâche avec la commande <tt>sbatch</tt> habituelle.
= Boîtes à outils =
{{Command|sbatch matlab_slurm.sl}}
Pour la liste des boîtes à outils disponibles avec la licence et la grappe sur laquelle vous travaillez, utilisez
<pre>
[name@cluster ~]$  module load matlab
[name@cluster ~]$  matlab -nojvm -batch "ver"
</pre>


= Exécuter le code MATLAB séquentiellement ou en parallèle =


<b>Important :</b> Pour tous les calculs d'envergure (durée de plus de cinq minutes ou mémoire d'un Go), la tâche doit être soumise à l'ordonnanceur; consultez [[Running_jobs/fr|Exécuter des tâches]].


== Utiliser les bibliothèques MCR ==
Voici un exemple de code ː
Comme la licence de Calcul Canada ne nous permet pas de l'installer, vous devez avoir accès au compilateur MATLAB sous la plateforme Linux.
Consultez la [https://www.mathworks.com/help/compiler/index.html documentation MATLAB Compiler].
Voici un exemple ː




Line 52: Line 71:
|lang="Matlab"
|lang="Matlab"
|contents=
|contents=
% MATLAB file example to approximate a sawtooth
function cosplot()
% with a truncated Fourier expansion.
% exemple pour approximer un signal en dents de scie
% par une série de Fourier tronquée
nterms=5;
nterms=5;
fourbypi=4.0/pi;
fourbypi=4.0/pi;
Line 65: Line 85:
end
end


%(The following commands for generating graphics output work
% with MATLAB 7 on glacier but produce empty plots with MATLAB 6
% on some other clusters.)
plot(x,y)
plot(x,y)
print -dpsc matlab_test_plot.ps
print -dpsc matlab_test_plot.ps
Line 75: Line 91:
}}
}}


Compilez avec la commande
Voici un script simple pour l'ordonnanceur Slurm qui exécute <code>cosplot.m</code> :
 
{{File
|name=matlab_slurm.sl
|lang="bash"
|contents=
#!/bin/bash -l
#SBATCH --job-name=matlab_test
#SBATCH --account=def-someprof # nom du compte utilisé pour soumettre des tâches
#SBATCH --time=0-03:00        # limite de temps (JJ-HH:MM)
#SBATCH --nodes=1     
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1      # à modifier si vous utilisez des commandes parallèles
#SBATCH --mem=4000            # mémoire requise par nœud (en mégaoctets par défaut)
#SBATCH --mail-user=you@youruniversity.ca # votre adresse de courriel
#SBATCH --mail-type=ALL
 
# chargez le module pour la version voulue
module load matlab/2023b.2
# si vous utilisez des commandes parallèles, supprimez -singleCompThread dans la ligne suivante
matlab -singleCompThread -batch "cosplot"
}}
 
Soumettez la tâche avec <code>sbatch</code>.
{{Command|sbatch matlab_slurm.sl}}
 
Si vous demandez plus d'un cœur avec <code>--cpus-per-task</code>, n'utilisez pas l'option <code>-singleCompThread</code>.
Assurez-vous également que la taille de votre [https://www.mathworks.com/help/distcomp/parpool.html parpool] MATLAB correspond au nombre de cœurs que vous demandez.
 
Si vous n'ajoutez pas l'option <code>-nojvm</code>, MATLAB crée un fichier comme <code>java.log.12345</code> chaque fois qu'il est lancé. Cette option peut toutefois interférer avec les fonctions de traçage.
Pour plus d'information sur les options en ligne de commande <code>-nodisplay</code>, <code>-singleCompThread</code>,
<code>-nojvm</code> et <code>-r</code>,
voir [https://www.mathworks.com/help/matlab/ref/matlablinux.html MATLAB (Linux)] sur le site web de MathWorks.
 
= Lancer plusieurs tâches parallèles MATLAB en simultané =
Un problème se pose quand deux ou plusieurs tâches parallèles initialisent leur <code>parpool</code> au même moment; le fichier <code>.dat</code> dans le répertoire <code>$HOME/.matlab/local_cluster_jobs/R*</code> est sollicité en lecture et en écriture par toutes les nouvelles instances MATLAB, ce qui corrompt le profil parallèle local utilisé par d’autres tâches MATLAB. Pour réparer le fichier corrompu, supprimez le répertoire <code>local_cluster_jobs</code> quand aucune tâche n’est en cours d’exécution.
 
Les deux solutions définitives principales sont :
# faire en sorte que la commande <code>parpool</code> est lancée par une tâche MATLAB à la fois; plusieurs techniques sont possibles, mais nulle n’est parfaite :
#* en utilisant un fichier de verrouillage, mais celui-ci peut demeurer verrouillé si une tâche précédente s'est terminée anormalement, 
#* en utilisant des délais de durées aléatoires, mais ceci corrompt aussi le fichier <code>.dat</code>,
#* en utilisant toujours des délais incrémentiels, mais ceci est un mauvais usage du temps de calcul, 
#* en contrôlant le moment du lancement de la tâche avec les options Slurm <code>--begin</code> ou <code>--dependency=after:JOBID</code>, mais ceci augmente le temps d’attente dans la queue;
# faire en sorte que chaque tâche MATLAB crée un profil parallèle local à un endroit unique dans le système de fichiers.
 
Dans votre code MATLAB :
{{File
|name=parallel_main.m
|lang="Matlab"
|contents=
% créez un objet grappe de profil «local»
local_cluster = parcluster('local')
 
% configurez JobStorageLocation avec la valeur  $SLURM_TMPDIR
local_cluster.JobStorageLocation = getenv('SLURM_TMPDIR')
 
% lancez le calcul parallèle avec l'objet grappe
parpool(local_cluster);
}}
 
Références :
* FAS Research Computing, [https://www.rc.fas.harvard.edu/resources/documentation/software/matlab-pct-simultaneous-job-problem/<i>MATLAB Parallel Computing Toolbox simultaneous job problem</i>]
* MathWorks, [https://www.mathworks.com/matlabcentral/answers/97141-why-am-i-unable-to-start-a-local-matlabpool-from-multiple-matlab-sessions-that-use-a-shared-preferen <i>Why am I unable to start a local MATLABPOOL from multiple MATLAB sessions that use a shared preference directory using Parallel Computing Toolbox 4.0 (R2008b)?</i>]
 
= Utiliser les bibliothèques Compiler et Runtime =
 
<b>Important :</b> Comme pour toutes les tâches aux exigences élevées, le code MCR doit toujours être inclus dans une tâche soumise à l'ordonnanceur; consultez [[Running_jobs/fr|Exécuter des tâches]].
 
Vous pouvez aussi compiler votre code avec MATLAB Compiler, un des modules dont nous sommes fournisseurs d'hébergement.
Consultez la [https://www.mathworks.com/help/compiler/index.html documentation MATLAB Compiler].
Pour l'instant, mcc est disponible pour les versions 2014a, 2018a et suivantes.
 
Pour compiler l'exemple avec <code>cosplot.m</code> ci-dessus, vous utiliseriez la commande  
{{Command|prompt=[name@yourserver ~]$|mcc -m -R -nodisplay cosplot.m}}
{{Command|prompt=[name@yourserver ~]$|mcc -m -R -nodisplay cosplot.m}}


Ceci produit le binaire <tt>cosplot</tt> et le script enveloppant <tt>run_cosplot.sh</tt>. Ce script ne fonctionnera pas tel quel sur les serveurs de Calcul Canada puisque MATLAB veut que certaines bibliothèques se trouvent à des endroits spécifiques. Utilisez plutôt le script enveloppant <tt>run_mcr_binary.sh</tt> qui définit les bons chemins.  
Ceci produit le binaire <code>cosplot</code> et le script enveloppant <code>run_cosplot.sh</code>. Pour exécuter le binaire sur nos serveurs, vous n'avez besoin que du binaire. Le script enveloppant ne fonctionnera pas tel quel sur nos serveurs puisque MATLAB s'attend à ce que certaines bibliothèques se trouvent à des endroits spécifiques. Utilisez plutôt le script enveloppant <code>run_mcr_binary.sh</code> qui définit les bons chemins.  


<div class="mw-translate-fuzzy">
[[Utiliser des modules|Chargez le module]] MCR correspondant à la version que vous utilisez pour créer l'exécutable   
[[Utiliser des modules|Chargez le module]] MCR correspondant à la version que vous utilisez pour créer l'exécutable   
{{Command|module load mcr/R2017b}}
{{Command|module load mcr/R2018a}}
</div>


Lancez la commande  
Lancez la commande  
{{Commande|run_mcr_binary.sh cosplot}}
{{Commande|run_mcr_binary.sh cosplot}}
puis utilisez le binaire comme suit :
{{Commande|setrpaths.sh --path cosplot}}


La commande <tt>setrpaths.sh</tt> ne doit être exécutée qu'une seule fois pour chacun des binaires compilés; <tt>run_mcr_binary.sh</tt> vous demandera de l'exécuter si ce n'est pas fait.
ensuite, dans le script pour la tâche (<b>et non dans les nœuds de connexion</b>), utilisez le binaire comme suit :
<code>run_mcr_binary.sh cosplot</code>
 
La commande <code>setrpaths.sh</code> ne doit être exécutée qu'une seule fois pour chacun des binaires compilés; <code>run_mcr_binary.sh</code> vous demandera de l'exécuter si ce n'est pas fait.
 
= Utilisation de MATLAB Parallel Server =
MATLAB Parallel Server n’est utile que si votre tâche MATLAB parallèle possède plus de processus (appelés <i>workers</i>) que les cœurs CPU disponibles sur un nœud de calcul unique. L’installation régulière de MATLAB décrite ci-dessus permet d’exécuter des tâches parallèles avec un nœud (jusqu’à 64 <i>workers</i> par tâche selon la grappe et le nœud); pour utiliser plus d’un nœud.
 
Cette solution permet habituellement de soumettre des tâches MATLAB parallèles à partir de l’interface MATLAB locale de votre ordinateur. <b>Certaines améliorations à la sécurité des nos grappes ont été apportées en mai 2023 et, étant donné que MATLAB utilise un mode SSH qui n'est plus autorisé, il n'est plus possible de soumettre une tâche à partir d'un ordinateur local aussi longtemps que MATLAB n'utilisera pas une nouvelle méthode pour se connecter. Il n'y a présentement aucune solution.</b>
 
== Module d'extension pour Slurm ==
<b>La procédure suivante ne fonctionne pas en raison de l'extension Slurm qui n'est plus disponible et aussi du problème avec SSH qui est mentionné à la section précédente.</b> Toutefois, nous l'avons conservée pour lorsque la solution sera disponible.
# Installez MATLAB R2022a (ou une version plus récente), incluant le <b>Parallel Computing Toolbox</b>.
# De la page MathWorks Slurm Plugin, téléchargez et exécutez le fichier <code>*.mlpkginstall</code> (bouton <i>Download</i> à la droite de la page, sous l'onglet <i>Overview</i>).
# Entrez vos identifiants MathWorks. Si la configuration ne démarre pas automatiquement, lancez dans MATLAB la commande
#:<code>parallel.cluster.generic.runProfileWizard()</code>
# Entrez les renseignements suivants :
#* Sélectionnez <b>Unix</b> (habituellement la seule option offerte)
#* Shared location: <b>No</b>
#* Cluster host:
#** Pour Béluga : <b>beluga.computecanada.ca</b>
#** Pour Narval : <b>narval.computecanada.ca</b>
#* Username (optional):  (entrez votre nom d’utilisateur; au besoin, le fichier d’identité peut être défini plus tard)
#* Remote job storage: <b>/scratch</b>
#**Cochez <i>Use unique subfolders</i>.
#* Maximum number of workers: <b>960</b>
#* Matlab installation folder for workers: (les versions locale et distante doivent correspondre)
#** Pour R2022a : <b>/cvmfs/restricted.computecanada.ca/easybuild/software/2020/Core/matlab/2022a</b>
#* License type: <b>Network license manager</b>
#* Profile Name: <b>beluga</b> ou <b>narval</b>
# Cliquez sur <i>Create</i> et <i>Finish</i> pour compléter le profil.
 
== Modifier l'extension après son installation ==
Dans le terminal MATLAB, allez au répertoire <code>nonshared</code> en lançant la commande
cd(fullfile(matlabshared.supportpkg.getSupportPackageRoot, 'parallel', 'slurm', 'nonshared'))
 
# Ouvrez le fichier <b>independentSubmitFcn.m</b>; aux environs de la ligne 117, remplacez <p> <code>additionalSubmitArgs = sprintf('--ntasks=1 --cpus-per-task=%d', cluster.NumThreads);</code> </p><p> par </p><p> <code>additionalSubmitArgs = ccSBATCH().getSubmitArgs();</code></p>
# Ouvrez le fichier <b>communicatingSubmitFcn.m</b>; aux environs de la ligne 126, remplacez <p> <code>additionalSubmitArgs = sprintf('--ntasks=%d --cpus-per-task=%d', environmentProperties.NumberOfTasks, cluster.NumThreads);</code> </p><p> par </p><p> <code>additionalSubmitArgs = ccSBATCH().getSubmitArgs();</code></p>
# Ouvrez le fichier <b>communicatingJobWrapper.sh</b>; aux environs de la ligne 20 (après la déclaration du copyright), ajoutez la commande suivante et ajustez la version du module en fonction de la version de votre Matlab local:<p> <code>module load matlab/2022a</code></p>
 
Redémarrez MATLAB et retournez à votre répertoire /home avec
cd(getenv('HOME'))  # ou sous Windows, cd(getenv('HOMEPATH'))
 
== Validation ==
<b>N'utilisez pas</b> l'outil de validation <i>Cluster Profile Manager</i>, mais exécutez l'exemple <code>TestParfor</code> avec un fichier de script <code>ccSBATCH.m</code> adéquatement configuré.
# Téléchargez et extrayez des exemples de code à partir de https://github.com/ComputeCanada/matlab-parallel-server-samples.
# Dans MATLAB, ouvrez le répertoire <code>TestParfor</code>  que vous venez d'extraire.
# Suivez les directives données dans le fichier https://github.com/ComputeCanada/matlab-parallel-server-samples/blob/master/README.md.
 
Note : Quand <code>ccSBATCH.m</code> se trouve dans votre répertoire courant, vous pouvez utiliser l’outil de validation <i>Cluster Profile Manager</i> pour les deux premiers tests car les autres ne sont pas encore pris en charge.
 
= Ressources externes =
 
Voyez aussi les ressources offertes par MathWorks.
* Documentation : [https://www.mathworks.com/help/matlab/ https://www.mathworks.com/help/matlab/] (certaines pages sont en français)
* Auto-apprentissage : [https://matlabacademy.mathworks.com/ https://matlabacademy.mathworks.com/] (aussi en versions EN, JP, ES, KR, CN)


'''Important :''' Comme pour toutes les tâches aux exigences élevées, le code MCR doit toujours être inclus dans une tâche soumise à l'ordonnanceur; consultez [[Running_jobs/fr|Exécuter des tâches]].
Certaines universités ont leur propre documentation, comme
* pour des exemples de scripts : [https://rcs.ucalgary.ca/MATLAB https://rcs.ucalgary.ca/MATLAB]

Latest revision as of 17:08, 12 September 2024

Other languages:

Il y a deux façons d'utiliser MATLAB sur nos grappes :

1. Exécuter directement MATLAB, mais vous devez avoir accès à une licence, soit :

  • la licence fournie sur Cedar, Béluga ou Narval pour les étudiants, professeurs et chercheurs;
  • une licence externe détenue par votre établissement, faculté, département ou laboratoire (voir la section Utiliser une licence externe ci-dessous).

2. Compiler votre code MATLAB avec le compilateur mcc et utiliser le fichier exécutable généré sur une de nos grappes. Vous pouvez utiliser cet exécutable sans tenir compte de la licence.

Vous trouverez ci-dessous les détails pour ces approches.

Utiliser une licence externe

Nous sommes fournisseurs d'hébergement pour MATLAB. Dans ce contexte, MATLAB est installé sur nos grappes et vous pouvez avoir accès à une licence externe pour utiliser notre infrastructure; dans le cas de certains établissements, ceci s'effectue de façon automatique. Pour savoir si vous avez accès à une licence, faites le test suivant :

[name@cluster ~]$ module load matlab/2023b.2
[name@cluster ~]$ matlab -nojvm -nodisplay -batch license

987654
[name@cluster ~]$

Si tout est en ordre, un numéro de licence sera imprimé. Assurez-vous d'effectuer ce test sur chaque grappe avec laquelle vous voulez utiliser MATLAB puisque certaines licences ne sont pas disponibles partout.

Si vous obtenez le message This version is newer than the version of the license.dat file and/or network license manager on the server machine, essayez d'entrer une version moins récente de MATLAB dans la ligne module load.

Autrement, il se peut que votre établissement n'ait pas de licence, qu'il ne soit pas possible d'utiliser la licence de cette manière ou qu'aucune entente n'ait été conclue avec nous pour utiliser la licence. Pour savoir si vous pouvez utiliser une licence externe, contactez l'administrateur de la licence MATLAB de votre établissement ou votre gestionnaire de compte MATLAB.

Si vous pouvez utiliser une licence externe, certaines opérations de configuration sont requises. D'abord, vous devez créer un fichier semblable à

File : matlab.lic

# spécifications du serveur de licence
SERVER <ip address> ANY <port>
USE_SERVER


et placer ce fichier dans le répertoire $HOME/.licenses/ où l'adresse IP et le numéro du port correspondent aux valeurs du serveur de licence de votre établissement. Notre équipe technique devra alors contacter le personnel technique qui gère votre licence pour que votre serveur puisse se connecter à nos nœuds de calcul. Pour organiser ceci, contactez le soutien technique.

Consultez la documentation technique http://www.mathworks.com/support et l'information sur le produit http://www.mathworks.com.

Préparer votre répertoire .matlab

Puisque le répertoire /home de certains nœuds de calcul n'est accessible qu'en lecture, vous devez créer un lien symbolique .matlab pour que le profil et des données des tâches soient plutôt consignés dans /scratch.

[name@cluster ~]$ cd $HOME
[name@cluster ~]$ if [ -d ".matlab" ]; then
  mv .matlab scratch/
else
  mkdir -p scratch/.matlab
fi && ln -sn scratch/.matlab .matlab

Boîtes à outils

Pour la liste des boîtes à outils disponibles avec la licence et la grappe sur laquelle vous travaillez, utilisez

[name@cluster ~]$  module load matlab
[name@cluster ~]$  matlab -nojvm -batch "ver"

Exécuter le code MATLAB séquentiellement ou en parallèle

Important : Pour tous les calculs d'envergure (durée de plus de cinq minutes ou mémoire d'un Go), la tâche doit être soumise à l'ordonnanceur; consultez Exécuter des tâches.

Voici un exemple de code ː


File : cosplot.m

function cosplot()
% exemple pour approximer un signal en dents de scie 
% par une série de Fourier tronquée
nterms=5;
fourbypi=4.0/pi;
np=100;
y(1:np)=pi/2.0;
x(1:np)=linspace(-2.0*pi,2*pi,np);

for k=1:nterms
 twokm=2*k-1;
 y=y-fourbypi*cos(twokm*x)/twokm^2;
end

plot(x,y)
print -dpsc matlab_test_plot.ps
quit
end


Voici un script simple pour l'ordonnanceur Slurm qui exécute cosplot.m :


File : matlab_slurm.sl

#!/bin/bash -l
#SBATCH --job-name=matlab_test
#SBATCH --account=def-someprof # nom du compte utilisé pour soumettre des tâches
#SBATCH --time=0-03:00         # limite de temps (JJ-HH:MM)
#SBATCH --nodes=1      
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1      # à modifier si vous utilisez des commandes parallèles
#SBATCH --mem=4000             # mémoire requise par nœud (en mégaoctets par défaut)
#SBATCH --mail-user=you@youruniversity.ca # votre adresse de courriel
#SBATCH --mail-type=ALL

# chargez le module pour la version voulue
module load matlab/2023b.2
# si vous utilisez des commandes parallèles, supprimez -singleCompThread dans la ligne suivante
matlab -singleCompThread -batch "cosplot"


Soumettez la tâche avec sbatch.

Question.png
[name@server ~]$ sbatch matlab_slurm.sl

Si vous demandez plus d'un cœur avec --cpus-per-task, n'utilisez pas l'option -singleCompThread. Assurez-vous également que la taille de votre parpool MATLAB correspond au nombre de cœurs que vous demandez.

Si vous n'ajoutez pas l'option -nojvm, MATLAB crée un fichier comme java.log.12345 chaque fois qu'il est lancé. Cette option peut toutefois interférer avec les fonctions de traçage. Pour plus d'information sur les options en ligne de commande -nodisplay, -singleCompThread, -nojvm et -r, voir MATLAB (Linux) sur le site web de MathWorks.

Lancer plusieurs tâches parallèles MATLAB en simultané

Un problème se pose quand deux ou plusieurs tâches parallèles initialisent leur parpool au même moment; le fichier .dat dans le répertoire $HOME/.matlab/local_cluster_jobs/R* est sollicité en lecture et en écriture par toutes les nouvelles instances MATLAB, ce qui corrompt le profil parallèle local utilisé par d’autres tâches MATLAB. Pour réparer le fichier corrompu, supprimez le répertoire local_cluster_jobs quand aucune tâche n’est en cours d’exécution.

Les deux solutions définitives principales sont :

  1. faire en sorte que la commande parpool est lancée par une tâche MATLAB à la fois; plusieurs techniques sont possibles, mais nulle n’est parfaite :
    • en utilisant un fichier de verrouillage, mais celui-ci peut demeurer verrouillé si une tâche précédente s'est terminée anormalement,
    • en utilisant des délais de durées aléatoires, mais ceci corrompt aussi le fichier .dat,
    • en utilisant toujours des délais incrémentiels, mais ceci est un mauvais usage du temps de calcul,
    • en contrôlant le moment du lancement de la tâche avec les options Slurm --begin ou --dependency=after:JOBID, mais ceci augmente le temps d’attente dans la queue;
  2. faire en sorte que chaque tâche MATLAB crée un profil parallèle local à un endroit unique dans le système de fichiers.

Dans votre code MATLAB :

File : parallel_main.m

% créez un objet grappe de profil «local»
local_cluster = parcluster('local')

% configurez JobStorageLocation avec la valeur  $SLURM_TMPDIR
local_cluster.JobStorageLocation = getenv('SLURM_TMPDIR')

% lancez le calcul parallèle avec l'objet grappe
parpool(local_cluster);


Références :

Utiliser les bibliothèques Compiler et Runtime

Important : Comme pour toutes les tâches aux exigences élevées, le code MCR doit toujours être inclus dans une tâche soumise à l'ordonnanceur; consultez Exécuter des tâches.

Vous pouvez aussi compiler votre code avec MATLAB Compiler, un des modules dont nous sommes fournisseurs d'hébergement. Consultez la documentation MATLAB Compiler. Pour l'instant, mcc est disponible pour les versions 2014a, 2018a et suivantes.

Pour compiler l'exemple avec cosplot.m ci-dessus, vous utiliseriez la commande

Question.png
[name@yourserver ~]$ mcc -m -R -nodisplay cosplot.m

Ceci produit le binaire cosplot et le script enveloppant run_cosplot.sh. Pour exécuter le binaire sur nos serveurs, vous n'avez besoin que du binaire. Le script enveloppant ne fonctionnera pas tel quel sur nos serveurs puisque MATLAB s'attend à ce que certaines bibliothèques se trouvent à des endroits spécifiques. Utilisez plutôt le script enveloppant run_mcr_binary.sh qui définit les bons chemins.

Chargez le module MCR correspondant à la version que vous utilisez pour créer l'exécutable

Question.png
[name@server ~]$ module load mcr/R2018a

Lancez la commande

Question.png
[nom@serveur ~]$ run_mcr_binary.sh cosplot

ensuite, dans le script pour la tâche (et non dans les nœuds de connexion), utilisez le binaire comme suit : run_mcr_binary.sh cosplot

La commande setrpaths.sh ne doit être exécutée qu'une seule fois pour chacun des binaires compilés; run_mcr_binary.sh vous demandera de l'exécuter si ce n'est pas fait.

Utilisation de MATLAB Parallel Server

MATLAB Parallel Server n’est utile que si votre tâche MATLAB parallèle possède plus de processus (appelés workers) que les cœurs CPU disponibles sur un nœud de calcul unique. L’installation régulière de MATLAB décrite ci-dessus permet d’exécuter des tâches parallèles avec un nœud (jusqu’à 64 workers par tâche selon la grappe et le nœud); pour utiliser plus d’un nœud.

Cette solution permet habituellement de soumettre des tâches MATLAB parallèles à partir de l’interface MATLAB locale de votre ordinateur. Certaines améliorations à la sécurité des nos grappes ont été apportées en mai 2023 et, étant donné que MATLAB utilise un mode SSH qui n'est plus autorisé, il n'est plus possible de soumettre une tâche à partir d'un ordinateur local aussi longtemps que MATLAB n'utilisera pas une nouvelle méthode pour se connecter. Il n'y a présentement aucune solution.

Module d'extension pour Slurm

La procédure suivante ne fonctionne pas en raison de l'extension Slurm qui n'est plus disponible et aussi du problème avec SSH qui est mentionné à la section précédente. Toutefois, nous l'avons conservée pour lorsque la solution sera disponible.

  1. Installez MATLAB R2022a (ou une version plus récente), incluant le Parallel Computing Toolbox.
  2. De la page MathWorks Slurm Plugin, téléchargez et exécutez le fichier *.mlpkginstall (bouton Download à la droite de la page, sous l'onglet Overview).
  3. Entrez vos identifiants MathWorks. Si la configuration ne démarre pas automatiquement, lancez dans MATLAB la commande
    parallel.cluster.generic.runProfileWizard()
  4. Entrez les renseignements suivants :
    • Sélectionnez Unix (habituellement la seule option offerte)
    • Shared location: No
    • Cluster host:
      • Pour Béluga : beluga.computecanada.ca
      • Pour Narval : narval.computecanada.ca
    • Username (optional): (entrez votre nom d’utilisateur; au besoin, le fichier d’identité peut être défini plus tard)
    • Remote job storage: /scratch
      • Cochez Use unique subfolders.
    • Maximum number of workers: 960
    • Matlab installation folder for workers: (les versions locale et distante doivent correspondre)
      • Pour R2022a : /cvmfs/restricted.computecanada.ca/easybuild/software/2020/Core/matlab/2022a
    • License type: Network license manager
    • Profile Name: beluga ou narval
  5. Cliquez sur Create et Finish pour compléter le profil.

Modifier l'extension après son installation

Dans le terminal MATLAB, allez au répertoire nonshared en lançant la commande

cd(fullfile(matlabshared.supportpkg.getSupportPackageRoot, 'parallel', 'slurm', 'nonshared'))
  1. Ouvrez le fichier independentSubmitFcn.m; aux environs de la ligne 117, remplacez

    additionalSubmitArgs = sprintf('--ntasks=1 --cpus-per-task=%d', cluster.NumThreads);

    par

    additionalSubmitArgs = ccSBATCH().getSubmitArgs();

  2. Ouvrez le fichier communicatingSubmitFcn.m; aux environs de la ligne 126, remplacez

    additionalSubmitArgs = sprintf('--ntasks=%d --cpus-per-task=%d', environmentProperties.NumberOfTasks, cluster.NumThreads);

    par

    additionalSubmitArgs = ccSBATCH().getSubmitArgs();

  3. Ouvrez le fichier communicatingJobWrapper.sh; aux environs de la ligne 20 (après la déclaration du copyright), ajoutez la commande suivante et ajustez la version du module en fonction de la version de votre Matlab local:

    module load matlab/2022a

Redémarrez MATLAB et retournez à votre répertoire /home avec

cd(getenv('HOME'))  # ou sous Windows, cd(getenv('HOMEPATH'))

Validation

N'utilisez pas l'outil de validation Cluster Profile Manager, mais exécutez l'exemple TestParfor avec un fichier de script ccSBATCH.m adéquatement configuré.

  1. Téléchargez et extrayez des exemples de code à partir de https://github.com/ComputeCanada/matlab-parallel-server-samples.
  2. Dans MATLAB, ouvrez le répertoire TestParfor que vous venez d'extraire.
  3. Suivez les directives données dans le fichier https://github.com/ComputeCanada/matlab-parallel-server-samples/blob/master/README.md.

Note : Quand ccSBATCH.m se trouve dans votre répertoire courant, vous pouvez utiliser l’outil de validation Cluster Profile Manager pour les deux premiers tests car les autres ne sont pas encore pris en charge.

Ressources externes

Voyez aussi les ressources offertes par MathWorks.

Certaines universités ont leur propre documentation, comme