Vai al contenuto

Come si comprime un'AI a 2 bit: il trellis

Un modello è fatto di miliardi di numeri. Per farlo stare in una scheda video bisogna scriverli con meno bit. Il trellis è uno dei modi più furbi: invece di salvare i valori, salva un cammino per ritrovarli.

Un numero in 16 bit

Prendi un peso del modello, per esempio 0,734. Il computer lo scrive in fp16: sedici interruttori accesi o spenti. Il primo dà il segno, i cinque dopo la scala (una potenza di due), gli ultimi dieci il fattore che la moltiplica, un numero fra 1 e 2. Cambia il numero e guarda i bit.

Scala
0,5
Fattore
× 1,4678
Valore salvato
0,733887
Errore
0,00011

Con 16 bit sbagli di circa un decimillesimo. Ma un modello ha miliardi di pesi, e a 16 bit ciascuno non entra nella memoria di una scheda. Allora ne usiamo due. Per semplicità i pesi di un blocco si dividono per una scala comune e stanno fra −2 e 2: qui la scala è 1. Premi «Riduci a 2 bit».

Perché un peso alla volta non basta

A 2 bit ogni peso ha solo quattro valori possibili, e va sul più vicino. È come decidere ogni peso da solo: due pesi insieme finiscono su una griglia rigida di sedici punti. Ma i pesi veri stanno quasi tutti vicino allo zero, quindi i punti negli angoli non servono quasi mai.

Meglio mettere i punti dove stanno i pesi e scriverli in un elenco, un codebook: per ogni gruppo di pesi si salva solo quale riga usare. Più pesi si prendono insieme, meno si sbaglia. Il problema è che l'elenco cresce troppo in fretta.

Pesi insiemeBit per pesoRighe del codebook
2216
8265.536
8316.777.216
2562un numero di 155 cifre

Un elenco così non si può scrivere. Il trellis lo fa senza scriverlo.

Il traliccio

Partiamo dal caso più semplice: un solo bit per peso. Il trellis legge i bit uno dopo l'altro e tiene a mente gli ultimi tre: è lo stato, e con tre bit sono otto. A ogni stato una formula fissa associa un valore, che conoscono sia chi comprime sia chi legge. I valori sembrano scelti a caso, ma sono distribuiti come i pesi veri: tanti vicino allo zero, pochi grandi.

Da ogni stato partono due frecce, perché un bit è 0 o 1. In inglese trellis vuol dire traliccio. Scegliere i bit vuol dire scegliere un cammino, e i valori lungo il cammino sono i pesi. Prova: i quattro pesi sono 0,734, −1,2, 0,3 e 1,5. Cambia i bit e guarda dove ti porta il cammino.

−0,42+1,31−1,05+0,28+0,74−1,6+0,15−0,3300000,734−1,20,31,5

Bit scelti

PesoValoreErrore²
+0,73−0,421,332
−1,2−0,420,608
+0,3−0,420,518
+1,5−0,423,686
Totale6,145

Arrotondando un peso alla volta (1 bit: ±0,8)

+0,8 −0,8 +0,8 +0,8 → totale 0,904

Ogni peso va sul più vicino fra −0,8 e +0,8, senza sapere nulla degli altri.

Ogni bit sceglie il peso di adesso e anche da dove parte il successivo: per questo i pesi non si scelgono uno alla volta, ma tutti insieme. «Trova il cammino migliore» li prova tutti e sedici. Nell'esempio, con un solo bit per peso, il cammino migliore sbaglia 0,584 contro 0,904 dell'arrotondamento classico.

Nel trellis vero i numeri sono più grandi: QTIP usa 16 bit di stato (65.536 stati), blocchi da 256 pesi e valori calcolati da una formula di poche istruzioni, che la scheda video ricalcola mentre il modello risponde. Per trovare il cammino migliore senza provarli tutti c'è l'algoritmo di Viterbi: per ogni stato tiene solo il modo migliore per arrivarci, perché da lì in poi conta dove sei, non come ci sei arrivato.

I numeri veri

Due misure, da due fonti diverse. La prima è dal paper QTIP: l'errore di arrotondamento a 2 bit su numeri di prova.

Errore quadratico medio a 2 bit (QTIP, tabella 1)

MetodoErrore
Un numero alla volta (Lloyd-Max)0,118
Reticolo E80,089
Trellis0,069
Limite teorico0,063

Da 0,118 a 0,069: meno 42%, a un passo dal limite teorico.

Qwen 3.6 35B-A3B, con la variante EXL3 a 2,08 bit per peso

DimensionePerplessità
bf1666,97 GiB6,7802
EXL3 2,08 bit10,50 GiB7,2418 (+6,8%)

La perplessità misura l'incertezza del modello sulla parola successiva. EXL3 è una variante snella di QTIP, come dice il README di exllamav3.

Il trellis dentro Mango Code

TOQ, il modello di Mango Code, è Qwen3.8-27B compresso con un trellis della stessa famiglia di QTIP ed EXL3: 64 strati a 2 bit per peso e lo strato che sceglie la parola a 3. Sulla scheda video i pesi occupano 6,17 GiB, più 176 MiB per una correzione imparata dal modello originale; una scheda da 8 GB tiene i pesi e circa 14.000 token di contesto. Lo stato del traliccio è di 14 bit invece di 16. Alle domande a scelta multipla del test MMLU risponde giusto nel 77,8% dei casi; lo stesso modello a 4 bit, un file da 13,3 GiB, nell'82,6%.

Vai a Mango Code

Cosa non è verificato

  • Il 42% riguarda l'errore di arrotondamento su numeri di prova, non la qualità delle risposte di un'AI.
  • Che a 2 bit un peso alla volta non basti è misurato su alcuni metodi, non su tutti: nel paper OmniQuant Llama-2-7B passa da 5,47 di perplessità a circa 4.200 arrotondando e basta, a 36,77 con GPTQ e a 11,06 con OmniQuant.
  • Nell'esempio da provare i valori degli otto stati servono a mostrare l'idea: non sono quelli di QTIP.
  • TOQ non è misurato come agente: il test MMLU è a scelta multipla e non dice se il modello porta a termine un lavoro in più passi.

Fonti