Sei in un colloquio per ingegnere AI presso OpenAI. L'intervistatore chiede: "Il nostro modello GPT genera 100 token in 42 secondi. Come lo faresti 5 volte più veloce?" Tu: "Allouerò più GPU per una generazione più veloce." Colloquio finito. Ecco cosa ti sei perso:
Il vero collo di bottiglia non è il calcolo, ma il calcolo ridondante. Senza la memorizzazione nella cache KV, il tuo modello ricalcola chiavi e valori per ogni token, ripetendo il lavoro. - con la memorizzazione nella cache KV → 9 secondi - senza la memorizzazione nella cache KV → 42 secondi (~5 volte più lento) Approfondiamo per capire come funziona!
Per comprendere la memorizzazione nella cache KV, dobbiamo sapere come i LLM producono i token. - Il Transformer produce stati nascosti per tutti i token. - Gli stati nascosti vengono proiettati nello spazio del vocabolario. - I logit dell'ultimo token vengono utilizzati per generare il token successivo. - Ripetere per i token successivi. Controlla questo👇
Quindi, per generare un nuovo token, abbiamo bisogno solo dello stato nascosto dell'ultimo token. Nessuno degli altri stati nascosti è necessario. Successivamente, vediamo come viene calcolato l'ultimo stato nascosto all'interno del livello del trasformatore dal meccanismo di attenzione.
Durante l'attenzione: L'ultima riga del prodotto query-key coinvolge: - l'ultimo vettore di query. - tutti i vettori di chiave. Inoltre, l'ultima riga del risultato finale dell'attenzione coinvolge: - l'ultimo vettore di query. - tutti i vettori di chiave e valore. Controlla questa visualizzazione per capire meglio:
L'idea sopra suggerisce che per generare un nuovo token, ogni operazione di attenzione nella rete ha bisogno solo di: - vettore di query dell'ultimo token. - tutti i vettori di chiave e valore. Ma c'è un'altra importante intuizione qui.
Man mano che generiamo nuovi token: - I vettori KV utilizzati per TUTTI i token precedenti non cambiano. Quindi, dobbiamo solo generare un vettore KV per il token generato un passo prima. Il resto dei vettori KV può essere recuperato da una cache per risparmiare calcolo e tempo.
Questo si chiama caching KV! Per ribadire, invece di calcolare in modo ridondante i vettori KV di tutti i token di contesto, memorizzali nella cache. Per generare un token: - Genera il vettore QKV per il token generato un passo prima. - Ottieni tutti gli altri vettori KV dalla cache. - Calcola l'attenzione. Controlla questo👇
La memorizzazione nella cache KV accelera l'inferenza calcolando la cache KV del prompt prima di generare i token. Questo è esattamente il motivo per cui ChatGPT impiega più tempo a generare il primo token rispetto agli altri. Questo ritardo è noto come tempo-per-primo-token (TTFT). Migliorare il TTFT è un argomento per un'altra volta!
69,16K