Du er i et AI-ingeniørintervju hos OpenAI. Intervjueren spør: "Vår GPT-modell genererer 100 tokens på 42 sekunder. Hvordan gjør du det fem ganger raskere?" Du: «Jeg skal tildele flere GPU-er for raskere produksjon.» Intervjuet er over. Her er det du gikk glipp av:
Den virkelige flaskehalsen er ikke beregning, det er redundant beregning. Uten KV-cache beregner modellen din nøkler og verdier på nytt for hvert token, og gjentar arbeidet. - med KV-caching → 9 sekunder - uten KV-caching → 42 sekunder (~5 ganger tregere) La oss dykke ned for å forstå hvordan det fungerer!
For å forstå KV-bufring må vi vite hvordan LLM-er sender ut tokens. - Transformer produserer skjulte tilstander for alle tokens. - Skjulte tilstander projiseres til vokab-rommet. - Logits av det siste tokenet brukes til å generere neste token. - Gjenta for påfølgende tokens. Sjekk dette👇
For å generere et nytt token trenger vi derfor bare den skjulte tilstanden til det nyeste tokenet. Ingen av de andre skjulte tilstandene er nødvendige. La oss deretter se hvordan den siste skjulte tilstanden beregnes i transformatorlaget fra oppmerksomhetsmekanismen.
Under oppmerksomhet: Den siste raden med spørringsnøkkelprodukt innebærer: - den siste spørringsvektoren. - alle nøkkelvektorer. Den siste raden i det endelige oppmerksomhetsresultatet innebærer også: - den siste spørringsvektoren. - Alle nøkkel- og verdivektorer. Sjekk dette visualobjektet for å forstå bedre:
Ovennevnte innsikt antyder at for å generere et nytt token, trenger hver oppmerksomhetsoperasjon i nettverket bare: - spørringsvektor for det siste tokenet. - Alle nøkkel- og verdivektorer. Men det er enda en viktig innsikt her.
Når vi genererer nye tokens: - KV-vektorene som brukes for ALLE tidligere tokener endres ikke. Dermed trenger vi bare å generere en KV-vektor for tokenet som er generert ett trinn før. Resten av KV-vektorene kan hentes fra en cache for å spare databehandling og tid.
Dette kalles KV-caching! For å gjenta, i stedet for å overflødig beregne KV-vektorer for alle konteksttokener, bufre dem. Slik genererer du et token: - Generer QKV-vektor for tokenet som ble generert ett trinn før. - Få alle andre KV-vektorer fra cache. - Beregn oppmerksomhet. Sjekk dette👇
KV-caching øker hastigheten på inferensen ved å beregne promptens KV-cache før tokens genereres. Dette er nettopp grunnen til at ChatGPT bruker lengre tid på å generere den første tokenen enn resten. Denne forsinkelsen kalles time-to-first-token (TTFT). Å forbedre TTFT er et tema for en annen dag!
69,15K