Διαχωρισμένη προφόρτωση και αποκωδικοποίηση

Ο διαχωρισμός της προφόρτωση και της αποκωδικοποίησης σε διάφορες συσκευές επιταχύνει την εξαγωγή συμπερασμάτων LLM και βελτιώνει την απόδοση

ΣυγγραφείςPerplexity Research

Για να παραχθούν tokens εξόδου από μια είσοδο prompt, το LLM inference χωρίζεται σε δύο στάδια: prefill και decode. Το prefill εκτελείται στα input tokens, γεμίζοντας τις KV caches, πριν περάσει στο στάδιο decode που παράγει tokens ένα προς ένα. Ενώ ένα μεμονωμένο βήμα decode συνήθως διαρκεί δεκάδες milliseconds, το prefill διαρκεί σημαντικά περισσότερο. Αν εκτελεστούν στις ίδιες συσκευές, ο συνδυασμός prefill με decode υποβαθμίζει την απόδοση του decode. Σε αυτό το άρθρο εξερευνούμε μια καθιερωμένη λύση με τη μορφή disaggregated prefill και decode, εκτελώντας τα σε ξεχωριστές συσκευές ώστε να μεγιστοποιηθούν τόσο η throughput του prefill όσο και οι latencies του decode.

Απόδοση Prefill έναντι Decode

Σε έναν τυπικό κινητήρα εξυπηρέτησης LLM, ο προγραμματιστής παρτίδων (batch scheduler) επιλέγει αιτήματα προς επεξεργασία σε κάθε βήμα εκτέλεσης ενός μοντέλου. Κατά την εκτέλεση σε μία μόνο συσκευή ή κόμβο, τόσο τα αιτήματα προφόρτωσης όσο και τα αιτήματα αποκωδικοποίησης ομαδοποιούνται σε παρτίδες (batching). Το κόστος της προσοχής (attention), το οποίο συσσωρεύεται κατά μήκος του μήκους της ακολουθίας, αυξάνεται τόσο για την προφόρτωση όσο και για την αποκωδικοποίηση, αναλογικά με το μήκος των καταχωρήσεων στην κρυφή μνήμη KV (kv_len). Τα αιτήματα αποκωδικοποίησης συνήθως προωθούν ένα μόνο token (qo_len=1), με ελάχιστο κόστος μέσω άλλων επιπέδων που λειτουργούν ανεξάρτητα στα tokens μιας ακολουθίας. Τα αιτήματα προφόρτωσης προωθούν χιλιάδες ή δεκάδες χιλιάδες tokens με σημαντικό κόστος μέσω πυκνών επιπέδων (μεγάλο qo_len).

Η καθυστέρηση μιας διαδρομής προώθησης (forward pass) επηρεάζεται περισσότερο από τον αριθμό των ανεξάρτητων tokens που περνούν μέσα από πυκνά επίπεδα (qo_len) παρά από τον αριθμό των tokens που ανακτώνται από την κρυφή μνήμη KV κατά την προσοχή (kv_len). Η προσοχή μπορεί να εκτελεστεί παράλληλα τόσο στον αριθμό των αιτημάτων όσο και στο kv_len αναλογικά με τα μήκη των ακολουθιών, επιτυγχάνοντας καλή αξιοποίηση. Η προφόρτωση δεσμεύεται από την υπολογιστική ισχύ (compute bound): με υψηλό το qo_len, οι πυρήνες GEMM μπορούν να δεσμεύσουν επαρκή μπλοκ κατά μήκος της διάστασης M για την πλήρη αξιοποίηση των υπολογιστικών δυνατοτήτων των σύγχρονων GPU. Η αποκωδικοποίηση δεσμεύεται από τη μνήμη (memory bound): λόγω των τυπικά χαμηλών μεγεθών παρτίδων, ο αριθμός των εισόδων κατά μήκος του M είναι συνήθως μικρός, επαρκής για ένα μόνο μπλοκ. Παρόλο που οι πυρήνες Split-K GEMM μπορούν να βελτιώσουν την αξιοποίηση SM για χαμηλά μεγέθη παρτίδων tokens, οι κρυφές μνήμες και οι μονάδες πολλαπλασιασμού μητρών παραμένουν συνήθως υπο αξιοποιημένες.

Μαζική ομαδοποίηση αιτημάτων μέσω ενός επιπέδου transformer, με προβολές query και key/value, attention και ενημερώσεις της KV cache.

Όταν αναμειγνύονται, οι παρτίδες που περιέχουν αιτήματα προφόρτωσης επιφέρουν υψηλότερες καθυστερήσεις κατά τη διαδρομή προώθησης, επηρεάζοντας αρνητικά την απόδοση αποκωδικοποίησης ολόκληρης της περίστασης (instance). Ενώ η ανάμειξη αιτημάτων προφόρτωσης με αιτήματα αποκωδικοποίησης ή η εφαρμογή τμηματοποιημένης προφόρτωσης μπορεί να βελτιώσει ελαφρώς την απόδοση αποκωδικοποίησης, είναι δύσκολο να διατηρηθεί επαρκής απόδοση προφόρτωσης ώστε να επεξεργαστούν αρκετά αιτήματα σε μια περίσταση για τη μεγιστοποίηση της απόδοσης αποκωδικοποίησης. Στην περίπτωση μεγάλων μοντέλων, με τυπικά μήκη εξόδου, για να διατηρηθεί ένα μεγάλο μέγεθος παρτίδας για αποκωδικοποίηση, η προφόρτωση πρέπει να εκτελείται αρκετά συχνά ώστε να υποβαθμίζει σημαντικά τη μέση καθυστέρηση και να προκαλεί διακοπές στην έξοδο.

Μικτός προγραμματισμός prefill–decode για τρία αιτήματα, με εμφάνιση των διαστημάτων prefill και decode σε κοινό χρονοδιάγραμμα.
Αποδιασπασμένος προγραμματισμός prefill–decode, με έναν αποκλειστικό prefiller που τροφοδοτεί την εργασία decode για τρία αιτήματα.

Αυτά τα ζητήματα μπορούν να αντιμετωπιστούν χρησιμοποιώντας ένα ξεχωριστό σύνολο κόμβων για την εκτέλεση προφόρτωσης και αποκωδικοποίησης. Συνδέοντας έναν κόμβο προφόρτωσης με πολλαπλούς κόμβους αποκωδικοποίησης, μπορούν να προγραμματιστούν επαρκή αιτήματα για προφόρτωση ώστε να μεγιστοποιηθεί η απόδοση και να διατηρηθεί ένας επαρκώς μεγάλος αριθμός ταυτόχρονων αιτημάτων στους κόμβους αποκωδικοποίησης για τη μεγιστοποίηση της απόδοσης αποκωδικοποίησης. Οι κόμβοι προφόρτωσης συμπληρώνουν τις κρυφές μνήμες KV, οι οποίες στη συνέχεια μεταφέρονται στους κόμβους αποκωδικοποίησης. Δεδομένου ότι οι αποκωδικοποιητές δεν χρειάζεται πλέον να διακόπτονται για προφόρτωση, οι καθυστερήσεις γίνονται πολύ πιο καθοριστικές, καθώς ο συνολικός αντίκτυπος της αυξανόμενης kv_len των ενεργών αιτημάτων είναι πολύ λιγότερο αισθητός. Το κόστος πληρώνεται σε αύξηση του Χρόνου έως το Πρώτο Token (TTFT - Time to First Token), καθώς η μεταφορά των κρυφών μνημών KV μέσω του δικτύου μπορεί να διαρκέσει από δεκάδες έως εκατοντάδες millisecond.

KV Messenger

Στο Perplexity, η υλοποίησή μας για τη διαχωρισμένη προφόρτωση και αποκωδικοποίηση βασίζεται σε έναν αγγελιαφόρο KV (KV messenger) ο οποίος αλληλεπιδρά με τον κινητήρα LLM για να ενορχηστρώνει τις μεταφορές κρυφής μνήμης KV από τους κόμβους προφόρτωσης στους κόμβους αποκωδικοποίησης μέσω ενός δικτύου. Στην πλευρά της προφόρτωση, ο αγγελιαφόρος δέχεται αιτήματα από τους κόμβους αποκωδικοποίησης, τα παραδίδει στον προγραμματιστή παρτίδων και παρακολουθεί την εκτέλεση της διαδρομής προώθησης για την αποστολή κρυφών μνημών KV με όσο το δυνατόν μικρότερη καθυστέρηση. Στην πλευρά της αποκωδικοποίησης, αφού κατανεμηθούν μη εκδιώξιμες σελίδες, ο αγγελιαφόρος εμποδίζει το αίτημα να προγραμματιστεί για αποκωδικοποίηση μέχρι να ειδοποιηθεί για την ολοκλήρωση της κρυφής μνήμης KV και των μεταφορών περιβάλλοντος αποκωδικοποίησης.

Ένας αποδιασπασμένος κύκλος ζωής αιτήματος, που δείχνει τον συντονισμό μεταξύ του decoder και του prefiller και τη μεταφορά δεδομένων KV cache.

Ο διαχωρισμός της προφόρτωσης απαιτεί συνδέσεις υψηλής απόδοσης και χαμηλής καθυστέρησης, επομένως η υλοποίησή μας είναι προσαρμοσμένη για RDMA, υποστηρίζοντας τόσο ελεγκτές διεπαφής δικτύου (NICs) EFA όσο και ConnectX. Ο KV Messenger είναι χτισμένος πάνω στο libfabric, χρησιμοποιώντας τα wrappers fabric-lib για την παροχή αφαιρέσεων χαμηλής καθυστέρησης υψηλότερου επιπέδου πάνω από τα πρωτόγονα στοιχεία Remote Direct Memory Access (RDMA), υλοποιώντας αποτελεσματικές μεταφορές σελίδων και μεταδεδομένων, μαζί με σηματοδότηση χαμηλής καθυστέρησης. Στο παρασκήνιο, το fabric-lib συντονίζει μια GPU και τα απευθείας συνδεδεμένα NIC της για την αντιγραφή δεδομένων από τον κόμβο προφόρτωσης στον κόμβο αποκωδικοποίησης.

Με την παραλαβή, ο κόμβος προφόρτωσης δεσμεύει ένα αντίστοιχο σύνολο σελίδων KV πηγής και προγραμματίζει το αίτημα για προφόρτωση χρησιμοποιώντας τον τοπικό του κινητήρα. Για να ελαχιστοποιηθεί η καθυστέρηση, οι μεταφορές δεν περιμένουν τη διαδρομή προώθησης: αντίθετα, τα αντίγραφα σελίδων KV ξεκινούν μόλις το μοντέλο ολοκληρώσει την προσθήκη καταχωρήσεων κρυφής μνήμης KV στην κρυφή μνήμη KV για μεμονωμένα επίπεδα. Δεδομένου ότι τα αιτήματα προφόρτωσης μπορούν να τμηματοποιηθούν, ο προγραμματιστής παρτίδων ειδοποιεί τον KV messenger για τα τρέχοντα προγραμματισμένα τμήματα πριν από την εκτέλεση. Για να υποστηρίξει τα γραφήματα CUDA ενώ μπορεί να παρακολουθεί επίπεδα, ο αγγελιαφόρος διατηρεί ένα αποκλειστικό νήμα που ελέγχει (polling) έναν μετρητή που αυξάνεται μετά την προβολή εξόδου της προσοχής. Ο μετρητής διατηρείται μόνο στον κύριο κόμβο (lead node) σε ένα περιβάλλον sharded: παρόλο που οι καταχωρήσεις κρυφής μνήμης KV είναι έγκυρες μετά την προσθήκη και πριν από την προσοχή, η προβολή εξόδου μειώνεται μεταξύ των ranks, συγχρονίζοντάς τα σιωπηρά. Μόλις παρατηρηθεί αλλαγή στον μετρητή, ο αγγελιαφόρος ειδοποιείται και καλεί το fabric-lib για να ξεκινήσει η μεταφορά ενός επιπέδου.

Μεταφορές KV cache ανά επίπεδο, με paged και single εγγραφές και μετρητές ολοκλήρωσης μεταξύ του prefiller και του decoder.

Αφού ολοκληρωθεί η μεταφορά του τελευταίου τμήματος, αντιγράφονται επίσης τυχόν επιπλέον μεταδεδομένα: η εικαστική αποκωδικοποίηση (speculative decoding) ή το MTP απαιτούν τη μετακίνηση logits και κρυφών καταστάσεων (hidden states) στον αποκωδικοποιητή. Αυτά τα αντίγραφα εκτελούνται επίσης μέσω RDMA, προς και από προκαθορισμένες περιοχές προσωρινής αποθήκευσης (buffers).

Με την ολοκλήρωση όλων των εκκρεμών μεταφορών του τελευταίου τμήματος, ο κόμβος προφόρτωσης αποδεσμεύει τις σελίδες KV και ολοκληρώνει το αίτημα. Ο κόμβος αποκωδικοποίησης δεν ειδοποιείται ρητά: αντίθετα, χρησιμοποιεί άμεσους μετρητές για να παρακολουθεί τον αριθμό των λειτουργιών που έχουν ολοκληρωθεί. Ο αριθμός των λειτουργιών RDMA στην πλευρά της προφόρτωσης είναι ανάλογος με τον αριθμό των σελίδων που μεταφέρθηκαν. Με την ολοκλήρωση του γνωστού αριθμού αντιγράφων σελίδων και περιβάλλοντος, το fabric-lib καλεί τον KV messenger για να υποδείξει ότι ένα αίτημα είναι έτοιμο για αποκωδικοποίηση. Ο αγγελιαφόρος αποδεσμεύει τυχόν περιβάλλον και παραδίδει το αίτημα στον κινητήρα LLM.

Μεταφορές Sharded KV Cache

Εάν ο προφορτωτής και ο αποκωδικοποιητής βασίζονται στον παραλληλισμό τανυστών (Tensor Parallelism - TP) και κατατμούν (shard) ή αναπαράγουν τις κρυφές μνήμες KV πανομοιότυπα, ένας ενιαίος κινητήρας μεταφοράς συντονίζει πολλαπλές συσκευές για την αποστολή και τη λήψη των σελίδων όλων των αντιγράφων (replicas). Προκειμένου να είναι δυνατή η χρήση ενός ενιαίου αγγελιαφόρου και κινητήρα μεταφοράς, παρά το γεγονός ότι ο εκτελεστής του μοντέλου αναπαράγεται σε πολλαπλές συσκευές και διεργασίες, χρησιμοποιούνται τα cuMem και cuMemImportFromShareableHandle για την κατανομή της μνήμης συσκευής που υποστηρίζει τις κρυφές μνήμες KV και για τη χαρτογράφησή της στην κύρια διεργασία. Ο κινητήρας μεταφοράς επιθεωρεί την τοπολογία του κόμβου για να βρει τα NICs και τις CPU στον πλησιέστερο κόμβο NUMA που θα χρησιμοποιηθούν για τις μεταφορές καθενός από τα τμήματα της κρυφής μνήμης KV.

Εάν η πηγή και ο προορισμός κατατμούνται πανομοιότυπα, οι μεταφορές είναι απλές καθώς υπάρχει αντιστοίχιση ένα-προς-ένα από τις συσκευές και τις σελίδες της πηγής και του προορισμού. Σε αυτή την κατάσταση, ο κατακερματισμός (sharding) βοηθάει σιωπηρά τις καθυστερήσεις μεταφοράς: χρησιμοποιώντας περισσότερες GPU, μπορούν να χρησιμοποιηθούν περισσότερα συνδεδεμένα NICs, πλησιάζοντας στην πλήρη αξιοποίηση του εύρους ζώνης. Ωστόσο, εάν υπάρχει ανατιστοιχία, ο κινητήρας μεταφοράς πρέπει να χωρίσει ή να ανακατασκευάσει σελίδες ανάλογα με την αναλογία μεταξύ των τμημάτων πηγής και προορισμού.

Τοπολογία μεταφοράς KV cache μεταξύ ενός TP/EP prefiller και DP/EP decoders, με τις συνδέσεις NIC να απεικονίζονται.

Εάν ο προφορτωτής χωρίζει την κρυφή μνήμη KV σε περισσότερες συσκευές, οι πλήρεις σελίδες ανακατασκευάζονται στον αποκωδικοποιητή στέλνοντας τα αντίστοιχα μισά έξω από τις συσκευές προφόρτωσης. Εάν ο αποκωδικοποιητής έχει περισσότερα shards, λαμβάνει σελίδες από πολλαπλές πηγές. Ο αποκωδικοποιητής πρέπει να γνωρίζει το σχήμα κατακερματισμού του προφορτωτή προκειμένου να μπορεί να υπολογίσει τον αριθμό των εγγραφών RDMA που αναμένεται να λάβει. Εάν εμπλέκεται αναπαραγωγή (replication), ο προφορτωτής ομαδοποιεί τις συσκευές σε σύνολα αντιγράφων (replica sets) που αναπαράγουν την πλήρη κρυφή μνήμη KV εντός τους. Στα σύνολα αντιγράφων προορισμού ανατίθεται τυχαία ένα από τα σύνολα πηγής προκειμένου να χρησιμοποιηθούν όλες οι διαθέσιμες συσκευές για την έναρξη εγγραφών RDMA.

Διατάξεις KV cache NHD και HND, σε αντιπαράθεση της σειράς των tokens και των heads μέσα σε κάθε επίπεδο και σελίδα.

Οι μεταφορές sharded απαιτούν μια μικρή τροποποίηση στις κρυφές μνήμες KV. Από προεπιλογή, το FlashInfer βασίζεται στη διάταξη NHD, η οποία ταξινομεί τα tokens μέσα σε μια σελίδα εντός των κεφαλών (heads). Δεδομένου ότι οι κρυφές μνήμες είναι πολύ πιθανό να είναι κατακερματισμένες κατά μήκος του αριθμού των κεφαλών προσοχής, αυτό δημιουργεί ασυνέχεια εντός της κεφαλής. Οι μεταφορές RDMA δεν υποστηρίζουν σιωπηρά εγγραφές με βήμα (strided writes), απαιτώντας μία λειτουργία ανά κεφαλή για την εκτέλεση της μεταφοράς. Αντίθετα, προκειμένου να μειωθεί ο αριθμός των αλληλεπιδράσεων με το libfabric, οργανώνουμε τις κρυφές μνήμες KV χρησιμοποιώντας τη διάταξη HND η οποία τοποθετεί τη διάσταση κεφαλής πριν από τον αριθμό των tokens. Αυτό διασφαλίζει τη συνέχεια, επιτρέποντας την αντιγραφή μιας σελίδας με μία μόνο εγγραφή.

Εικαστική Αποκωδικοποίηση (Speculative Decoding)

Η εικαστική αποκωδικοποίηση απαιτεί μικρές τροποποιήσεις στη διαχωρισμένη προφόρτωση-αποκωδικοποίηση. Στην υλοποίησή μας, οι κόμβοι προφόρτωσης δεν επιτρέπεται να κάνουν δειγματοληψία tokens (sampling). Δεδομένου ότι τα μοντέλα Sonar του Perplexity υποστηρίζουν δομημένη έξοδο, δεν θέλουμε να επωμιστούμε την πολυπλοκότητα του συγχρονισμού των υλοποιήσεων του επεξεργαστή σχήματος μεταξύ προφορτωτών και αποκωδικοποιητών. Στους μηχανισμούς MTP και εικαστικής αποκωδικοποίησης, η προφόρτωση του μοντέλου πρόχειρης έκδοσης (draft model) μέχρι το τελευταίο token περιλαμβάνει τη δειγματοληψία tokens από το μοντέλο-στόχο.

Εικαστική αποκωδικοποίηση μεταξύ του prefiller και του decoder, με εμφάνιση του μήκους της KV cache, των logits και της δειγματοληψίας token.

Για να αντιμετωπιστούν αυτά τα ζητήματα, η προφόρτωση δεν περιλαμβάνει το τελευταίο token της ακολουθίας εισόδου. Αντίθετα, οι κρυφές καταστάσεις ή τα logits από την προφόρτωση που προηγούνται του τελευταίου token μεταφέρονται και αντιμετωπίζονται ως token αποκωδικοποίησης στο επόμενο βήμα στον αποκωδικοποιητή. Ενώ αυτό αυξάνει ελαφρώς τις καθυστερήσεις, καθώς πρέπει να εκτελεστεί ένα πλήρες βήμα αποκωδικοποίησης μετά την προφόρτωση για την έκδοση του πρώτου token, η πολυπλοκότητα της υλοποίησης μειώνεται σημαντικά.

Διαχωρισμένες Αναπτύξεις (Disaggregated Deployments)

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

DeepSeek-R1

Με το DeepSeek, εξετάσαμε αναπτύξεις τόσο Παραλληλισμού Τανυστών (TP) όσο και Παραλληλισμού Δεδομένων (DP). Όπως συζητήθηκε σε προηγούμενες αναρτήσεις ιστολογίου, οι αναπτύξεις TP παρέχουν καλύτερη καθυστέρηση με κόστος τη χαμηλότερη απόδοση, απαιτώντας περισσότερες GPU για την εξυπηρέτηση βαριάς κυκλοφορίας. Οι αναπτύξεις DP κλιμακώνονται πολύ καλύτερα με το φορτίο, ωστόσο η μέγιστη απόδοσή τους είναι χαμηλότερη λόγω του κόστους επικοινωνίας μεταξύ συσκευών ή μεταξύ κόμβων.

Το DeepSeek βασίζεται στην Προσοχή Λανθάνουσας Πολλαπλής Κεφαλής (Multi-Head Latent Attention), συμπιέζοντας τις κρυφές μνήμες KV. Δεδομένου ότι όλες οι κεφαλές KV συμπιέζονται σε ένα ενιαίο λανθάνον διάνυσμα (latent vector), ο παραλληλισμός TP δεν μπορεί να κατατμήσει τις κρυφές μνήμες KV, καθώς πρέπει αντιθέτως να αναπαράγει τα λανθάνοντα διανύσματα σε όλα τα ranks. Ο κατακερματισμός συμβαίνει μετά την αποσυμπίεση, καθώς κάθε rank μπορεί να εξαγάγει διαφορετικές κεφαλές από την ίδια λανθάνουσα αναπαράσταση. Συνεπώς, όλα τα shards κρυφής μνήμης KV είναι πανομοιότυπα σε όλα τα shards προφόρτωσης και αποκωδικοποίησης.

Με μια εγκατάσταση TP εντός κόμβου (intranode), τόσο οι προφορτωτές όσο και οι αποκωδικοποιητές κατατμούνται πανομοιότυπα. Οι μεταφορές αποστέλλονται από όλα τα ranks προκειμένου να αξιοποιηθούν πλήρως όλα τα διαθέσιμα NICs. Ωστόσο, με μια ανάπτυξη DP, όπου το μέγεθος rank του TP είναι μικρότερο ή σε κάθε rank DP αντιστοιχίζεται μία μόνο GPU, οποιαδήποτε συσκευή προφόρτωσης που διαθέτει ένα αναπαραγμένο αντίγραφο της κρυφής μνήμης KV μπορεί να την αποστείλει. Για να εξισορροπηθούν τα αιτήματα σε όλα τα διαθέσιμα NICs, επιλέγουμε τυχαία μια GPU και ένα NIC για την αποστολή της κρυφής μνήμης KV από τον προφορτωτή στον αποκωδικοποιητή.

Με τη μικτή προφόρτωση-αποκωδικοποίηση, η ανάπτυξή μας R1 δυσκολευόταν να υπερβεί με συνέπεια τα 50 TPS λόγω συχνών διακοπών προφόρτωσης της τάξης των εκατοντάδων millisecond. Αντίθετα, διαχωρίζοντας την προφόρτωση, επιβαρυνθήκαμε με ποινή περίπου 100ms στο TTFT για κάθε αίτημα, αλλά ένας μεμονωμένος κόμβος προφόρτωσης μπορούσε να διατηρήσει συνεπή μεγέθη παρτίδων σε 3 κόμβους αποκωδικοποίησης, αποδίδοντας απόδοση που υπερέβαινε τα 90 TPS ενώ χειριζόταν φορτίο περίπου 1 QPS ανά κόμβο αποκωδικοποίησης. Με τις αναπτύξεις παραλληλισμού δεδομένων, το TPS ήταν ελαφρώς χαμηλότερο γύρω στο 50, ωστόσο οι περιπτώσεις μπορούσαν να χειριστούν φορτίο 1 QPS ανά rank, με 8 ranks ανά κόμβο.

Qwen3-Coder

Αυτό το μοντέλο 480B χρησιμοποιεί Προσοχή Ομαδοποιημένων Ερωτημάτων (Grouped-Query Attention - GQA), οπότε η προσοχή μπορεί να κατατμηθεί εύκολα και μπορεί να επωφεληθεί από τον παραλληλισμό τανυστών χωρίς να θυσιάζεται η μνήμη για τις κρυφές μνήμες KV. Συνεπώς, μπορέσαμε να κατατμήσουμε το μοντέλο σε 8 GPU τόσο για την προφόρτωση όσο και για την αποκωδικοποίηση, ζευγαρώνοντας περίπου 3 κόμβους αποκωδικοποίησης με έναν κόμβο προφόρτωσης. Δεδομένου ότι η προσοχή είναι κατακερματισμένη, βασιζόμαστε στη διάταξη κρυφής μνήμης KV HND για τον κατακερματισμό των κρυφών μνημών KV προφορτωτή και αποκωδικοποιητή, ζευγαρώνοντας τα ranks προφόρτωσης με τα ranks αποκωδικοποίησης και αξιοποιώντας πλήρως όλα τα NICs για τη μεταφορά τμημάτων παράλληλα.

Παραπομπή

BibTeX
@online{perplexity2025DisaggregatedPrefillAndDecode,
  author = {{Perplexity} and Nandor Licker and Lequn Chen and Kevin Hu and Erin McKnight and Phi Hoang},
  title = {{Disaggregated prefill and decode}},
  date = {2025-08-01},
  url = {https://perplexity.coolkeypoint.com/hub/blog/disaggregated-prefill-and-decode}
}