Migliorare l'efficienza nei modelli di linguaggio grandi
Un nuovo approccio alla gestione della memoria migliora le prestazioni dei modelli linguistici grandi.
― 7 leggere min
I modelli di linguaggio di grandi dimensioni (LLM) come GPT e PaLM stanno cambiando il modo in cui interagiamo con la tecnologia, permettendo applicazioni come aiuto nella programmazione e chatbot. Molte aziende stanno cercando di offrire questi modelli come servizi online, ma gestirli costa un sacco. Questi modelli di solito hanno bisogno di un sacco di hardware, come GPU, per elaborare le richieste in fretta. Gestire una sola richiesta può costare dieci volte di più rispetto a una ricerca tradizionale a causa delle alte richieste. Quindi, capire come migliorare l'efficienza nel servizio degli LLM e ridurre i costi è fondamentale.
Gli LLM generano testo prevedendo una parola (o token) alla volta basandosi sulle parole precedenti e sul contesto. Questo significa che spesso lavorano in sequenza, il che può rallentare le cose e limitare il numero di richieste che possono essere gestite contemporaneamente. L'uso della memoria per queste richieste può essere significativo e spesso porta a inefficienze.
Sfide nella Gestione della Memoria
Quando un modello gestisce le richieste, ha bisogno di mantenere quello che si chiama un cache chiave-valore (KV) per ricordare il contesto della conversazione o del compito. Questo cache può diventare piuttosto grande e, se non gestito correttamente, porta a sprechi di memoria e limita il numero di richieste che possono essere elaborate contemporaneamente.
Attualmente, molti sistemi memorizzano le Cache KV in modo da utilizzare blocchi contigui di memoria. Questo metodo ha due problemi principali. Prima di tutto, c'è spesso un gran spreco di memoria perché le richieste possono variare notevolmente in lunghezza. Se una richiesta è impostata per utilizzare un blocco di memoria molto più grande di quanto realmente necessiti, questo porta a una Frammentazione Interna, dove alcune parti di quel blocco di memoria sono semplicemente inutilizzate. Secondo, se i blocchi di memoria sono allocati in modo tale che non possano essere facilmente riutilizzati da altre richieste, questo può portare a una frammentazione esterna.
Entrambi questi problemi riducono l'efficienza complessiva del sistema, il che è problematico quando si cerca di gestire molte richieste contemporaneamente. C'è anche una perdita di potenziale condivisione della memoria, che potrebbe avvenire quando più richieste condividono lo stesso contesto o informazioni.
Soluzione Proposta
Per affrontare questi problemi di gestione della memoria, viene introdotto un nuovo approccio chiamato PagedAttention. Questo sistema si ispira a come i sistemi operativi tradizionali gestiscono la memoria utilizzando una tecnica chiamata paging. Invece di dedicare un blocco specifico di memoria per ogni richiesta, la cache KV è divisa in blocchi più piccoli. Questi blocchi possono essere memorizzati in modo non contiguo, permettendo alla memoria di essere utilizzata in modo più flessibile.
Questo design fa alcune cose importanti:
- Riduce la frammentazione interna: Poiché i blocchi più piccoli possono essere allocati secondo necessità, c'è meno spazio sprecato all'interno di ogni blocco.
- Elimina la frammentazione esterna: Tutti i blocchi sono delle stesse dimensioni, il che significa che possono essere riutilizzati più facilmente tra le diverse richieste.
- Facilita la condivisione della memoria: Le richieste che condividono lo stesso contesto possono utilizzare gli stessi blocchi di memoria, massimizzando l'efficienza.
Miglioramenti delle Prestazioni
I test mostrano che questo nuovo approccio alla gestione della memoria migliora significativamente il Throughput degli LLM popolari, rendendoli da 2 a 4 volte più efficienti rispetto ai sistemi esistenti. Questo miglioramento è particolarmente evidente quando si elaborano sequenze più lunghe, modelli più grandi o metodi di decodifica complessi.
Come Funzionano i Modelli di Linguaggio
Gli LLM come il modello Transformer generano testo valutando la probabilità della prossima parola in una frase basandosi su ciò che è già stato detto. Per ogni nuova parola, il modello guarda ai token che l'hanno preceduta e utilizza quelli per prevedere il successivo.
Quando viene fatta una richiesta a un LLM, ci sono due fasi principali:
- Fase di Invito: Il modello prende l'intero invito dell'utente e calcola la probabilità del primo nuovo token. Durante questa fase, genera anche vettori chiave e valore che rappresentano il contesto.
- Fase di Generazione: Il modello genera ulteriori token uno alla volta basandosi sui token già generati. Ogni generazione di token si basa sui vettori chiave e valore dal contesto del token.
Questo processo sequenziale può portare a risposte più lente poiché spesso sfrutta poco la potenza di calcolo disponibile.
Tecniche di Batch Efficiente
Un modo per migliorare le prestazioni è attraverso il batching, dove più richieste vengono elaborate insieme. Tuttavia, il batching presenta sfide perché le richieste possono variare notevolmente nei tempi di arrivo e nelle lunghezze. Un approccio semplice potrebbe causare ritardi o risorse sprecate.
Tecniche di batching finemente sintonizzate possono aiutare ad affrontare queste sfide. Permettendo maggiore flessibilità nel modo in cui le richieste vengono elaborate, questi metodi possono aumentare significativamente il throughput riducendo i tempi di attesa e gli sprechi di memoria.
Sfide di Memoria nell'Erogazione delle Richieste
La dimensione della cache KV cresce rapidamente con il numero di richieste, portando a sfide nella gestione della memoria. Ad esempio, un modello potrebbe richiedere una grande quantità di memoria solo per memorizzare questa cache, limitando il numero di richieste che possono essere servite contemporaneamente.
La necessità di un approccio sofisticato alla gestione della memoria è critica.
Limitazioni del Sistema Attuale
La maggior parte dei sistemi esistenti memorizza la cache KV come un'unica porzione di memoria, portando a diverse forme di spreco:
- Memoria riservata che non viene utilizzata.
- Frammentazione interna dovuta a un'allocazione eccessiva di spazio.
- Frammentazione esterna a causa delle dimensioni variabili delle richieste.
Il risultato può essere un utilizzo efficace della memoria che scende a un minimo del 20%.
Il Nuovo Sistema di Gestione della Memoria
Il sistema proposto recentemente trae ispirazione da come i sistemi operativi gestiscono la memoria attraverso il paging. Invece di richiedere un'intera porzione di memoria in anticipo per ogni richiesta, questo sistema riserva solo ciò che è necessario man mano che la richiesta procede.
In questo approccio, un gestore della cache KV si occupa di organizzare la memoria, rendendo possibile allocare e deallocare la memoria in modo più dinamico. Questo aiuta a garantire che la memoria disponibile possa essere utilizzata efficacemente, massimizzando il throughput.
Gestire Diverse Situazioni di Decodifica
Il nuovo metodo può anche gestire vari scenari di decodifica in modo efficiente. Ad esempio, nei casi come il campionamento parallelo, dove un modello genera più output da un singolo input, la cache KV può essere condivisa tra quegli output, rendendo l'uso della memoria più efficiente.
In compiti più complessi come la ricerca beam, il modello può gestire dinamicamente la cache KV per condividere la memoria in modo efficace durante il processo di decodifica, consentendo notevoli riduzioni nell'uso della memoria.
Aspetti di Scheduling e Preemption
Quando la domanda di richieste supera la capacità del sistema, è necessario un qualche tipo di scheduling per dare priorità alle richieste. Il metodo proposto utilizza un sistema di prima richiesta, prima servita per garantire equità.
Esecuzione Distribuita
Per modelli più grandi che superano la capacità di memoria di una singola GPU, il sistema è progettato per funzionare su più GPU gestendo la memoria in modo efficace. Questo assicura che tutte le parti del modello possano accedere alla memoria necessaria senza sprecare risorse.
Valutazione delle Prestazioni
Il nuovo metodo è stato testato su vari carichi di lavoro e confrontato con i principali sistemi di riferimento. I risultati hanno indicato un miglioramento significativo nel throughput senza sacrificare la precisione.
Conclusione
Questo nuovo algoritmo di attenzione e sistema di gestione della memoria offrono un approccio fresco per servire in modo efficiente modelli di linguaggio di grandi dimensioni. Riducendo gli sprechi di memoria e abilitando la condivisione tra le richieste, questo sistema può migliorare notevolmente il throughput nelle applicazioni pratiche.
Lavori futuri possono esplorare ulteriori applicazioni di queste tecniche di gestione della memoria, contribuendo a ridurre ulteriormente i costi e la complessità di lavorare con modelli di linguaggio di grandi dimensioni.
Titolo: Efficient Memory Management for Large Language Model Serving with PagedAttention
Estratto: High throughput serving of large language models (LLMs) requires batching sufficiently many requests at a time. However, existing systems struggle because the key-value cache (KV cache) memory for each request is huge and grows and shrinks dynamically. When managed inefficiently, this memory can be significantly wasted by fragmentation and redundant duplication, limiting the batch size. To address this problem, we propose PagedAttention, an attention algorithm inspired by the classical virtual memory and paging techniques in operating systems. On top of it, we build vLLM, an LLM serving system that achieves (1) near-zero waste in KV cache memory and (2) flexible sharing of KV cache within and across requests to further reduce memory usage. Our evaluations show that vLLM improves the throughput of popular LLMs by 2-4$\times$ with the same level of latency compared to the state-of-the-art systems, such as FasterTransformer and Orca. The improvement is more pronounced with longer sequences, larger models, and more complex decoding algorithms. vLLM's source code is publicly available at https://github.com/vllm-project/vllm
Autori: Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Hao Yu, Joseph E. Gonzalez, Hao Zhang, Ion Stoica
Ultimo aggiornamento: 2023-09-12 00:00:00
Lingua: English
URL di origine: https://arxiv.org/abs/2309.06180
Fonte PDF: https://arxiv.org/pdf/2309.06180
Licenza: https://creativecommons.org/licenses/by/4.0/
Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.
Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.