Μετάβαση στο περιεχόμενο

Slurm directives

Γνωρίζατε ότι...

το όνομα Slurm είναι αναφορά στο δημοφιλές αναψυκτικό της σειράς Futurama;

Οι παράμετροι μιας εργασίας, όπως ο αριθμός των πυρήνων ή ο χρόνος εκτέλεσης, μπορούν να δηλωθούν με δύο τρόπους.

  • Άμεσα ως παράμετροι της εντολής sbatch στη γραμμή εντολών
# sbatch --option1=value1 --option2=value2  <batch script>
  • 'Εμμεσα μέσω ενός αποκαλούμενου "script ελέγχου" (batch script)
### Batch Script 
#!/bin/bash

#SBATCH option1=value1
#SBATCH option2=value2

Η δεύτερη περίπτωση παρέχει έναν καθαρότερο τρόπο γραφής και ευκολότερη ανάγνωση του κώδικα στο μέλλον.

Ο ρόλος του batch script είναι να εκτελεί ενα σετ απο εντολές(directives) που σε άλλη περίπτωση θα έπρεπε να έχουν γραφτεί στη γραμμή εντολών μία πρός μία.

Οι #SBATCH εντολές πρέπει να προηγούνται των εκτελέσιμων εντολών του script. Από το man sbatch, παρατηρούμε ότι συντάσσονται με δύο τρόπους:

  • Σε longhand notation, χρησιμοποιώντας δύο παύλες και γράφοντας το πλήρες όνομα της παραμέτρου, SBATCH_PARAMETER, ακολουθούμενο χωρίς κενά, από το σύμβολο ίσον (=) και την ζητούμενη τιμή της παραμέτρου, VALUE:
#SBATCH --SBATCH_PARAMETER=<VALUE>
  • Σε shorthand notation, χρσιμοποιώντας μία παύλα και γράφοντας το shortcut όνομα της παραμέτρου, p αντί SBATCH_PARAMETER, και τη ζητούμενη τιμή της παραμέτρου, VALUE:
#SBATCH -p <VALUE>

Στη θέση της SBATCH_PARAMETER μπορεί να μπεί οποιαδήποτε έγκυρη παράμετρος της sbatch.

Ανάλογα με την SBATCH_PARAMETER, πρέπει να παρέχονται οι κατάλληλες τιμές για το VALUE.

#SBATCH -J hello_world_job
#SBATCH --job-name=hello_world_job

Οι παραπάνω εντολές έχουν το ίδιο αποτέλεσμα. Ορίζουν το όνομα του job προς υποβολή να είναι το "hello_world_job".

  • Σε longhand notation:
#SBATCH --job-name=hello_world_job
  • Σε shorthand notation:
#SBATCH -J hello_world_job

Βασικές παράμετροι Slurm

Παρατίθεται ένας πίνακας αναφοράς με τις πιο συνήθεις παραμέτρους της εντολής sbatch.

Option Value Αποτέλεσμα
-J, --job-name jobname Όνομα του job
-p, --partition partition_names Όνομα του partition που υποβλήθηκε το job
-t, --time days-hours:mins:secs Ανώτατο όριο συνολικού χρόνου εκτέλεσης
--mem size[K|M|G|T] Μνήμη που διατέθηκε στο job
-N, --nodes number_of_nodes Αριθμός κόμβων που διατέθηκαν
-n, --ntasks number_of_tasks Συνολικός αριθμός διεργασιών
--ntasks-per-node number_of_tasks Συνολικός αριθμός διεργασιών ανά κόμβο
-o, --output filename_pattern Όνομα αρχείου STDOUT
-e, --error filename_pattern Όνομα αρχείου STDERR
--mail-type event-type Λέξη-κλείδι γεγονότος για το οποίο ειδοποιεί το Slurm
--mail-user user|email-addr Χρήστης ή διεύθυνση email στην οποία ειδοποιεί το Slurm
--begin time Χρονική στιγμή από την οποία και μετά μπορεί να ξεκινήσει το job
-d, --dependency type:job_id Λίστα των jobs από τα οποία εξαρτάται το job που υποβάλλεται

Βασικές μεταβλητές περιβάλλοντος Slurm

To Slurm παρέχει μεταβλητές περιβάλλοντος που σχετίζονται με την εκάστοτε εργασία. Μερικές βασικές μεταβλητές φαίνονται στον παρακάτω πίνακα.

Μεταβλητή Περιγραφή
$SLURM_JOB_ID Job ID
$SLURM_JOB_NAME Job Name
$SLURM_SUBMIT_DIR Submit Directory
$SLURM_SUBMIT_HOST Submit host
$SLURM_JOB_NODELIST Node list
$SLURM_JOB_NUM_NODES Number of nodes
$SLURM_CPUS_ON_NODE Number of CPUs on node
$SLURM_CPUS_PER_TASK Threads per task
$SLURM_NTASKS_PER_NODE Number of tasks per node
$SLURM_NTASKS Total number of tasks
$SLURM_ARRAY_TASK_ID Job array ID (index) number
$SLURM_ARRAY_TASK_COUNT Total number of tasks in a job array
$SLURM_ARRAY_JOB_ID Job array's master job ID number

Αναλυτική τεκμηρίωση των Slurm Παραμέτρων

Σημαντική παρατήρηση

Μέσω των SBATCH παραμέτρων δίνεται εντολή στον δρομολογητή εργασιών (Slurm) ώστε να δεσμευθούν τα απαιτούμενα μεγέθη πόρων. Η εργασία που υποβάλλεται δεν θα ξεκινήσει να εκτελείται, μέχρι οι καθορισμένοι πόροι να γίνουν διαθέσιμοι.

Παρακάτω, τεκμηριώνονται κάποιες βασικές παράμετροι της εντολής sbatch. Σημειώνεται ότι αρκετές εντολές δεν έχουν κάποιο shorthand notation.

-J, --job-name

Η παράμετρος --job-name ορίζει το όνομα του job προς υποβολή.

Παράδειγμα
#SBATCH --job-name=hello_world_job      # Το job που θα υποβληθεί θα έχει όνομα hello_world_job

-p, --partition

Η παράμετρος --partition καθορίζει την ουρά στην οποία θα υποβληθεί το job.

Παράδειγμα
#SBATCH --partition=batch      # Το job θα υποβληθεί στην ουρά batch

-t, --time

Η παράμετρος --time δέχεται τιμές της μορφής <days-hours:minutes:seconds> και καθορίζει το μέγιστο χρόνο που χρειαζόμαστε για την εκτέλεση της εργασίας και δέχεται τιμές για ημέρες, ώρες, λεπτά και δευτερόλεπτα. Δεν είναι αναγκαίο να ορίσουμε ξεχωριστά κάθε μια επιλογή.

Παράδειγμα
#SBATCH --time=10:00:00         # (10 ώρες)
#SBATCH --time=10:00            # (10 λεπτά)
#SBATCH --time=3-05:00:00       # (3 ημέρες και 5 ώρες)

Σημαντική Παρατήρηση

Με τη χρήση της παραμέτρου --time, υπάρχει το ενδεχόμενο η εργασία που υποβλήθηκε να παραμένει στην ουρά με NODELIST(REASON), (PartitionTimeLimit).

Αυτό οφείλεται στο γεγονός ότι ορίστηκε μεγαλύτερος χρόνος από το TIMELIMIT της ουράς, στην οποία υποβάλαμε την εργασία. Σε αυτή την περίπτωση, ακυρώνουμε την εργασία και την υποβάλουμε ξανά με νέο timelimit, συμβουλευόμενοι το αποτέλεσμα της εντολής sinfo για την ουρά που μας ενδιαφέρει.


--mem

Η παράμετρος --mem καθορίζει την πραγματική μνήμη που απατείται ανά node και δέχεται τιμές της μορφής <size[units]>. Ως προεπιλεγμένες μονάδες είναι τα ΜΒ. Αν θέλουμε να ορίσουμε διαφορετικές μονάδες μπορούμε να προσθέσουμε αναλόγως το επίθημα, [K|M|G|T]. Για παράδειγμα:

Παράδειγμα
#SBATCH --mem=24000             # 24 GigaBytes
#SBATCH --mem=16G               # 16 GigaBytes

Σημαντική Παρατήρηση

Αν χρειαζόμαστε ειδικότερα μνήμη ανά επεξεργαστή χρησιμοποιούμε την παράμετρο --mem-per-cpu, η οποία καθορίζει την ελάχιστη μνήμη που απατείται ανά επεξεργαστή. Οι παράμετροι --mem και --mem-per-cpu αποκλείουν η μία την άλλη(mutually exclusive).


-N, --nodes

Η παράμετρος --nodes καθορίζει τον ζητούμενο αριθμό των nodes που απαιτούνται για την εργασία. Δέχεται τιμές της μορφής <minnodes[-maxnodes]>, όπου minnodes, maxnodes, ο ελάχιστος και ο μέγιστος αριθμός ζητούμενων nodes, αντιστοίχως. Για παράδειγμα:

Παράδειγμα
#SBATCH --nodes=4               # 4 nodes required
#SBATCH --nodes=1-4             # 1 to 4 nodes required

-n, --ntasks

Η παράμετρος --ntasks καθορίζει τον ζητούμενο αριθμό παράλληλων διεργασιών που θα δεσμευθούν για την εργασία και δέχεται, θετικές, αριθμητικές τιμές.

Παράδειγμα

Ορίζοντας τις παρακάτω παραμέτρους, η εργασία θα τρέξει με 40 παράλληλες διεργασίες, αλλά 10 διεργασίες ανά node. Δηλαδή, συνολικά θα χρησιμοποιηθούν 4 nodes.

#SBATCH --ntasks=40
#SBATCH --ntasks-per-node=10

--ntasks-per-node

Η παράμετρος --ntasks-per-node καθορίζει τον αριθμό των παράλληλων διεργασιών που θα δεσμευθούν ανά υπολογιστικό κόμβο (compute node). Η συγκεκριμένη παράμετρος, θα πρέπει να χρησιμοποιείται σε συνδυασμό με την παράμετρο --nodes. Το γινόμενο των τιμών των παραμέτρων --ntasks-per-node και --node καθορίζει τον συνολικό αριθμό των παράλληλων διεργασιών που θα χρησιμοποιηθούν για την εργασία.

Παράδειγμα

Ορίζοντας τις παρακάτω παραμέτρους, η εργασία θα τρέξει σε 2 nodes με 20 παράλληλες διεργασίες ανά node. Δηλαδή, συνολικά 40 παράλληλες διεργασίες:

#SBATCH --nodes=2
#SBATCH --ntasks-per-node=20

-c, --cpus-per-task

Η παράμετρος --cpus-per-task καθορίζει τον αριθμό των επεξεργαστών (CPUs) που χρειάζεται να δεσμευθούν ανά διεργασία (task). Εάν δεν οριστεί η συγκεκριμένη παράμετρος, θα δεσμευθεί ένας επεξεργαστής (CPU) ανά διεργασία (task).

Παράδειγμα

Ορίζοντας τις παρακάτω παραμέτρους, η εργασία θα τρέξει σε ένα node με 2 παράλληλες διεργασίες, κάθε μία από τις οποίες θα ξεκινήσει 10 OpenMP threads:

#SBATCH --nodes=1
#SBATCH --tasks-per-node=2
#SBATCH --cpus-per-task=10

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

-o, --output

Η παράμετρος --output χρησιμοποιείται για να ορίσουμε το μονοπάτι (path) στο οποίο θα εμφανίζεται το κανάλι εξόδου (STDOUT) του batch job μας. Εξ' ορισμού, το Slurm κατευθύνει τα κανάλια STDOUT και STDERROR στο ίδιο αρχείο. Δέχεται την τιμή <filename pattern>, οπού αυτή αποτελείται από το όνομα του αρχείου, συνδυάζοντας προαιρετικά καποιες ειδικές μεταβλητές του Slurm, π.χ. %j. Για παράδειγμα:

Παράδειγμα
#SBATCH --output=my_job.stdout          # Η εντολή μετονομάζει το αρχείο εξόδου σε my_job.stdout
#SBATCH --output=my_job_%j.stdout       # Με τη χρήση της `%j`, μεταφράζεται από το Slurm ως το JOB_ID του job, π.χ. επομένως το αρχείο εξόδου θα είναι το my_job_1234.stdout

-e, --error

Παρομοίως, η παράμετρος --error χρησιμοποιείται για να ορίσουμε το μονοπάτι (path) στο οποίο θα εμφανίζεται το κανάλι των σφαλμάτων (STDERR) του batch job μας. Εξ' ορισμού, το Slurm κατευθύνει τα κανάλια STDOUT και STDERROR στο ίδιο αρχείο. Δέχεται την τιμή <filename pattern>, οπού αυτή αποτελείται από το όνομα του αρχείου, συνδυάζοντας προαιρετικά καποιες ειδικές μεταβλητές του Slurm, π.χ. %j. Για παράδειγμα:

Παράδειγμα
#SBATCH --error=my_job.stderr           # Η εντολή μετονομάζει το αρχείο εξόδου σε my_job.stderr
#SBATCH --error=my_job_%j.stderr        # Με τη χρήση της `%j`, μεταφράζεται από το Slurm ως το JOB_ID του job, π.χ. επομένως το αρχείο εξόδου θα είναι το my_job_1234.stderr

Μεταβλητές ονοματοδοσίας αρχείων εξόδου

Για αναλυτικότερη περιγραφή των μεταβλητών ονοματοδοσίας αρχείων, μπορείτε να συμβουλετείτε την ενότητα Μεταβλητές ονοματοδοσίας αρχείων εξόδου.


--mail-type

Χρησιμοποιώντας την παράμετρο --mail-type, μπορούμε να επιλέξουμε αν και πότε θα μας ειδοποιεί με email ο server που εκτελεί το job. Πιο συγκεκριμένα, δέχεται διαχωρισμένες με κόμμα τις τιμές: NONE, BEGIN, END, FAIL, REQUEUE, TIME_LIMIT_50 (στέλνει email όταν το συγκεκριμένο task φτάσει στο 50% του προκαθορισμένου χρόνου), TIME_LIMIT_90 (στέλνει email όταν το συγκεκριμένο task φτάσει στο 90% του προκαθορισμένου χρόνου), ARRAY_TASKS (στέλνει email για κάθε array task) και ALL (που περιλαμβάνει τις συνθήκες BEGIN, END, FAIL, REQUEUE, και STAGE_OUT). Για παράδειγμα:

Παράδειγμα
#SBATCH --mail-type=END                 # Θα ενημερωθούμε email όταν ολοκληρωθεί η εκτέλεση του job

--mail-user

Η παράμετρος --mail-user ορίζει τη διεύθυνση email στην οποία θα σταλεί ο τύπος της ειδοποίησης που ορίστηκε με την --mail-type. Για παράδειγμα:

Παράδειγμα
#SBATCH --mail-user=user1234@mail.com   # Το email θα σταλεί στη διεύθυνση user1234@mail.com

--begin

Χρησιμοποιώντας την παράμετρο --begin, μπορούμε να ορίσουμε κάποια χρονική στιγμή απο την οποία και μετά θα μπορεί να εκτελεστεί το job. Η παράμετρος δέχεται τιμές της μορφής <time>, όπου αυτές μπορούν να είναι:

  • Ώρα, HH:MM:SS, ώστε να τρέξει το job συγκεκριμένη ώρα της ημέρας.
Παράδειγμα
#SBATCH --begin=15:30:00            # Το job θα ξεκινήσει μετά την επόμενη φορά που το ρολόι θα είναι στις 15:30:00.
  • Ημερομηνία, MMDDYY, MM/DD/YY ή YYYY-MM-DD, ώστε να τρέξει το job συγκεκριμένη ημερομηνία στις 00:00:00.
Παράδειγμα
#SBATCH --begin=2019-05-26            # Το job θα ξεκινήσει μετά την 26/05/2019 στις 00:00:00.
  • Ημερομηνία και ώρα, YYYY-MM-DD[THH:MM[:SS]], ώστε να τρέξει το job συγκεκριμένη ώρα και ημερομηνία.
Παράδειγμα
#SBATCH --begin=2019-05-26Τ15:30:00   # Το job θα ξεκινήσει μετά την 26/05/2019 στις 15:30:00.
  • Ειδικές μεταβλητές:
Παράδειγμα
#SBATCH --begin=now+1hours             # To job θα ξεκινήσει μετά την δεδομένη χρονική στιγμή και μία ώρα μετά
#SBATCH --begin=now+1weeks             # To job θα ξεκινήσει μετά την δεδομένη χρονική στιγμή και μία εβδομάδα μετά

-d, --dependency

Χρησιμοποιώντας την παράμετρο --dependency, μπορούμε να ορίσουμε να εκτελεστεί ενα job μόνο εφόσον τελειώσει κάποιο άλλο, συγκεκριμένο, job. Στην περίπτωση αυτή, χρειαζόμαστε το JOB_ID του job στο οποίο αναφερόμαστε. Δέχεται τιμές της μορφής <type:job_id[:job_id][,type:job_id[:job_id]]>.

Έστω ότι το job_1, το οποίο υποβάλλουμε χρησιμοποιώντας την παράμετρο --dependency, και ένα άλλο job_2 με JOB_ID=12345 από το οποίο εξαρτάται. Έχουμε τις παρακάτω βασικές τιμές της παραμέτρου:

  • after:job_id
Παράδειγμα
#SBATCH --dependency=after:12345            # To job_1 μπορεί να ξεκινήσει αφότου έχει ξεκινήσει το job_2
  • afterany:job_id
Παράδειγμα
#SBATCH --dependency=afterany:12345         # To job_1 μπορεί να ξεκινήσει αφότου έχει τελειώσει το job_2
  • afterok:job_id
Παράδειγμα
#SBATCH --dependency=afterok:12345          # To job_1 μπορεί να ξεκινήσει αφότου έχει τελειώσει **επιτυχώς** το job_2 (exit code ίσο με μηδέν)
  • afternotok:job_id
Παράδειγμα
#SBATCH --dependency=afternotok:12345       # To job_1 μπορεί να ξεκινήσει αφότου έχει τελειώσει **ανεπιτυχώς** το job_2 (exit code διαφορετικό του μηδενός)

-q, --qos

Η παράμετρος --qos καθορίζει κάτω από ποιο Quality of Service (QoS) θα υποβληθεί η εργασία. Εκτός από το default QoS για κάθε partition, μπορούμε να επιλέξουμε κάποιο QoS με διαφορετικά χαρακτηριστικά όσον αφορά τα partition limits (walltime, max CPUs etc). Ένα τέτοιο παράδειγμα είναι το batch-extd QoS.

Παράδειγμα
#SBATCH --qos=batch-extd

-A, --account

Η παράμετρος --account καθορίζει κάτω από ποιο account θα υποβληθεί η εργασία. Εκτός από το default account (aristotle-users) στο οποίο ανήκουν όλοι οι λογαριασμοί που έχουν πρόσβαση στην υπολογιστική υποδομή, δημιουργούνται project accounts με διαφορετικά χαρακτηριστικά όσον αφορά την πρόσβαση σε υπολογιστικούς πόρους, για παράδειγμα για συγκεκριμένες ερευνητικές ομάδες.

Παράδειγμα
#SBATCH --account=<project-account-name>

Μεταβλητές ονοματοδοσίας αρχείων εξόδου (Filename pattern variables)

Η εντολή sbatch επιτρέπει στην ονοματοδοσία αρχείων τη χρήση ειδικών μεταβλητών, που αντικαθίστανται από τις τιμές του αντίστοιχου job και ορίζονται χρησιμοποιώντας το σύμβολο % ακολουθούμενο από κάποιο γράμμα ή σύμβολο, όπως fαίνεται στον παρακάτω πίνακα.

Pattern Replacement Symbol
\\ Do not process any of the replacement symbols.
%% The character "%".
%A Job array's master job allocation number.
%a Job array ID (index) number.
%J jobid.stepid of the running job. (e.g. "128.0")
%j jobid of the running job.
%N short hostname. This will create a separate IO file per node.
%n Node identifier relative to current job (e.g. "0" is the first node of the running job). This will create a separate IO file per node.
%s stepid of the running job.
%t task identifier (rank) relative to current job. This will create a separate IO file per task.
%u User name.
%x Job name.