Αλλαγή διαμόρφωσης κατά το χρόνο εκτέλεσης για το PySpark

ψήφοι
2

Προσπαθούσα να αναπτύξω ένα εκπαιδευμένο ευρετήριο Faiss στο PySpark και να κάνω μια κατανεμημένη αναζήτηση. Έτσι, ολόκληρη η διαδικασία περιλαμβάνει:

  1. Προ-διαδικασία
  2. Φόρτωση Faiss Index (~ 15G) και κάντε Faiss Search
  3. Μετά την επεξεργασία και εγγραφή σε HDFS

Ορίζω CPUs ανά εργασία ως 10 ( spark.task.cpus=10 ) για να κάνετε αναζήτηση πολλαπλών νημάτων. Αλλά το βήμα 1 και το βήμα 3 μπορούν να χρησιμοποιούν μόνο 1 CPU ανά εργασία. Για να χρησιμοποιήσω όλες τις CPU που θέλω να ορίσω spark.task.cpus=1 πριν από τα βήματα 1 και 3. Έχω δοκιμάσει την καθορισμένη μέθοδο του RuntimeConfig αλλά φαίνεται ότι έκανε το πρόγραμμά μου κολλημένο. Οποιεσδήποτε συμβουλές σχετικά με το πώς να αλλάξετε τη ρύθμιση κατά την εκτέλεση ή πώς να βελτιστοποιήσετε αυτό το πρόβλημα;

Παράδειγμα κώδικα:

def load_and_search(x, model_path):
    faiss_idx = faiss.read_index(model_path)
    q_vec = np.concatenate(x)
    _, idx_array = faiss_idx.search(q_vec, k=10)
    return idx_array


data = sc.textFile(input_path)

# preprocess, only used one cpu per task
data = data.map(lambda x: x)

# load faiss index and search, used multiple cpus per task
data = data.mapPartitioins(lambda x: load_and_search(x, model_path))

# postprocess and write, one cpu per task
data = data.map(lambda x: x).saveAsTextFile(result_path)
Δημοσιεύθηκε 26/04/2020 στις 10:00
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Εναλλακτική ιδέα: χρήση mapPartitions για τα βήματα 1 και 3. Στη συνέχεια, χρησιμοποιήστε μια ομάδα πολλαπλών επεξεργασιών σε κάθε εργαζόμενο για να χαρτογραφήσετε τα στοιχεία στο διαμέρισμα παράλληλα. Με αυτόν τον τρόπο, μπορείτε να χρησιμοποιήσετε όλα τα cpus που έχουν εκχωρηθεί σε έναν εργαζόμενο χωρίς να αλλάξετε τη διαμόρφωση (το οποίο δεν ξέρω αν είναι καθόλου δυνατό).

Ψευδοκώδικας:

def item_mapper(item):
    return ...

def partition_mapper(partition):
    pool = mp.Pool(processes=10)
    yield from pool.imap(partition, item_mapper)

rdd.mapPartitions(partition_mapper)
Απαντήθηκε 13/05/2020 στις 10:59
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more