Sei in un colloquio per Ricercatore Scientifico presso OpenAI. L'intervistatore chiede: "Come espandresti la lunghezza del contesto di un LLM da 2K a 128K token?" Tu: "Affinerò il modello su documenti più lunghi con un contesto di 128K" Colloquio finito. Ecco cosa ti sei perso:
Estendere la finestra di contesto non riguarda solo matrici più grandi. In un trasformatore tradizionale, espandere i token di 8 volte aumenta le esigenze di memoria di 64 volte a causa della complessità quadratica dell'attenzione. Fai riferimento all'immagine qui sotto! Quindi, come gestiamo tutto ciò? continua...👇
1) Attenzione Sparsa Limita il calcolo dell'attenzione a un sottoinsieme di token: - Utilizzando l'attenzione locale (i token si concentrano solo sui loro vicini). - Permettendo al modello di apprendere su quali token concentrarsi. Ma questo comporta un compromesso tra complessità computazionale e prestazioni.
Un'idea simile è stata utilizzata in ModernBERT. → Attenzione globale completa ogni 3° strato → Attenzione locale (128 token) altrimenti Risultato: - Lunghezza della sequenza 16 volte maggiore - Prestazioni molto migliori - Codificatore più efficiente in termini di memoria Semplice ma potente. 👇
Ecco una spiegazione intuitiva tratta dal documento: Immagina di leggere un libro. Per ogni frase che leggi, hai bisogno di essere completamente consapevole dell'intera trama per capire la maggior parte di essa (attenzione globale completa)? Oppure è sufficiente essere consapevoli del capitolo attuale (attenzione locale), purché di tanto in tanto tu ripensi alla sua importanza rispetto alla trama principale (attenzione globale)? Nella stragrande maggioranza dei casi, è la seconda.
2) Flash Attention Questo è un metodo veloce ed efficiente in termini di memoria che mantiene l'esattezza dei meccanismi di attenzione tradizionali, cioè utilizza l'attenzione globale ma in modo efficiente. L'intera idea ruota attorno all'ottimizzazione del movimento dei dati all'interno della memoria GPU. Capiremo meglio!
Alcuni dettagli di base: - Un thread è l'unità di esecuzione più piccola. - Diversi thread formano un blocco. Inoltre: - I thread in un blocco condividono una memoria veloce (ma scarsa) chiamata SRAM. - Tutti i blocchi condividono una memoria globale chiamata HBM (abbondante ma lenta). Controlla questo 👇
L'attenzione sposta grandi matrici tra SRAM e HBM: Per calcolare QK: - distribuire le matrici ai thread - calcolare, e - inviare il prodotto a HBM Per calcolare softmax: - distribuire il prodotto ai thread - calcolare, e - inviare l'output a HBM Ripetere per tutti i livelli. Controlla questo 👇
L'attenzione flash coinvolge ottimizzazioni a livello hardware in cui utilizza la SRAM per memorizzare nella cache i risultati intermedi. In questo modo, riduce i movimenti ridondanti, offrendo un aumento della velocità fino a 7,6 volte rispetto ai metodi di attenzione standard. Controlla questo 👇
98,93K