MATLAB
Il y a deux façons d'utiliser MATLAB sur les grappes de Calcul Canada.
- Exécuter directement MATLAB
Vous devez avoir accès à une licence, soit :
- la licence fournie sur Cedar et Béluga 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)
- Exécuter une application MATLAB compilée
Utilisez MATLAB Compiler (mcc) pour compiler votre application en un binaire que vous pouvez exécuter avec MATLAB Runtime.
Utiliser une licence externe
Calcul Canada est fournisseur 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/2018a [name@cluster ~]$ matlab -nodisplay -nojvm -r "fprintf('%s\n', license()); exit" < M A T L A B (R) > Copyright 1984-2018 The MathWorks, Inc. R2018a (9.4.0.813654) 64-bit (glnxa64) February 23, 2018 987654 [name@cluster ~]$
Si tout est en ordre, un numéro de licence sera imprimé. Assurez-vous d'effectuer ce test pour chaque grappe avec laquelle vous voulez utiliser MATLAB; les résultats pourraient être différents.
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 Calcul Canada 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 à
# MATLAB license passcode file
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
Exécuter un programme MATLAB
Important : Pour tous les calculs d'une durée de plus de cinq minutes, la tâche doit être soumise à l'ordonnanceur; consultez Exécuter des tâches.
Voici un exemple de code ː
function cosplot()
% MATLAB file example to approximate a sawtooth
% with a truncated Fourier expansion.
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
:
#!/bin/bash -l
#SBATCH --job-name=matlab_test
#SBATCH --account=def-someprof # adjust this to match the accounting group you are using to submit jobs
#SBATCH --time=0-03:00 # adjust this to match the walltime of your job
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1 # adjust this if you are using parallel commands
#SBATCH --mem=4000 # adjust this according to the memory requirement per node you need
#SBATCH --mail-user=you@youruniversity.ca # adjust this to match your email address
#SBATCH --mail-type=ALL
# Choose a version of MATLAB by loading a module:
module load matlab/2018a
# Remove -singleCompThread below if you are using parallel commands:
srun matlab -nodisplay -singleCompThread -r "cosplot"
Soumettez la tâche avec sbatch.
[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 :
- 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;
- 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 :
% Create a "local" cluster object
local_cluster = parcluster('local')
% Modify the JobStorageLocation to $SLURM_TMPDIR
local_cluster.JobStorageLocation = getenv('SLURM_TMPDIR')
% Start the parallel pool
parpool(local_cluster);
Références :
- FAS Research Computing, MATLAB Parallel Computing Toolbox simultaneous job problem
- MathWorks, ... from multiple MATLAB sessions that use a shared preference directory
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 Calcul Canada est fournisseur 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
[name@yourserver ~]$ mcc -m -R -nodisplay cosplot.m
Ceci produit le binaire cosplot et le script enveloppant run_cosplot.sh. Ce script ne fonctionnera pas tel quel sur les serveurs de Calcul Canada 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
[name@server ~]$ module load mcr/R2018a
Lancez la commande
[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
Au cours des dernières années, MATLAB Distributed Computing Server (MDCS) est devenu MATLAB Parallel Server. Cette technologie 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 noeud); pour utiliser plus d’un nœud, MathWorks offre la licence MATLAB Parallel Server qui pour l’instant n’est possible que sur Béluga.
Cette solution permet de soumettre des tâches MATLAB parallèles à partir de l’interface MATLAB locale de votre ordinateur. Vous trouverez ci-dessous les renseignements sur la configuration nécessaire pour soumettre des tâches à l’ordonnanceur Slurm.
Module d'extension pour Slurm
- Sur votre ordinateur, installez MATLAB R2020a et le Parallel Computing Toolbox.
- Téléchargez le fichier *.mlpkginstall à partir de la page MathWorks Slurm Plugin page, (bouton Download à la droite de la page, sous l'onglet Overview) et lancez l'installation.
- Entrez vos identifiants MathWorks. Si la configuration ne démarre pas automatiquement, lancez la commande MATLAB
- parallel.cluster.generic.runProfileWizard()
- Donnez les renseignements suivants :
- Sélectionnez Unix (habituellement la seule option offerte)
- Shared location: No
- Cluster host: beluga.computecanada.ca
- Username (optional): Entrez votre nom d’utilisateur de Calcul Canada (au besoin, le fichier d’identité peut être défini plus tard)
- Remote job storage: /scratch (ou un sous-répertoire unique, par exemple /scratch/tmp_matlab)
- Maximum number of workers: 960
- Matlab installation: /cvmfs/restricted.computecanada.ca/easybuild/software/2017/Core/matlab/2020a
- License type: Network license manager
- Profile Name: beluga
- 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'))
- Ouvrez le fichier independentSubmitFcn.m; aux environs de la ligne 97, remplacez
additionalSubmitArgs = sprintf('--ntasks=1 --cpus-per-task=%d', cluster.NumThreads);
par
additionalSubmitArgs = ccSBATCH().getSubmitArgs();
- Ouvrez le fichier communicatingSubmitFcn.m; aux environs de la ligne 103, remplacez
additionalSubmitArgs = sprintf('--ntasks=%d --cpus-per-task=%d', environmentProperties.NumberOfTasks, cluster.NumThreads);
par
additionalSubmitArgs = ccSBATCH().getSubmitArgs();
Redémarrez MATLAB et retournez à votre répertoire /home avec
cd(getenv('HOME'))
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é.
- 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 TestParfor 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 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.