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 | Συνολικός αριθμός διεργασιών |
-c, --cpus-per-task | number_of_CPUs_per_task | Συνολικός αριθμός επεξεργαστών ανά διεργασία |
--ntasks-per-node | number_of_tasks_per_node | Συνολικός αριθμός διεργασιών ανά κόμβο |
--gres=gpu: | number_of_GPUs | Αριθμός GPU που διατέθηκαν (δείτε και GPU εργασίες) |
-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_GPUS | Number of GPUs (δείτε και GPU εργασίες) |
Αναλυτική τεκμηρίωση των 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
--gres=gpu:¶
Η παράμετρος --gres=gpu:
καθορίζει πόσες κάρτες γραφικών (GPUs) χρειάζεται να δεσμευθούν. Δείτε αναλυτικά στην σελίδα για GPU εργασίες.
-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. |