Παραμετρικές εργασίες¶
Για την υποβολή πολλαπλών εργασιών χρησιμοποιείται το εξής SBATCH directive
στο script που υποβάλλουμε:
#SBATCH --array=x-y
#SBATCH -a x-y # Τα δύο directives έχουν το ίδιο αποτέλεσμα
Όπου x,y ακέραιοι με x<y.
Με το παραπάνω SBATCH directive
στο script υποβολής ορίζεται ένα array από x εώς y.
Το παρακάτω script (έστω parametric-example.sh) θα υποβάλει 4 εργασίες, όπου η κάθε μια θα έχει στην μεταβλητή $SLURM_ARRAY_TASK_ID
μία τιμή από το array.
Παράδειγμα
#!/bin/bash
#SBATCH -t 00:01:00
#SBATCH -a 1-4
echo "ARRAY_JOB_ID = " $SLURM_ARRAY_JOB_ID
echo "ARRAY_TASK_ID = " $SLURM_ARRAY_TASK_ID
sleep 60
Έστω ότι υποβάλλεται το παραπάνω script με sbatch
και ότι το αναγνωριστικό (JOB_ID
) της εργασίας που μας επιστρέφει είναι 7168
.
Για κάθε ένα από τα ανεξάρτητα jobs παράγεται ένα output αρχείο με όνομα slurm-7168_ARRAY_TASK_ID.out
, όπου ARRAY_TASK_ID
οι δοθέντες αριθμοί, από 1
έως 4
.
Η τελική μορφή του αρχείου slurm-7168_1.out
θα είναι
ARRAY_JOB_ID = 7168
ARRAY_TASK_ID = 1
Τα task IDs ενός array είναι επίσης δυνατόν να αυξάνονται κατά ένα σταθερό βήμα. Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε το SBATCH directive
#SBATCH --array=0-15:4
το οποίο έχει το ίδιο αποτέλεσμα με το #SBATCH --array=0,4,8,12
.
Επιπλέον, μπορούμε να καθορίσουμε τον αριθμό των tasks που είναι δυνατόν να εκτελούνται ταυτόχρονα χρησιμοποιώντας το σύμβολο %
. Για παράδειγμα, χρησιμοποιώντας το SBATCH directive
#SBATCH --array=0-15%4
μόνο 4 tasks μπορούν να τρέχουν την ίδια στιγμή.
Έλεγχος του status μίας παραμετρικής εργασίας¶
Για να δούμε μία λίστα με το status στο οποίο βρίσκονται όλες οι εργασίες του job array που έχουμε υποβάλει, μπορούμε να χρησιμοποιούμε την εντολή:
# squeue
Εάν θέλουμε να ελέγξουμε το status των εργασιών συγκεκριμένου array, για παράδειγμα με JOB_ID: 7168
, μπορούμε να χρησιμοποιήσουμε την εντολή squeue
ως εξής:
# squeue --job 7168
Εάν θέλουμε να ελέγξουμε το status συγκεκριμένης εργασίας, συγκεκριμένου array, για παράδειγμα με JOB_ID: 7168 και ARRAY_TASK_ID: 3, μπορούμε να χρησιμοποιήσουμε την εντολή squeue
ως εξής:
# squeue --job 7168_3
Ακύρωση παραμετρικών εργασίων¶
Για να ακυρώσουμε μία ολόκληρη ομάδα παραμετρικών εργασιών, για παράδειγμα με JOB_ID: 7168, μπορούμε να χρησιμοποιήσουμε την εντολή scancel
ως εξής:
# scancel 7168
Για να ακυρώσουμε μία συγκεκριμένη εργασία, συγκεκριμένου array, για παράδειγμα με JOB_ID: 7168 και ARRAY_TASK_ID: 3, μπορούμε να χρησιμοποιήσουμε την εντολή scancel
ως εξής:
# scancel 7168_3
Για να ακυρώσουμε μία ομάδα εργασιών ενός συγκεκριμένου array, μπορούμε να χρησιμοποιήσουμε την εντολή scancel
ως εξής:
# scancel 7168_[1-3]
Σύνθετες επιλογές για την υποβολή πολλαπλών σειριακών εργασιών¶
Αν θέλουμε διαφορετικές τιμές για την μεταβλητή που θα χρησιμοποιήσουμε για να τρέξουμε τις εργασίες, έχουμε 2 επιλογές:
Μπορούμε να κάνουμε πράξεις με την τιμή του $SLURM_ARRAY_TASK_ID
MyParameter=$(bc <<<"scale=2 ; ($SLURM_ARRAY_TASK_ID / 3) + 5 * (3 + 1)" )
Η παραπάνω εντολή αποθηκεύει στη μεταβλητή MyParameter
το αποτέλεσμα των πράξεων με την $SLURM_ARRAY_TASK_ID
.
Για $SLURM_ARRAY_TASK_ID = 1
η MyParameter
παίρνει την τιμή 20,33.
Η παράμετρος scale ορίζει τον αριθμό των δεκαδικών ψηφίων.
Για να πάρουμε την τιμή της MyParameter
στο script μας πρέπει να την γράψουμε με το σύμβολο $
.Το MyParameter
αναφέρεται στη μεταβλητή, ενώ το $MyParameter
στην τιμή της.
Η άλλη επιλογή που έχουμε είναι να πάρουμε τις τιμές που θέλουμε από ένα αρχείο.
Έστω ότι έχουμε το αρχείο arguments.txt που είναι της μορφής:
arguments.txt
A 100
B 101
C 102
D 103
E 104
F 105
G 106
H 107
I 108
J 109
Με το ακόλουθο script (έστω parametric-args.sh) διαβάζουμε τις τιμές από το αρχείο και τις καταχωρούμε σε μεταβλητές που μπορούμε να χρησιμοποιήσουμε.
Παράδειγμα
#!/bin/bash
#SBATCH -t 00:01:00
#SBATCH -a 1-10
args=`sed -n "${SLURM_ARRAY_TASK_ID} p" arguments.txt`
arglist=($args)
arg1=${arglist[0]}
arg2=${arglist[1]}
echo "ARRAY_TASK_ID =" ${SLURM_ARRAY_TASK_ID}
echo "arg1 =" $arg1
echo "arg2 =" $arg2
sleep 60
Με τις εντολές:
args=`sed -n "${SLURM_ARRAY_TASK_ID} p" arguments.txt`
arglist=($args)
δημιουργούμε τη μεταβλητή arglist
η οποία είναι μια λίστα που περιέχει δύο διανύσματα, τα arglist[0]
και arglist[1]
. Το arglist[0]
περιέχει τα γράμματα A εως J και η arglist[1]
περιέχει τα νούμερα 101 εώς 109.
Για τις διάφορες τιμές του SLURM_ARRAY_TASK_ID
οι μεταβλητές arg1
και arg2
παίρνουν τις αντίστοιχες τιμές.
Για $SLURM_ARRAY_TASK_ID = 1
, arg1 = Α
και arg2 = 101
.
Για $SLURM_ARRAY_TASK_ID = 5
, arg1 = Ε
και arg2 = 104
.
Αλλάζοντας το #SBATCH -a 1-10
μπορούμε να διαλέξουμε ποιές σειρές στο αρχείο θέλουμε να διαβάσουμε.
π.χ. Αν το αρχείο arguments.txt
ήταν της μορφής:
arguments.txt
intro
abc
A 100
B 101
C 102
D 103
E 104
F 105
G 106
H 107
I 108
J 109
και θέλαμε τις τιμές E 104
(όγδοη σειρά του αρχείου arguments.txt) εώς H 107
(ενδέκατη σειρά του αρχείου arguments.txt), θα χρησιμοποιούσαμε #SBATCH -a 8-11
.