Speculative decoding : come ottenere un’inferenza 3 volte più veloce con qualsiasi LLM

Il decodaggio speculativo è una tecnica che accelera la generazione di testo da parte dei grandi modelli linguistici, senza modificare il modello né degradare la qualità delle risposte. Presentata come capace di accelerare l’inferenza da 2 a 3 volte, si basa su una strategia di generazione più intelligente piuttosto che su un cambiamento di architettura.

Il collo di bottiglia della memoria

Ogni volta che un utente invia un messaggio a un chatbot, il modello genera la sua risposta token per token, cioè frammento di testo per frammento di testo. Questo funzionamento diventa un ostacolo man mano che i modelli crescono, in particolare per gli assistenti di programmazione, i servizi clienti o gli agenti in tempo reale, che richiedono una risposta quasi immediata.

Il freno non proviene principalmente dalla potenza di calcolo. GPU come le NVIDIA H100 sono molto veloci nei calcoli matriciali. Il problema risiede nel fatto che i miliardi di parametri del modello, memorizzati in memoria, devono essere trasferiti verso il processore prima della generazione di ogni token. Le unità di calcolo restano allora largamente inattive. Gli ingegneri parlano di un sistema limitato dalla banda passante di memoria: aggiungere potenza di calcolo non accelera quindi nettamente le cose.

Proporre, poi verificare

Il principio consiste nel generare più token candidati in una sola volta, per poi verificarli in parallelo. Il sistema si basa su due modelli. Un piccolo modello detto di bozza (draft model) produce rapidamente una sequenza di candidati, in genere da quattro a otto token. Un modello bersaglio (target model), più grande e di migliore qualità, valuta l’insieme in un’unica passata. Poiché le GPU sono progettate per il calcolo parallelo, elaborare un batch di token non richiede molto più tempo che elaborare un singolo token.

Per ogni candidato, il modello bersaglio confronta la propria probabilità con quella che gli ha attribuito il modello di bozza. Se il modello bersaglio è almeno altrettanto confidente, il token viene accettato. In caso contrario, lo è con una probabilità che diminuisce man mano che il divario aumenta. Un token rifiutato viene sostituito da un token estratto da una distribuzione aggiustata, poi il ciclo ricomincia. Secondo la presentazione del metodo, questo procedimento statistico garantisce che l’output segua esattamente la stessa distribuzione di probabilità che avrebbe se il modello bersaglio avesse generato ogni token da solo.

Nel migliore dei casi, tutti i candidati vengono accettati e il modello bersaglio aggiunge un token supplementare, ovvero da cinque a nove token per il costo di una passata del modello bersaglio. Nel peggiore dei casi, il primo candidato viene rifiutato, il che aggiunge un leggero sovraccarico, poiché il tempo di generazione della bozza resta dovuto. Una coppia di modelli mal assortita può quindi rallentare leggermente la generazione.

Il guadagno reale dipende soprattutto dal tasso di accettazione, cioè dalla frequenza con cui i candidati della bozza superano la verifica. Intorno al 70-80%, un livello qualificato come tipico per coppie ben assortite su compiti comuni, l’accelerazione si situa tra 2x e 3x. I testi prevedibili o ripetitivi producono tassi più elevati e guadagni più importanti.

Varianti e messa in pratica

Lo schema originale richiede un modello di bozza distinto, il che aggiunge memoria e complessità ingegneristica. Diverse tecniche più recenti ne fanno a meno. Alcune rinunciano alla garanzia statistica rigorosa per un’implementazione più semplice o una velocità di trasferimento più elevata, con, secondo la fonte, un impatto generalmente trascurabile sulla qualità degli output.

Medusa aggiunge al modello bersaglio diverse teste di predizione supplementari sul suo ultimo strato, ciascuna che prevede una posizione futura diversa. Eagle, per «Extrapolation Algorithm for Greater Language-model Efficiency», si appoggia agli stati interni del modello piuttosto che ai suoi token di output, il che, secondo la fonte, favorisce tassi di accettazione più elevati su testi complessi o specializzati. Prompt Lookup Decoding non utilizza alcun modello secondario: individua nel prompt e nella cronologia della conversazione le espressioni suscettibili di riapparire nella risposta, e le impiega come candidati, il che si adatta in particolare all’editing di codice e al riassunto di documenti.

Il decodaggio speculativo è proposto come opzione in diversi framework di inferenza, tra cui text-generation-inference di Hugging Face, vLLM e llama.cpp. Secondo la fonte, attivarlo consiste il più delle volte in un cambiamento di configurazione.

La tecnica beneficia soprattutto alle generazioni lunghe, quando il modello elabora una richiesta alla volta e il prompt e la risposta condividono vocabolario o struttura. Le domande-risposte, il riassunto di documenti e il completamento di codice figurano tra i casi in cui i guadagni sono più importanti. Nel servizio a lotti ad alto throughput, invece, può ridurre la velocità di trasferimento, poiché i token di bozza consumano memoria e calcolo che potrebbero servire ad altre richieste.