Model nie wykonuje jednej pracy, tylko dwie — i są to prace tak różne, że gdyby nie dzieliły wag, nikt nie nazwałby ich tym samym słowem.
Czym są prefill i decode
Prefill to faza przetwarzania promptu: model przepuszcza przez wszystkie warstwy cały tekst wejściowy, liczy dla każdego tokenu klucz i wartość i zapisuje je do pamięci podręcznej kontekstu. Decode to faza generowania: model produkuje jeden token, dopisuje go do historii i powtarza ten krok aż do warunku zatrzymania.
Dlaczego prefill jest szybki
Cały prompt jest znany z góry, więc wszystkie jego tokeny można przetworzyć naraz. Zamiast przepuszczać przez warstwę jeden wektor, przepuszcza się macierz o tysiącu wierszy — przy tym samym jednym odczycie wag z pamięci.
Koszt odczytu rozkłada się na tysiąc porcji pracy. Wąskie gardło przestaje być pamięcią, a zaczyna być liczeniem, i akcelerator wreszcie pracuje tak, jak został zaprojektowany. Model generujący trzydzieści tokenów na sekundę potrafi w prefillu przetwarzać ich dwa tysiące.
Prefill nie skaluje się jednak liniowo: każdy token musi spojrzeć na każdy inny, więc przy bardzo długich promptach dochodzi składnik rosnący kwadratowo.
Dlaczego decode jest wolny
Żeby policzyć token numer siedem, trzeba znać szósty. To ograniczenie logiczne, nie techniczne — żaden sprzęt go nie obejdzie. Każdy krok wymaga przejścia jednego wektora przez cały model, czyli odczytania wszystkich wag, żeby wyprodukować jedno słowo.
W tej fazie wykorzystanie mocy obliczeniowej akceleratora wynosi od jednego do trzech procent. To marnotrawstwo jest przyczyną, dla której dostawcy API przetwarzają dziesiątki rozmów w jednej partii.
Dwa profile zadania
Krótkie pytanie i długa odpowiedź: prefill jest niezauważalny, czas zdominowany przez decode w ponad dziewięćdziesięciu procentach.
Długi dokument i krótkie streszczenie: prefill zjada dwie trzecie czasu, a generowanie kończy się w kilka sekund.
Nie ma jednej optymalizacji pomagającej na oba profile — i to jest główny powód, dla którego warto znać to rozróżnienie.