Ho testato le prestazioni dello Speculative Decoding — a = 3,5 non era sufficiente
Lo Speculative Decoding (SD) si basa su una semplice regola matematica: a > 1 + α + β
La lunghezza di accettazione (a) deve superare 1 più il rapporto di calcolo (α) e l'overhead di verifica (β). Se accade, lo SD vince. Altrimenti, perde.
Ho testato questa teoria su una macchina reale. Ho utilizzato una CPU Intel di 12ª generazione con 64GB di RAM. Ho accoppiato un piccolo modello draft Qwen2.5-0.5B con un modello target più grande Qwen2.5-1.5B.
I risultati sono stati sorprendenti. Lo SD è stato dal 49% al 62% più lento rispetto alla generazione pura.
Ecco come la lunghezza di accettazione (a) è variata in base al task:
• JSON (Strutturato): a = 3,50. Il modello draft ha previsto bene il formato. • Codice (Semi-strutturato): a = 3,00. Buono, ma i pattern di denominazione variavano. • Storia (Creativo): a = 2,11. Il modello draft ha avuto difficoltà con la scelta delle parole.
Anche quando "a" era alto, lo SD ha fallito sulla CPU. Perché?
Il problema principale è stato il tasso di accettazione zero. Tra il 15% e il 30% dei round ha accettato zero token.
In questi round, il modello draft lavora, il modello target verifica, e non ottieni nulla di nuovo. Hai pagato per due esecuzioni per ottenere un singolo token. Questo rende lo SD costoso il doppio per lo stesso output.
Questo evidenzia perché lo SD sia un'ottimizzazione per GPU.
Su una GPU, il modello draft è quasi gratuito. Il rapporto di calcolo (α) è minimo. Su una CPU, il modello draft compete per la larghezza di banda della memoria. Non è gratuito. La disuguaglianza crolla sulla CPU.
Se usi lo SD su una CPU, non farlo. I numeri non tornano.
Punti chiave per i tuoi deployment:
- Misura il tuo valore "a". Non fidarti delle dichiarazioni dei fornitori.
- Suddividi i tuoi dati per tipo di task. Codice e chat hanno tassi di accettazione differenti.
- Monitora il tasso di accettazione zero. Un'alta varianza rovina la tua latenza p99.
- Usa lo SD sulle GPU, dove il costo del modello draft è minimo.
L'ottimizzazione migliore è sapere quando spegnerlo.
Fonte: https://dev.to/zxpmail/i-benchmarked-speculative-decoding-a-35-wasnt-enough-1geb
Community di apprendimento opzionale: https://t.me/GyaanSetuAi
