Jesteś na rozmowie kwalifikacyjnej na stanowisko inżyniera AI w OpenAI. Rekruter pyta: "Nasz model GPT generuje 100 tokenów w 42 sekundy. Jak sprawisz, żeby było 5 razy szybciej?" Ty: "Przydzielę więcej GPU, aby przyspieszyć generację." Rozmowa zakończona. Oto, co przegapiłeś:
Prawdziwym wąskim gardłem nie jest obliczenia, lecz redundantne obliczenia. Bez pamięci podręcznej KV, twój model oblicza klucze i wartości dla każdego tokena, powtarzając pracę. - z pamięcią podręczną KV → 9 sekund - bez pamięci podręcznej KV → 42 sekundy (~5x wolniej) Zanurzmy się, aby zrozumieć, jak to działa!
Aby zrozumieć pamięć podręczną KV, musimy wiedzieć, jak LLM-y generują tokeny. - Transformer produkuje ukryte stany dla wszystkich tokenów. - Ukryte stany są projektowane w przestrzeni słownika. - Logity ostatniego tokena są używane do generowania następnego tokena. - Powtarzaj dla kolejnych tokenów. Sprawdź to👇
Aby wygenerować nowy token, potrzebujemy tylko ukrytego stanu najnowszego tokena. Żaden z pozostałych ukrytych stanów nie jest wymagany. Następnie zobaczmy, jak ostatni ukryty stan jest obliczany w warstwie transformera z mechanizmu uwagi.
Podczas uwagi: Ostatni wiersz produktu zapytania-klucza obejmuje: - ostatni wektor zapytania. - wszystkie wektory kluczy. Również ostatni wiersz końcowego wyniku uwagi obejmuje: - ostatni wektor zapytania. - wszystkie wektory kluczy i wartości. Sprawdź tę wizualizację, aby lepiej zrozumieć:
Powyższy wgląd sugeruje, że aby wygenerować nowy token, każda operacja uwagi w sieci potrzebuje tylko: - wektora zapytania ostatniego tokena. - wszystkich wektorów kluczy i wartości. Ale jest tu jeszcze jeden kluczowy wgląd.
Gdy generujemy nowe tokeny: - Wektory KV używane dla WSZYSTKICH poprzednich tokenów nie zmieniają się. W związku z tym musimy tylko wygenerować wektor KV dla tokena wygenerowanego jeden krok wcześniej. Pozostałe wektory KV można pobrać z pamięci podręcznej, aby zaoszczędzić obliczenia i czas.
To nazywa się pamięcią podręczną KV! Aby powtórzyć, zamiast redundancyjnie obliczać wektory KV wszystkich tokenów kontekstowych, przechowuj je w pamięci podręcznej. Aby wygenerować token: - Wygeneruj wektor QKV dla tokena wygenerowanego jeden krok wcześniej. - Pobierz wszystkie inne wektory KV z pamięci podręcznej. - Oblicz uwagę. Sprawdź to👇
Buforowanie KV przyspiesza wnioskowanie, obliczając bufor KV promptu przed generowaniem tokenów. To właśnie dlatego ChatGPT potrzebuje więcej czasu na wygenerowanie pierwszego tokena niż pozostałych. To opóźnienie jest znane jako czas do pierwszego tokena (TTFT). Poprawa TTFT to temat na inny dzień!
206