Περιγραφή¶
MATLAB is a high-level programming language and interactive environment for numerical computation, visualization and programming.
MATLAB R2022b¶
Η έκδοση R2022b
του Matlab μπορεί να χρησιμοποιηθεί στην συστοιχία ακολουθώντας τις οδηγίες που εμφανίζονται παρακάτω, ενεργοποιώντας το αντίστοιχο module:
# module load matlab/R2022b
All toolboxes are available
Στην συγκεκριμένη έκδοση, με τη νέα Campus-Wide άδεια, μπορούν να χρησιμοποιηθούν όλα τα διαθέσιμα toolboxes του Matlab.
MATLAB R2021a¶
Παράδειγμα χρήσης¶
Για το παράδειγμα αυτό χρησιμοποιούμε τα εξής M-files
:
myfact.m
: function για τον υπολογισμό του παραγοντικού που δίνεται ως argument.average.m
: script για τον υπολογισμό του μέσου όρου των τιμών ενός συγκεκριμένου vector.
Στο $HOME
μας στο login node, δημιουργούμε ένα νέο φάκελο όπου τοποθετούμε τα αρχεία εισόδου και το script υποβολής της εργασίας, έστω matlab-R2021a-case.sh
.
# mkdir matlab-R2021a-case
# cd matlab-R2021a-case
Το script υποβολής της εργασίας θα έχει την ακόλουθη μορφή:
SLURM submission script
#!/bin/bash
#SBATCH -J Matlab-Job
#SBATCH -p batch
#SBATCH -t 15:00
#### load module ####
module load matlab/R2021a
#### RUN MATLAB JOB ####
echo "Starting Matlab"
matlab -nodisplay << EOF &> matlab.out
a = 15;
disp(a)
disp("Calculating factorial:")
myfact(a)
disp("Calculating average:")
average
exit
EOF
EOF - Here document
Όλες οι εντολές που περιλαμβάνονται μεταξύ των δύο παρακάτω γραμμών θα τρέξουν στο Matlab:
matlab -nodisplay << EOF &> matlab.out
#
# Matlab code here...
#
EOF
Η σύνταξη αυτή είναι γνωστή ως here document και χρησιμοποιείται συνήθως όταν θέλουμε να τρέξουμε πολλές εντολές χωρίς να τις αποθηκεύσουμε σε κάποιο αρχείο. Συγκεκριμένα, δίνουμε εντολή εκκίνησης της κονσόλας του Matlab και ως ορίσματα της δίνουμε όλες τις γραμμές μέχρι το limitstring, EOF
. Τα αποτελέσματα των εντολών θα αποθηκευτούν στο αρχείο matlab.out
.
Η υποβολή της εργασίας γίνεται με την εντολή sbatch <filename.sh>
ως εξής:
# sbatch matlab-R2021a-case.sh
Παρακολουθούμε με την εντολή squeue
την εξέλιξη της εργασίας.
Eφόσον η εργασία έχει εκκινήσει μπορούμε να ελέγχουμε την πρόοδο της επίλυσης μέσω των αρχείων εξόδου. Π.χ.:
# tail -f *.out
Yποβολή παραμετρικών σειριακών εργασιών¶
Tο παρακάτω χρησιμοποιείται για να να τρέξουμε τη συνάρτηση myfact
4 φορές με ορίσματα 1, 2, 3 και 4.
Δημιουργούμε ενα νέο φάκελο με όνομα matlabdir και σε αυτόν μεταφέρουμε τo αρχείο myfact.m που δημιουργήσαμε και το script για την υποβολή, έστω matlab-R2021a-parametric-case.sh
:
SLURM submission script
#!/bin/bash
#SBATCH -J Matlab-ParamJob
#SBATCH -a 1-4
#### load module ###
module load matlab/R2021a
#### RUN MATLAB JOB ####
echo "Starting Matlab"
matlab -nodisplay << EOF &>> matlab.out
MyParameter = $SLURM_ARRAY_TASK_ID
disp("Execute function with parameter: " + MyParameter)
myfact(MyParameter)
save('myworkspace')
exit
EOF
Με την εντολή MyParameter = $SLURM_ARRAY_TASK_ID
περνάμε την τιμή του $SLURM_ARRAY_TASK_ID
στη μεταβλητή MyParameter
του MATLAB την οποία μπορούμε να επεξεργαστούμε όπως θέλουμε.
Παραλληλισμός Διεργασιών¶
Για τη δημιουργία διεργασιών που απαιτούν παράλληλους υπολογισμούς, απαιτείται η χρήση του Parallel Computing Toolbox. Οι εξειδικευμένες εντολές για αυτή τη χρήση, καθώς επίσης και σχετικές πληροφορίες μπορούν να βρεθούν στην επίσημη σελίδα της Mathworks για τη χρήση του πακέτου. Αξίζει να αναφέρουμε πως πολλές διεργασίες, όπως ο πολλαπλασιασμός μητρώων, η Matlab τις παραλληλίζει αυτόματα στη βάση των διαθέσιμων CPU.
Εναλλακτική σύνταξη και παραμετρικές εργασίες¶
Ένας εναλλακτικός τρόπος με τον οποίο μπορούμε να εκτελέσουμε ρουτίνες στη matlab
, είναι η δημιουργία εκτελέσιμων αρχείων της μορφής .m
και στη συνέχεια να τα υποβάλλουμε με την εντολή :
matlab -nodisplay -nosplash -r "run('job.m'); exit"
Γραφικό Περιβάλλον¶
Για να χρησιμοποιήσουμε το γραφικό περιβάλλον του Matlab
στην συστοιχία μπορούμε να επισκεφτούμε με έναν browser την σελίδα: https://hpc.auth.gr και να ακολουθήσουμε τα παρακάτω βήματα:
-
Από το menu επιλέγουμε
Interactive Apps
->MATLAB
-
Στην συνέχεια επιλέγουμε στην φόρμα την έκδοση του
MATLAB
και το χρονικό διάστημα για το οποίο θέλουμε να χρησιμοποιήσουμε το λογισμικό (σε ώρες): -
Eφόσον η εργασία ξεκινήσει, μπορούμε να επιλέξουμε
Launch MATLAB
.
Οδηγίες Χρήσης του Matlab Parallel Server¶
Ο Matlab Parallel Server μας επιτρέπει να εκτελέσουμε παράλληλα Matlab scripts και προσομοιώσεις Simulink στο HPC cluster "Αριστοτέλης". Ο Matlab Parallel Server υποστηρίζει εργασίες δέσμης, διαδραστικούς παράλληλους υπολογισμούς και κατανεμημένους υπολογισμούς με μεγάλους πίνακες.
-
Μέσω της υπηρεσίας ondemand επιλέγοντας "Aristotle Desktop" στο μενού "Interactive Apps".
-
Μέσω του Matlab τοπικά στο desktop μας και χρησιμοποιώντας generic cluster configuration.
-
Μέσω υποβολής batch script.
Στη συνέχεια θα παρουσιάσουμε τους πρώτους 2 τρόπους.
Για να μπορέσουμε να υποβάλλουμε εργασίες μέσω του desktop app του Matlab, τόσο από το ondemand όσο και από το desktop μας, θα πρέπει να χρησιμοποιήσουμε τα κατάλληλα cluster configuration files ώστε το Matlab να μπορεί να δημιουργήσει αυτόματα το batch script. Αρχικά θα εξηγήσουμε πώς μπορούμε να χρησιμοποιήσουμε το ondemand.
Χρήση ondemand¶
Οδηγίες εισαγωγής cluster configuration file.
- Aνοίγουμε το "Aristotle Desktop" από τις επιλογές στο μενού "Interactive Apps".
- Αφού εισέλθουμε στο desktop session ανοίγουμε το λογισμικό matlab και πηγαίνουμε στη γραμμή με τα εργαλεία (Home), στο πλαίσιο "ENVIROMENT" θα πρέπει να εμφανίζεται η επιλογή Parallel την οποία και επιλέγουμε.
- Στη συνέχεια επιλέγουμε Create and Manage Clusters
- Έπειτα θα ανοίξει ο cluster manager του Matlab όπου μπορούμε να δημιουργήσουμε δικό μας cluster configuration, να εισάγουμε κάποιο έτοιμο ή να κάνουμε αλλαγές σε ήδη υπάρχον. Όσον αφορά τη χρήση του ondemand προτείνεται να κάνουμε εισαγωγή των configuration που έχουν φτιαχτεί από την ομάδα διαχείρισης του Αριστοτέλη για κάθε partition και να γίνουν οποιεσδήποτε αλλαγές ώστε να ταιριάζουν στις απαιτήσεις μας.
- Επιλέγουμε Import όπου βάζουμε το file path "/mnt/apps/prebuilt/matlab/parallel-profiles/Batch.mlsettings".
- Μπορούμε να κάνουμε οποιεσδήποτε αλλαγές στο cluster configuration επιλέγοντας κάτω δεξιά "edit".
Ουσιαστικά μέσω του configuration profile το Matlab φτιάχνει αυτόματα το αντίστοιχο batch script με βάση τις παραμέτρους που έχουμε ορίσει. Επίσης μπορούμε να κάνουμε validation το profile επιλέγοντας "Validation" όπου εισάγουμε έναν αριθμό workers και επιλέγουμε τα κατάλληλα checkboxes.
Σε περίπτωση που δεν εμφανίζεται η επιλογή Parallel στο πεδίο Enviroment του tooltrip τότε δοκιμάζουμε να τρέξουμε στο home directory μας:
mv .matlab .matlab.bak
Η χρήση του ondemand μας επιτρέπει να χρησιμοποιήσουμε το parallel pool (parpool) του Matlab, το οποίο σημαίνει ότι μπορούμε να δεσμεύσουμε πχ. 12 CPUs και να τις χρησιμοποιήσουμε interactively για όση ώρα χρησιμοποιούμε το ondemand. Αυτό καθιστά ιδιαίτερα εύκολο το να χρησιμοποιήσουμε το cluster καθώς η όλη διαδικασία δεν διαφέρει από το να "πατήσουμε" Run στο matlab με το κατάλληλο cluster profile και να λάβουμε τα αποτελέσματα μας χωρίς να χρειαστεί να χρησιμοποιήσουμε εντολές όπως batch. Με λίγα λόγια ο κώδικας που έχουμε γράψει μπορεί χωρίς αλλαγές να κάνει scale στον Αριστοτέλη.
Χρήση μέσω του Matlab Desktop App (τοπικά)¶
Μια ιδιαίτερα χρήσιμη δυνατότητα που δίνει το matlab είναι ότι μπορούμε από το desktop app (που έχουμε τοπικά στον υπολογιστή μας) να στείλουμε τις εργασίες μας στον Αριστοτέλη και να μας επιστραφούν αυτόματα τα αποτελέσματα. Η υποβολή γίνεται με τη βοήθεια της συνάρτησης batch() που προσφέρει το Matlab Parallel Computing Toolbox. Περαιτέρω επεξήγηση της συνάρτησης αυτής μπορεί να βρεθεί στο link.
Το Matlab επιτυγχάνει την αποστολή εργασιών στον Αριστοτέλη μέσω σύνδεσης ssh. Πρώτα από όλα χρειάζεται να κατεβάσουμε τα plugin-scripts για slurm που φτιάχτηκαν από την ομάδα του Mathworks και τα οποία αλλάξαμε λίγο προκειμένου να προσαρμόζονται στον Αριστοτέλη, τα scripts μπορείτε να τα βρείτε MPS_plugin_scripts
.
Ουσιαστικά για να μπορέσουμε να τρέξουμε από το desktop app στον Αριστοτέλη θα χρειαστεί να χρησιμοποιήσουμε το κατάλληλο από τα generic profiles που φτιάχτηκαν από την ομάδα διαχείρισης του Αριστοτέλη. Αναλόγως με το λειτουργικό που έχουμε στον υπολογιστή μας θα επιλέξουμε διαφορετικό profile.
Για την δημιουργία και τη χρήση του Matlab Parallel Server θα πρέπει να έχουμε εγκαταστήσει και τοπικά το parallel computing toolbox του matlab, όπου ακολουθούμε την ίδια διαδικασία με το ondemand για να δημιουργήσουμε ή να εισάγουμε profile. Πρέπει να προσέξουμε ότι τα profiles αυτά σε αντίθεση με του ondemand είναι generic το οποίο σημαίνει ότι έχουν περισσότερες παραμέτρους που μπορεί να χρειαστεί να αλλάξουμε προκειμένου να τα προσαρμόσουμε στις απαιτήσεις μας και να υποβάλλουμε τις εργασίες μας.
Προτείνεται να χρησιμοποιήσετε το κατάλληλο profile για τις εργασίες που θέλετε να εκτελέσετε όπου θα κάνετε τις κατάλληλες αλλαγες πχ JobStorageLocation, Time, NumberOfGpus, κλπ. Το matlab θα δημιουργήσει αυτόματα το batch script με το οποίο θα υποβληθούν οι εργασίες σας.
Όταν θα πάμε να κάνουμε υποβολή τις εργασίες θα μας ζητηθεί να εισάγουμε το username μας καθώς και τον κωδικό (όχι πάντα) μας προκειμένου να συνδεθεί το matlab με ssh.
Υποβολή Παράλληλων εργασιών¶
Έστω θέλουμε να υποβάλουμε ένα script που τρέχει παράλληλα, στη περίπτωση μας είναι το run_parallel(). Μέσα στο run_parallel() υπάρχει μια parfor.
Βήματα Υποβολής Job
- Δημιουργiα αντικειμένου cluster με χρήση Configuration File
cluster_rome = parcluster("rome_partition");
-
Υποβολή job με χρήση της συνάρτησης batch
Με την ανωτέρω εντολή τρέχουμε το script run_parallel( ) δεσμεύοντας 64 πυρήνες στο partition rome και λαμβάνουμε από το script 2 εξόδους. Περισσότερες οδηγίες για την υποβολή με χρήση της συνάρτησης batch μπορείτε να βρείτε here.job_rome = batch(cluster_rome,@run_parallel,2,'Pool',16,'CurrentFolder','.');
-
Όταν υποβάλλουμε job στο cluster μέσω του desktop μπορούμε να συνεχίσουμε να χρησιμοποιούμε το Matlab, σε περίπτωση που θέλουμε να δεσμευτεί το matlab μέχρι να τελειώσει το job μπορούμε να χρησιμοποιήσουμε την εντολή
για να μπορέσουμε να δούμε το output του jobwait(job_rome)
output = fetchOutputs(job_rome)
- Από τη στιγμή που κάνουμε fetchOutputs(job), τα δεδομένα που θέλουμε είναι αποθηκευμένα στο output και μπορούμε να διαγράψουμε το job.
delete(job_rome) clear job_rome
- Σε περίπτωση που θέλουμε να ακυρώσουμε κάποιο job που στείλαμε, μπορούμε να χρησιμοποιήσουμε τη plugin συνάρτηση cancelJobFcn( ), όπου δέχεται ως παραμέτρους το cluster αντικείμενο που φτιάξαμε για να κάνουμε submit το job καθώς και το job που θέλουμε να ακυρώσουμε.
Από τη στιγμή που στείλαμε το job μπορούμε (αν δεν έχουμε δεσμεύσει το desktop μας να περιμένει) να χρησιμοποιήσουμε το matlab και να κάνουμε fetchOutputs στο command line του Matlab.
cancelJobFcn(cluster_rome,job_rome);
Τροποποίηση Cluster Profile ή Cluster Object¶
Μπορούμε πριν φτιάξουμε το cluster object μας να κάνουμε τις αλλαγές που θέλουμε στο cluster profile μέσω του cluster manager (Home->Enviroment-Parallel->Create and Manage Profiles). Mπορούμε να τροποποιήσουμε τις μεταβλητές AdditionalProperties πχ. NumberOfNodes και στη συνέχεια να μεταβούμε στη δημιουργία του cluster object. Αλλιώς μπορούμε μέσα στο script να φτιάξουμε το cluster object και στη συνέχεια να κάνουμε τις αλλαγές που θέλουμε.
cluster_obj = parcluster("rome_partition");
cluster_obj.AdditionalProperties
cluster_obj.AdditionalProperties.Time = '02:00:00';
Χρήση RemoteConnection¶
Μπορούμε να χρησιμοποιήσουμε το RemoteConnection του cluster object, που φτιάξαμε, για να τρέξουμε εντολές μέσω ssh στο cluster πχ. 'squeue' για να δούμε την κατάσταση του job μας.
Αρχικά παίρνουμε το RemoteConnection σε κάποια μεταβλητή με τη χρήση της συνάρτησης getRemoteConnection( ) των plugin scripts.
cluster_connection = getRemoteConnection(cluster_obj);
[status,result] = cluster_connection.runCommand("squeue -u username")