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

Εισαγωγή στο GNU Parallel

Το GNU Parallel είναι ένα εργαλείο γραμμής εντολών που επιτρέπει την εκτέλεση πολλών εργασιών παράλληλα. Έχει σχεδιαστεί για να διευκολύνει την κατανομή εντολών (jobs) σε πολλούς επεξεργαστές ή πυρήνες, εκμεταλλευόμενο στο μέγιστο τον υπολογιστικό χρόνο.

Documentation

Βασικές έννοιες του GNU Parallel

  1. Παράλληλη Εκτέλεση
    Όταν εκτελούμε μια εντολή πολλαπλές φορές, συχνά θέλουμε να “μοιράζουμε” τα επιμέρους job σε διάφορους πυρήνες ή κόμβους. Το GNU Parallel αυτοματοποιεί αυτή τη διαδικασία.

  2. Optimization
    Μια εντολή που διαρκεί δευτερόλεπτα ή λεπτά, όταν εκτελείται σε έναν πυρήνα, μπορεί να επωφεληθεί δραματικά από την παράλληλη εκτέλεση σε πολλούς πυρήνες. Για παράδειγμα, αντί να επεξεργάζεστε σειριακά χιλιάδες αρχεία, μπορείτε να εκμεταλλευθείτε το parallel για να εκτελεστούν πολλαπλές περιπτώσεις της ίδιας εργασίας ταυτόχρονα.

Αρχές Εργασίας του GNU Parallel

  1. Κατανομή εργασιών (jobs): Το GNU Parallel παίρνει σαν είσοδο λίστες τιμών (π.χ. ονόματα αρχείων) και εκτελεί πάνω τους την επιθυμητή εντολή παράλληλα.
  2. Αντικατάσταση ορισμάτων (replacement strings): Χρησιμοποιούνται "σύμβολα" όπως {}, {/}, {.} κ.ά. τα οποία αντικαθιστά το GNU Parallel με τα τρέχοντα ορίσματα κατά την εκτέλεση.
  3. Διαχείριση εξόδου: Υπάρχουν επιλογές που ελέγχουν την εμφάνιση της εξόδου (π.χ. διατήρηση της σειράς των αποτελεσμάτων).

Βασικές εντολές

Εκτέλεση εντολής σε πολλές παραμέτρους

Το πιο χαρακτηριστικό παράδειγμα:

parallel echo ::: 1 2 3k
  • Η echo είναι η εντολή που θα εκτελεστεί.
  • Το ::: ορίζει ότι ακολουθούν ορίσματα (1, 2, 3) που θα περαστούν στην echo.
  • Το GNU Parallel θα εκκινήσει πολλές διεργασίες της μορφής echo 1, echo 2, echo 3 ταυτόχρονα (ανάλογα με τους διαθέσιμους πόρους).

Εισαγωγή τιμών από αρχείο

Ας υποθέσουμε ότι έχετε ένα αρχείο κειμένου, file_list.txt, που περιέχει σε κάθε γραμμή ένα όνομα αρχείου για επεξεργασία, π.χ.:

data1.txt
data2.txt
data3.txt
...

Μπορείτε να δώσετε αυτά τα ονόματα αρχείων ως ορίσματα στο GNU Parallel με το ::::. Για παράδειγμα, αν θέλετε να εκτελέσετε την εντολή wc -l (η οποία μετράει γραμμές) σε κάθε αρχείο της λίστας, αρκεί να γράψετε:

parallel wc -l :::: file_list.txtη σημαία

Έτσι, το GNU Parallel θα διαβάσει όλα τα ονόματα αρχείων από το file_list.txt και θα εκτελέσει παράλληλα την εντολή:

wc -l data1.txt
wc -l data2.txt
wc -l data3.txt
...

(:::: δηλώνει ότι τα ορίσματα προέρχονται από αρχείο.)

Έλεγχος του επιπέδου παραλληλισμού

Με το -j--jobs) ορίζουμε πόσες εργασίες θα τρέχουν σε παράλληλο επίπεδο:

parallel -j 4 echo ::: A B C D E F G H

Παράδειγμα: - Θα ξεκινήσουν 4 εργασίες ταυτόχρονα. Μόλις κάποια ολοκληρωθεί, θα ξεκινήσει η επόμενη στην ουρά, ώσπου να ολοκληρωθούν όλα τα ορίσματα (A, B, C, … H).

Αν χρησιμοποιήσετε ποσοστό (π.χ. -j 100%), τότε το GNU Parallel θα χρησιμοποιήσει τόσες εργασίες όσοι είναι οι φυσικοί ή λογικοί πυρήνες της μηχανής.

Απλή αντικατάσταση (replacement strings)

  • {}: Αντικαθίσταται από την τρέχουσα τιμή/όρισμα (π.χ. A, B, C κλπ).
  • {.}: Αφαιρεί την κατάληξη αρχείου (π.χ. αν το όρισμα είναι data.txt, το {.} θα είναι data).
  • {/}: Αφαιρεί τη διαδρομή και κρατάει μόνο το όνομα αρχείου. Αν το όρισμα είναι path/to/data.txt, το {/} δίνει data.txt.

Παράδειγμα:

parallel echo "Επεξεργάζομαι το αρχείο {} χωρίς την κατάληξη {.}" ::: file1.txt file2.txt

Θα παραχθούν εντολές της μορφής:

echo "Επεξεργάζομαι το αρχείο file1.txt χωρίς την κατάληξη file1"
echo "Επεξεργάζομαι το αρχείο file2.txt χωρίς την κατάληξη file2"

Ενώσεις και διασταυρώσεις ορισμάτων

  • Διασταύρωση (Cartesian product):

parallel echo ::: A B C ::: 1 2
Παράγει εκτελέσεις:
echo A 1
echo A 2
echo B 1
echo B 2
echo C 1
echo C 2

  • Σύνδεση κατά ζεύγη (με --link):

parallel --link echo ::: A B C ::: 1 2
Παράγει εκτελέσεις:
echo A 1
echo B 2
echo C 1
!!! note "Προσοχή" Αν εξαντληθεί το ένα σύνολο, επαναχρησιμοποιούνται τα προηγούμενα.

Είσοδος από Pipe

Μπορείτε να τροφοδοτήσετε τιμές μέσω pipe (|):

cat numbers.txt | parallel "echo Το νούμερο είναι {}"

Παραδείγματα

Μετατροπή πολλών εικόνων:

parallel convert {} -resize 50% {.}-small.jpg ::: *.jpg
- Διαβάζει όλα τα αρχεία *.jpg. - Εκτελεί το ImageMagick convert με παράλληλο τρόπο. - Δημιουργεί αρχεία με κατάληξη -small.jpg για καθένα από τα αρχικά.

Συνδυασμός πολλαπλών παραμέτρων:

parallel echo "Μοντέλο {1} με όρισμα {2}" ::: modelA modelB modelC ::: arg1 arg2

Θα τρέξει κάθε μοντέλο με κάθε όρισμα, άρα συνολικά 6 εκτελέσεις:

echo "Μοντέλο modelA με όρισμα arg1"
echo "Μοντέλο modelA με όρισμα arg2"
echo "Μοντέλο modelB με όρισμα arg1"
echo "Μοντέλο modelB με όρισμα arg2"
echo "Μοντέλο modelC με όρισμα arg1"
echo "Μοντέλο modelC με όρισμα arg2"

Σημείωση

  • Το {} αναφέρεται σε όλα τα ορίσματα που δίνονται στην ίδια "σειρά" εισόδου (π.χ. modelA arg1),
  • ενώ το {1}, {2}, κ.ο.κ. αναφέρονται στο συγκεκριμένο όρισμα της αντίστοιχης πηγής εισόδου (π.χ. {1} θα πάρει το modelA ή modelB κ.λπ., ενώ το {2} θα πάρει το arg1 ή arg2).

Έλεγχος φορτίου συστήματος:

parallel --load 80% heavy_command ::: dataset1 dataset2 dataset3
- Δεν θα ξεκινά νέα διεργασία αν το φορτίο του συστήματος είναι πάνω από το 80% (ανά πυρήνα).

Σημείωση

Ένα απλό παράδειγμα υποβολής εργασίας στον HPC μπορεί να βρεθεί εδώ.

Χειρισμός Εξόδου

Διατήρηση σειράς αποτελεσμάτων: Χρησιμοποιείται το command line option -k--keep-order) ώστε οι γραμμές εξόδου να εμφανίζονται με τη σειρά των ορισμάτων.

parallel -k echo "Εκτέλεση {}" ::: A B C
Ακόμα και αν εκτελεστούν παράλληλα, η σειρά εξόδου θα είναι πάντα A, B, C.

Άμεση ροή: Η επιλογή --ungroup εκτυπώνει αμέσως την έξοδο ενός job χωρίς να περιμένει την ολοκλήρωσή του, αλλά μπορεί να “μπερδέψει” γραμμές μεταξύ διαφορετικών jobs.

Σύνοψη

Το GNU Parallel αποτελεί ένα ιδιαίτερα χρήσιμο εργαλείο για ταχύτερη εκτέλεση επαναλαμβανόμενων εργασιών, εκμεταλλευόμενο την παράλληλη φύση των σύγχρονων υπολογιστικών συστημάτων. Με απλές εντολές, δίνει τη δυνατότητα:

  1. Να μοιράσουμε εργασίες (jobs) σε πολλούς πυρήνες σε έναν κόμβο (shared memory) ή σε πολλούς κόμβους μέσω SSH.
  2. Να ελέγξουμε τον αριθμό των παράλληλων εργασιών, το φορτίο του συστήματος και τη διαχείριση της εισόδου/εξόδου.
  3. Να συνδυάσουμε λίστες ή αρχεία παραμέτρων (ή τιμές από stdin) και να δημιουργήσουμε εύκολα πολύπλοκες ροές εργασιών.

Η φιλοσοφία του μοιάζει με ένα “for loop”, παρέχοντας όμως πολλές αυτοματοποιημένες δυνατότητες που εξοικονομούν χρόνο και διευκολύνουν την ανάπτυξη παράλληλων pipelines.