Βασικές αρχές της AI
Το KV Cache σας δεν έχει πρόβλημα με τα bits. Έχει πρόβλημα με τη Γεωμετρία.

Σε identica 2-bit ακρίβεια, μια απόφαση σχετικά με το ποια άξονα quantize κάνει τη βαθμολογία του benchmark να μεταβληθεί από 2,88 σε 63,53. Τα κλειδιά και οι τιμές χρειάζονται αντίθετη μεταχείριση — και ο λόγος είναι στην εξίσωση προσοχής, όχι στο hardware.
Πάρτε το Llama-2-13B. Ομαδοποιήστε την κρυφή μνήμη κλειδιών-τιμών με μέγεθος ομαδοποίησης 32 σε δύο bits, ενώ αφήνετε όλα τα άλλα στη θέση τους — ίδιο μοντέλο, ίδιο προϋπολογισμός bits, ίδια μεγέθη ομαδοποίησης, ίδια benchmarks.
Ανάλογα με ένα μόνο στοιχείο μιας απόφασης υλοποίησης, τα αποτελέσματα ακρίβειας CoQA οδηγούν σε 2,88 ή 63,53. Η βαθμολογία που χρησιμοποιεί πλήρη ακρίβεια είναι 66,37.
Η απόφαση δεν αφορά το πόσα bits χρησιμοποιούνται συνολικά. Το ερώτημα είναι απλώς ποια άξονα επιλέγετε να ομαδοποιήσετε όταν υπολογίζετε κάθε συντελεστή κλίμακας; Όταν αποφασίσετε να χρησιμοποιήσετε το κανάλι ως διάσταση ομαδοποίησης (κλειδιά) και το token ως διάσταση ομαδοποίησης (τιμές), καταλήγετε κάπου μέσα σε τέσσερις μονάδες από την απόδοση πλήρους ακρίβειας. Αν ανατρέψετε οποιαδήποτε από αυτές τις επιλογές, θα υποστείτε απώλεια ποιότητας. Αν ανατρέψετε και τις δύο αυτές επιλογές, το μοντέλο δεν λειτουργεί πλέον.

Τέσσερις τρόποι να δαπανήσετε τα ίδια 2 bits στη ίδια κρυφή μνήμη. Αποτελέσματα από την ablation KIVI στο Llama-2-13B με μέγεθος ομαδοποίησης 32.
Η Quantization συνήθως θεωρείται ως ένα seul dial: 8 bits, 4 bits, 2 bits, με ομαλή стоимость ακρίβειας. Μέσα στην κρυφή μνήμη KV, δεν είναι έτσι. Είναι η επιλογή συστημάτων συντεταγμένων, και διαφορετικά συστήματα ισχύουν για κλειδιά και τιμές. Αυτό το κομμάτι εξηγεί το γιατί. Συνοπτικά: το σφάλμα quantization εξαρτάται από το εύρος των τιμών μέσα στις ομάδες. Τα κλειδιά και οι τιμές έχουν πολύ διαφορετική δομή. Οι άνθρωποι συχνά πέφτουν σε λάθος επειδή δεν μπορείτε να εξαγάγετε τη σωστή άξονα από την κατανομή των τιμών καθόλου. Πρέπει να κοιτάξετε πώς το σφάλμα αλλάζει μετά την κατανάλωση της προσοχής. Αυτό δίνει μια γενική αρχή για τη συμπίεση των ενδιάμεσων ενεργειών και einen καλό λόγο να αμφισβητήσετε το σφάλμα ανακατασκευής ως πρόξυλο για την ποιότητα.
Γιατί η KV Cache είναι εκεί που αυτό δαγκώνει
Κατά τη φάση γεννήτριας, ένας μετασχηματιστής αποθηκεύει όλα τα δεδομένα προβολής κλειδιών-τιμών (KV) των tokens που έχουν προηγουμένως επεξεργαστεί σε μια κρυφή μνήμη, ώστε να μην χρειάζεται να ξαναυπολογίσει αυτά τα δεδομένα. Αυτή η κρυφή μνήμη μεγαλώνει γραμμικά με το μήκος του контекστ και το μέγεθος του batch. Τελικά, αυτό θα οδηγήσει στην αύξηση της κρυφής μνήμης μεγαλύτερη από το ίδιο το μοντέλο.
Αυτή η αύξηση της αύξησης μπορεί να αναγνωριστεί εύκολα όταν κοιτάζουμε την κατανάλωση μνήμης των διαφόρων μερών του μοντέλου. Στο KVQuant analysis του LLaMA-7B, τα βάρη αντιπροσωπεύουν περίπου το 98 τοις εκατό της μνήμης σε μήκος ακολουθίας 512, με ενεργοποιήσεις στο 2 τοις εκατό. Σε контέκστ 128K, η αναλογία αντιστρέφεται σε περίπου 16 τοις εκατό βάρη και 84 τοις εκατό κρυφή μνήμη KV. Όταν κοιτάξουμε μια ανάλυση του OPT-175B που αναφέρεται από τους KIVI, βρήκαν παρόμοια αποτελέσματα. Συγκεκριμένα, σε μέγεθος batch 512 με ένα prompt 512-token, η κρυφή μνήμη KV φτάνει τα 1,2 TB — πολλά περισσότερα από το μέγεθος των βαρών του μοντέλου.
Ωστόσο, η ικανότητα είναι μόνο η μισή του προβλήματος εδώ. Η GPU πρέπει να διαβάσει ολόκληρη την κρυφή μνήμη KV από τη μνήμη της συσκευής για κάθε singled token που παράγει. Αυτό σημαίνει ότι ενώ η GPU διαβάζει την κρυφή μνήμη KV, οι πυρήνες υπολογισμού καθίστανται ανενεργοί. Όπως vậy, η μείωση του συνολικού μεγέθους της κρυφής μνήμης αυξάνει το διαθέσιμο processing headroom και μειώνει τον χρόνο που ξοδεύεται περιμένοντας τις μεταφορές δεδομένων.
Τι είναι το σφάλμα Quantization
Η Quantization ακεραίων είναι απλή μαθηματικά. Για μια ομάδα αριθμών, καταγράφετε τον μικρότερο αριθμό ως σημείο μηδέν και στη συνέχεια διαιρείτε το εύρος της ομάδας με τον αριθμό των επιπέδων που μπορούν να αναπαρασταθούν για να πάρει το μέγεθος του βήματος. Στη συνέχεια, στρογγυλοποιείτε κάθε στοιχείο στο πλησιέστερο βήμα. Δύο άμεσα αποτελέσματα ακολουθούν. Πρώτον, το σφάλμα ανά στοιχείο είναι περιορισμένο από το μισό του βήματος. Δεύτερον, το μέγεθος του βήματος είναι το εύρος της ομάδας που διαιρείται με 2ᴮ − 1. Σε 2 bits, έχετε μόνο 4 επίπεδα για να καλύψετε όποιο εύρος υπάρχει μέσα στην ομάδα. Έτσι, ένα στοιχείο που είναι 100 φορές μεγαλύτερο σε σύγκριση με τους γειτόνες του δεν εκτελείται απλώς κακώς. Φουσκώνει το μέγεθος του βήματος για όλα τα άλλα στοιχεία που μοιράζονται την ίδια ομάδα, και όλα γίνονται χοντρά μαζί. Η ομάδα είναι η μονάδα του ζημιάς. Η επιλογή άξονα σημαίνει αποφασίζοντας ποια στοιχεία υποφέρουν μαζί. Πλαίσιο του ερωτήματος διαφορετικά, δεν είναι πλέον “πόσα bits μπορώ να θυσιάσω;” αλλά “πού είναι τα ακραία στοιχεία και μπορώ να τα απομονώσω;”
Κλειδιά: Οι ακραίες περιπτώσεις ζουν σε σταθερά κανάλια
Τα μεγάλα μοντέλα γλώσσας περιέχουν ενεργοποιήσεις που είναι ασυνήθιστα μεγάλες σε σύγκριση με τις περισσότερες ενεργοποιήσεις. Sun και συνεργάτες κατέγραψαν αυτές τις πολύ μεγάλες ενεργοποιήσεις σε διαφορετικές οικογένειες μοντέλων: στο Mixtral 8x7B, η μεγαλύτερη μεγέθυνση είναι κοντά στο 7000 ενώ η μέση μεγέθυνση χαρακτηριστικών είναι γύρω στο 0,3 — περίπου τέσσερις τάξεις μεγέθους διαφορετικές. Αυτές είναι πολύ σπάνιες. Παραμένουν σταθερές σε διαστάσεις που σπάνια αλλάζουν με την είσοδο και δεν είναι τυχαίες. Λειτουργούν ως ضمنτικές προκαταλήψεις και είναι αυτά που εστιάζουν την προσοχή σε λίγα tokens: συμπεριφορά προσοχής. Στην κρυφή μνήμη κλειδιών, αυτή η δομή είναι πολύ σαφής: συγκεκριμένα κανάλια μεταφέρουν πολύ μεγάλες μεγεθύνσεις σταθερά σε κάθε token μιας ακολουθίας. Ομαδοποιήστε τα tokens, και κάθε ομάδα περιέχει αυτά τα ακραία κανάλια, ώστε κάθε ομάδα να έχει το μέγεθος του βήματος που ορίζεται από τα ακραία. Ομαδοποιήστε τα κανάλια, και τα ακραία κανάλια σχηματίζουν τις δικές τους ομάδες. Το εσωτερικό εύρος είναι μεγάλο αλλά αυτονομικό. Τα κανονικά κανάλια αφήνονται μόνα τους. Τα αποτελέσματα συμφωνούν. Σε μέσο όρο των στρωμάτων και των κεφαλών στο Llama-2-13B, η KIVI αναφέρει σφάλμα ανακατασκευής κλειδιών 13,67 με ομαδοποίηση ανά token, ενώ 4,55 ανά κανάλι, και — πιο σημαντικά — σφάλμα σκορ προσοχής 47,00 έναντι 9,60. Η quantization κλειδιών ανά token παράγει περίπου πέντε φορές το σφάλμα σκορ. Τα σκορ συμφωνούν με σημαντικά μετρικά για κλειδιά. Η ομαδοποίηση ανά κανάλι excels σε cả τους δύο τομείς.
Τιμές: Πού η直觉 σπάει
Η κρυφή μνήμη τιμών δεν δείχνει κανένα μοτίβο κανάλι-ακραίων. Φαίνεται να είναι αρκετά επίπεδη. Από μόνη της, με το εύρος του επιχειρήματος, θα μπορούσαμε να περιμένουμε ότι οποιαδήποτε από αυτές τις αξόνες θα παράγει παρόμοια ποιότητα συμπίεσης.
Δεν το κάνουν. Ανεξάρτητα από το πώς υλοποιείται η διαχείριση κλειδιών (τα αποτελέσματα 2,80 και 2,88), η συμπίεση ανά κανάλι τιμών καταρρέει το μοντέλο.
Και εδώ είναι το πιάτο: αν μετρήσετε αυτή την απώλεια χρησιμοποιώντας το σφάλμα ανακατασκευής στο αρχικό τανυστή για το οποίο κάθε τιμή συμπιέζεται, η quantization ανά κανάλι τιμών φαίνεται λίγο καλύτερη, με 3,73 έναντι 4,57. Αν επικυρώσετε τη συμπίεσή σας με τον rõσο τρόπο, θα επιλέξετε τη διαμόρφωση που καταστρέφει το μοντέλο.

Η επίλυση είναι ότι η κρυφή μνήμη τιμών δεν διαβάζεται απευθείας. Καταναλώνεται από έναν πίνακα προϊόντος: η έξοδος προσοχής είναι ένα σταθμισμένο άθροισμα των διανυσμάτων τιμών σε tokens, με σοφτ맥ς-προσοχή-σκοραρισμένα βαρίδια. Λόγω αυτού, το σχετικό σφάλμα είναι αυτό που εισάγεται κατά τη διάρκεια αυτής της διαδικασίας και όχι μέσα στα τανυστές. Μετρημένα με βάση την έξοδο προσοχής, η σειρά ήταν完全 αντεστραμμένη. Το σχετικό σφάλμα που αναφέρθηκε από την KIVI για την έξοδο προσοχής λόγω quantization διανυσμάτων τιμών ανά token ήταν 3,55 σε σύγκριση με 49,89 για quantization ανά κανάλι — πάνω από 14 φορές υψηλότερο για αυτό που φαινόταν η καλύτερη επιλογή με βάση το πώς συμπιέζεται.
Η εξήγηση είναι η σπαρότητα προσοχής, η οποία μετρήθηκε στο 84,3 τοις εκατό. Η πλειοψηφία της πληροφορίας που περιέχεται στην έξοδο μπορεί να αποδοθεί σε λίγα tokens: προσοχή-βυθίσεις-συμπεριφορά. Η quantization ανά token περιορίζει το σφάλμα κάθε token σε αυτό το token, ώστε τα σφάλματα σε μη σημαντικά tokens να πολλαπλασιάζονται με近-μηδέν-προσοχή-βαρίδια και να εξαφανίζονται αποτελεσματικά. Η quantization ανά κανάλι σπάνε το σφάλμα κάθε token σε ένα κοινό κανάλι-κλίμακας, ώστε τα κακώς-παρασταμένα tokens να μολύνουν την αναπαράσταση εκείνων που έχουν σημασία. Η σπαρότητα που κάνει την προσοχή αποτελεσματική είναι η ίδια ιδιότητα που κάνει την quantization ανά token ασφαλή.
Το μεταφερόμενο μάθημα είναι ευρύτερο από την κρυφή μνήμη KV: μετρήστε το σφάλμα συμπίεσης εκεί όπου ο τανυστής καταναλώνεται, όχι εκεί όπου αποθηκεύεται. Μια ضمنτική υπόθεση που κάνει το σφάλμα ανακατασκευής είναι ότι κάθε στοιχείο του τανυστή έχει ίσο βάρος όταν συνεισφέρει στην τελική έξοδο. Η προσοχή ρητά δεν. Κάθε operation που σταθμίζει, πυροδοτεί ή σπαρίζει την είσοδό του σπάει αυτή την υπόθεση. Οι αναγνώστες που είναι εξοικειωμένοι με το προηγούμενο άρθρο μου σχετικά με blindspots σε μετρικά αξιολόγησης σε συστήματα ανάκτησης θα αναγνωρίσουν ότι αυτά τα αποτελέσματα είναι παρόμοια με προηγουμένως περιγραφέντα αποτυχημένα: εύκολα υπολογισμένα μετρικά που αναφέρουν σε κάτι άλλο από αυτό που προορίζονταν.
Ροταριακές Εισαγωγές Συμπλέκουν τα Κλειδιά
Υπάρχουν κάποια προβλήματα με τη χρήση Ροταριακών Θέσεων Εισαγωγής (RoPE). RoPE περιστρέφει ζευγάρια καναλιών με βάση τη σχετική θέση κάθε token. Αυτή η ανάμιξη διαλύει kısmια τη σταθερή-κανάλι-δομή που έκανε την quantization κλειδιών ανά κανάλι να λειτουργήσει από την αρχή — ένα ακραίο κανάλι περιστρέφεται στους γείτονες του, και οι γείτονες κληρονομούν το εύρος. Η απάντηση του KVQuant είναι η διάταξη: quantize κλειδιά πριν εφαρμοστεί η περιστροφή, και εφαρμόστε RoPE μετά την απο-quantization. Μαζί με την quantization κλειδιών ανά κανάλι, μη-ομοιόμορφες datové, και απομόνωση ενός μικρού ποσοστού ακραίων, αυτό τους φτάνει κάτω από 0,1 perplexity υποβάθμιση σε 3 bits, και τους επιτρέπει να εξυπηρετούν το LLaMA-7B μέχρι 1 εκατομμύριο tokens контέκστ σε một A100-80GB.
Είναι επίσης σημαντικό να κατανοήσουμε το επίπεδο επίδρασης από RoPE. Οι συγγραφείς του “RotateKV” ανέφεραν αύξηση 145% στα σφάλματα quantization όταν προστέθηκε RoPE, και σημείωσαν ότι τα ακραία κανάλια διαφέρουν μεταξύ των κεφαλών προσοχής — και αυτό είναι γιατί η εφαρμογή ενός κοινού πίνακα περιστροφής παντού είναι ανεπαρκής, και οι περιστροφές-προσαρμοσμένες-στης-κεφαλής κάνουν καλύτερα.
Ο Φόρος Συστημάτων και Γιατί Δεν Είναι Μια Λεπτομέρεια
Η quantization ανά token ταιριάζει καλά στη διαδικασία αποκωδικοποίησης. Κάθε token φτάνει. Quantize το, προσθέστε το στη σειρά (沿着 το token-διάσταση), τίποτα άλλο δεν κινείται.
Ωστόσο, η quantization ανά κανάλι δεν ταιριάζει. Όπως ένας πίνακας στατιστικών στοιχείων ενός καναλιού εκτείνεται σε tokens που δεν έχουν παραχθεί ακόμη, δεν μπορείτε να υπολογίσετε einen συντελεστή κλίμακας όταν ένα token φτάνει. Η λύση της KIVI είναι να διατηρήσετε τα πιο πρόσφατα tokens — μέχρι 128 — σε πλήρη ακρίβεια σε ένα υπόλοιπο буφέ, και να quantize σε ομάδες όταν έχουν συλλεχθεί αρκετά.
Όπως συμβαίνει, ο υπόλοιπος буφές γίνεται φορτίος, αντί να είναι απλώς ένα περιστασιακό πράγμα. Στο GSM8K με το Llama-2-7B, η πλήρης ακρίβεια σκοράρει 13,50. Πλήρως quantized σε 2 bits με τις σωστές αξόνες, σκοράρει 5,76. Οι ίδιες αξόνες και τα ίδια bits, συν τον υπόλοιπο буφέ των πρόσφατα παραχθέντων tokens σε πλήρη ακρίβεια, σκοράρουν 12,74. Ένας ολισθηρός παραθύρος πρόσφατα παραχθέντων tokens σε πλήρη ακρίβεια θα ανακτήσει πολύ από αυτό που χάθηκε λόγω επιθετικής quantization σε δύσκολα προβλήματα πολλαπλών βημάτων — το οποίο θα είχε νόημα αν σκεφτόμασταν ποια tokens προσελκύουν την προσοχή από μια αλυσίδα αριθμητικών операциών.
Υπάρχει ένα σημαντικό όφελος από το να κάνετε όλα αυτά σωστά — όπως αναφέρει η KIVI, 2,6 φορές λιγότερη χρήση μνήμης για το Llama-2-7B, επιτρέποντας μεγαλύτερα μεγέθη batch, καθώς και 2,35 έως 3,47 φορές καλύτερη απόδοση σε μια πραγματική εργασία υπηρεσίας.
Τι να Κάνετε με Αυτό
- Μη χρησιμοποιείτε ένα quantizer και για τα δύο. Χρησιμοποιήστε διαφορετικούς quantizers για κλειδιά (ανά κανάλι) και για τιμές (ανά token). Μια διαδικασία που εφαρμόζει ένα seul quantizer στο “KV cache” έχει πιθανώς ήδη θυσιάσει την περισσότερη δυνατή ποιότητα όταν χρησιμοποιεί ένα μικρό αριθμό bits για να αντιπροσωπεύσει κάθε τιμή.
- Quantize κλειδιά πριν από RoPE. Αυτό είναι ένα ζήτημα ορθότητας, αντί για ένα ζήτημα προτίμησης.
- Αποθηκεύστε ένα παράθυρο πλήρης ακρίβειας πρόσφατα παραχθέντων tokens. Αν και η αποθήκευση ενός τέτοιου παραθύρου λαμβάνει πολύ λίγη μνήμη σε σύγκριση με το πόσο μεγάλη μπορεί να είναι η κρυφή μνήμη, είναι ακριβώς αυτή η περιοχή που παράγει πολλή ακρίβεια για δύσκολα καθήκοντα.
- Μη επικυρώσετε με σφάλμα ανακατασκευής. Επικυρώστε πάντα με βάση την έξοδο προσοχής ή με βάση την απόδοση του τελικού καθήκοντος. Το μετρικό αποθήκευσης δεν είναι απλώς θορυβώδες — για τις τιμές, δείχνει την λάθος κατεύθυνση.
- Μη επικυρώσετε σε βραχείς-περιόδου-πολλαπλών-επιλογών-βεντάλ. Οι συγγραφείς της KIVI αποφεύγουν σκόπιμα καθήκοντα όπως το MMLU για αυτή την αξιολόγηση, επειδή ένα seul βήμα αποκωδικοποίησης που διαβάζει τα output logits δεν ασκεί σχεδόν καθόλου την κρυφή μνήμη. Κάθε αξιολόγηση που δεν χτίζει μια κρυφή μνήμη με το χρόνο και στη συνέχεια εκτελεί γεννήτρια από αυτή δεν θα μπορεί να παρατηρήσει τις αποτυχίες που είναι εγγενείς στη σχεδίαση του συστήματός σας.
Πού Πηγαίνει το Έργο
Αν και υπάρχει ακόμη κάτι να γίνει σχετικά με τη γεωμετρική φύση του προβλήματος, πολλοί ερευνητές συνεχίζουν να μελετούν τους τρόπους με τους οποίους οι ακραίες διαύλους διανέμονται μεταξύ των διαφόρων κεφαλών μετασχηματιστή, και πώς οι περιορισμοί του hardware επηρεάζουν ποιες ομαδοποιήσεις είναι φθηνότερες: InnerQ διπλώνει την καναλο-προς-κλειδί-κανονικοποίηση στο κλειδί και στα βάρη ερωτήματος κατά τη διάρκεια της προ-πλήρωσης. Έτσι, δεν υπάρχει πρόσθετο επιβάρυνση κατά τη διάρκεια του χρόνου εκτέλεσης. Επιπλέον, το InnerQ αποθηκεύει παράθυρα υψηλής ακρίβειας και για τα πρόσφατα παραχθέντα tokens και για τα tokens προσοχής. Κάνοντας così, το InnerQ εξαλείφει την ευκαιρία για ακραία στο κανάλι-βυθίσεων να μολύνουν τα γειτονικά κανάλια.
Άλλοι προτείνουν ότι αντί να αποθηκεύουν ολόκληρη την κρυφή μνήμη, θα πρέπει να αποθηκεύουν μόνο αρκετές πληροφορίες για να μπορέσουν να ανακατασκευάσουν το κλειδί και/ή την τιμή(ες) κατά την demande από μια μικρότερη αποθηκευμένη αναπαράσταση.
Τέλος, είναι σημαντικό να θυμόμαστε ότι η ακρίβεια δεν είναι ο μόνος παράμετρος που επηρεάζεται από την quantization. Πρόσφατα δημοσιευμένη έρευνα έδειξε υποβάθμιση συσχετίσεων που οφείλονται στην quantization των κρυφών μνημών KV. Επιπλέον, αυτή η έρευνα έδειξε υποβάθμιση συσχετίσεων ακόμη και σε περιβάλλοντα υπηρεσιών παραγωγής vLLM που χρησιμοποιούν FP8 κρυφές μνήμες μαζί με ένα πρωτόκολλο ανάκτησης χωρίς εκπαίδευση που αποκατέστησε μέχρι και 97% του χαμένου συσχετισμού. Όπως vậy, ενώ μια διαμόρφωση μπορεί να κρατήσει τα αποτελέσματα του benchmark, δεν σημαίνει ότι διατηρεί όλους τους άλλους σχετικούς παράμετρους που σας αφορούν.
Η Γενική Αρχή
Η ιδέα της quantization έχει οριστεί ως “προϋπολογισμός ακρίβειας”: πόσα bits μπορώ να θυσιάσω; Η κρυφή μνήμη KV δείχνει ότι το πιο χρήσιμο ερώτημα είναι δομικό. Η ακρίβεια ανατίθεται σε ομάδες. Η ομάδα είναι η μονάδα του ζημιάς, και η άξονα που ομαδοποιείτε καθορίζει ποια στοιχεία μοιράζονται την τύχη τους. Η σωστή άξονα είναι αυτή στην οποία ο τανυστής σας καταναλώνεται, δηλαδή, ο τρόπος με τον οποίο χρησιμοποιείτε τον τανυστή σας και όχι πώς ο τανυστής σας φαίνεται όταν αποθηκεύεται στη μνήμη. Τα κλειδιά χρησιμοποιούνται μέσω μιας dot-προϊόντος-υπολογισμού ενάντια στο ερώτημα. Ένα seul διαταραγμένο κανάλι θα μολύνει όλα τα σκορ. Οι τιμές καταναλώνονται μέσω μιας sparse-βαρίδων-μέσου-ωρίμανσης σε tokens. Έτσι, ένα seul διαταραγμένο token απλώς σταθμίζεται έξω.
Δύο τανυστές με ταυτόσημες διαστάσεις και παραχθέντες από δύο συνεχόμενες στρώσεις αντιμετωπίζονται διαφορετικά. Αξίζει να ρωτήσετε για κάθε ενεργοποίηση που σκοπεύετε να συμπιέσετε: ποια λειτουργία συρρικνώνει αυτό, και η ομαδοποίηση μου σέβεται αυτό;












