Un modello da 8 miliardi di parametri pesa 16 GB in FP16 e scende a 4,9 GB in Q4KM, la quantizzazione che Ollama scarica di default. La memoria che serve per un LLM locale si calcola così: parametri per bit per peso, diviso 8, più la memoria del contesto (la KV cache). Il resto di questa guida spiega da dove vengono questi numeri e come usarli prima di comprare una scheda video o un Mac.

Cos'è la quantizzazione di un LLM?

La quantizzazione è la tecnica che riduce la precisione dei numeri con cui sono salvati i pesi di un modello linguistico (LLM, Large Language Model): invece di 16 bit per ogni peso se ne usano 8, 5, 4 o anche meno. Il file diventa più piccolo, entra nella memoria di un computer normale e, quasi sempre, genera il testo più in fretta. In cambio si perde un po' di qualità, misurabile e piccola fino a 4 bit, poi sempre più evidente.

Formati di quantizzazione

Le sigle che si incontrano scaricando un modello da Hugging Face (la piattaforma che ospita la maggior parte dei modelli aperti) sono molte. GGUF è il formato di file di llama.cpp, il motore open source che sta sotto Ollama e LM Studio. MLX è il framework di Apple per i chip M, con un formato proprio. AWQ, GPTQ ed EXL3 sono metodi pensati per le GPU Nvidia, usati soprattutto sui server o da chi vuole spremere una scheda singola. Le sigle tipo Q4KM e Q8_0 indicano invece quanti bit restano per peso e con quale schema.

Memoria di pesi e KV cache per un modello da 8 miliardi di parametri, da FP16 a Q4KM

Ollama e LM Studio sono gratuiti, girano su Windows, macOS e Linux e non chiedono un account. Scaricano da soli una versione a 4 bit del modello scelto, che poi funziona anche senza connessione.

TL;DR per chi ha cinque minuti

    • Il formato decide quanta memoria dovete comprare. Un 70B in FP16 chiede 140 GB, in Q4KM ne bastano circa 43: è la differenza fra un server e un Mac da 64 GB.
    • Fino a 4 bit la qualità tiene. Sui test di llama.cpp Q4KM aggiunge 0,18 punti di perplessità a Llama 3 8B, Q2_K ne aggiunge 3,5, quindi sotto i 4 bit il modello inizia a sbagliare in modo visibile.
    • Il contesto lungo costa quanto un secondo modello. Llama 3.3 70B con 128.000 token di contesto occupa circa 43 GB solo di KV cache, quanto i suoi pesi in Q4.
    • Su Mac conta la memoria unificata, su PC la VRAM. Un modello che deborda dalla VRAM nella RAM di sistema funziona lo stesso, ma rallenta di molto, perché la velocità dipende dalla banda di memoria.
    • Per partire non serve scegliere nulla. Ollama e LM Studio scaricano già una variante a 4 bit; il calcolo di questa guida dice se il vostro computer la regge.

La quantizzazione di un LLM

La quantizzazione di un LLM è la conversione dei suoi pesi da numeri a 16 bit (FP16 o BF16, i formati in cui i modelli vengono addestrati e pubblicati) a numeri con meno bit, di solito 8 o 4. Ogni peso occupa meno spazio, quindi il modello intero occupa meno memoria e si legge più in fretta.

Un modello è, in sostanza, un'enorme tabella di numeri decimali. Llama 3.1 8B ne contiene circa 8 miliardi; con 2 byte ciascuno fanno 16 GB. Quantizzare vuol dire raggruppare questi numeri a blocchi (32 o 256 pesi alla volta, a seconda dello schema), trovare per ogni blocco una scala comune e salvare ogni peso come un intero piccolo, da 4 o 8 bit, che moltiplicato per quella scala restituisce un valore vicino all'originale. Vicino, non identico: lo scarto si chiama errore di quantizzazione.

Esistono due famiglie

La quantizzazione dei soli pesi (weight-only) è quella di GGUF, MLX, AWQ e GPTQ: i pesi stanno in memoria compressi e vengono riportati in alta precisione al momento del calcolo. La quantizzazione di pesi e attivazioni (FP8, INT8 sulle GPU da data center) comprime anche i valori intermedi e interessa soprattutto chi serve migliaia di utenti. Per l'uso su un PC o un Mac conta la prima.

Q4, Q5, Q8, cosa significano le sigle GGUF

Nelle sigle GGUF il numero dopo la Q indica i bit per peso della maggior parte dei tensori, la K indica le k-quants (lo schema a super-blocchi introdotto in llama.cpp nel 2023) e la lettera finale S, M o L dice quanto spazio in più viene concesso ai tensori più delicati. Le sigle che iniziano con IQ sono le i-quants, che usano una matrice di importanza (imatrix) calcolata su un testo di prova per decidere dove spendere i bit.

Il dettaglio da ricordare è che Q4 non vuol dire 4 bit esatti. Ogni blocco porta con sé anche le sue scale; le varianti M e L tengono alcuni tensori a 5 o 6 bit. La documentazione di Hugging Face sul formato GGUF riporta i valori teorici: Q4K vale 4,5 bit per peso, Q5K 5,5, Q6K 6,5625, mentre Q80 è il classico 8 bit a blocchi da 32 pesi. Misurato su un modello vero, Q4KM arriva a 4,89 bit per peso.

La velocità di generazione

La colonna della velocità racconta una cosa che i neofiti di solito non si aspettano: passando da F16 a Q4KM il modello genera due volte e mezzo più in fretta. Per ogni parola prodotta il computer deve leggere dalla memoria tutti i pesi del modello, quindi meno byte da leggere vogliono dire più token al secondo. Sotto i 4 bit il guadagno si appiattisce, perché il lavoro di decompressione comincia a pesare quanto la lettura.

Quanta qualità si perde, Q4 o Q8?

Con Q8 la perdita di qualità è trascurabile, con Q4KM è piccola ma misurabile, sotto i 4 bit cresce in fretta. Lo strumento di llama.cpp la misura in perplessità (perplexity, quanto il modello è "sorpreso" dal testo vero: più è bassa, meglio è) rispetto al modello originale.

I valori sono scritti direttamente nel codice di llama-quantize, misurati su Llama 3 8B. Q80 aggiunge 0,0026 punti di perplessità, Q6K 0,0217, Q5KM 0,0569. Q4KM sale a 0,1754 e il vecchio Q40, senza k-quants, a 0,4685: stesso numero di bit, quasi tre volte l'errore. Più giù Q3KM arriva a 0,6569 e Q2K a 3,5199, venti volte Q4KM.

Tradotto in pratica, Q4KM è il compromesso su cui si è assestata la comunità (Ollama lo usa come default, per esempio per llama3.1:8b, 4,9 GB). Q5KM e Q6K servono quando avanza memoria e si vuole il massimo da un modello piccolo. Q80 ha senso per i lavori in cui ogni dettaglio conta (codice lungo, matematica, estrazione di dati) o per chi deve confrontare il modello con l'originale. I 2 e 3 bit, invece, sono il prezzo da pagare per far entrare un modello molto grande in una memoria piccola.

Una precisazione

Una precisazione, o meglio un limite della misura: la perplessità media nasconde le differenze per compito. Un modello a 4 bit che scrive email senza problemi può perdere qualche punto in più su codice o calcoli in più passaggi, dove un errore all'inizio si propaga fino alla fine. Chi usa il modello per programmare fa bene a provare almeno una variante Q5 o Q6 prima di decidere.

Come si calcola la memoria necessaria per un LLM locale

La memoria che serve per far girare un LLM locale è la somma di tre voci: i pesi del modello, la KV cache del contesto e un margine per i buffer di calcolo del programma. Le prime due si calcolano così:

    • Pesi: parametri per bit per peso, diviso 8.
    • KV cache: token per bit per peso, diviso 8, moltiplicato per 2.

Il margine dipende dal programma. LM Studio chiede 10 GB in più, Ollama 5. Per un modello da 8 miliardi di parametri, 128.000 token di contesto e 10 GB di margine, la memoria totale in Q4KM è 4,58 + 15,5 + 10 = 30 GB.

Su Mac la memoria unificata è l'unica che conta. Su PC la VRAM è la prima scelta, ma se non basta il modello può usare la RAM di sistema. In questo caso la velocità dipende dalla banda di memoria, che è molto più bassa della VRAM. Per esempio, una scheda video con 12 GB di VRAM e 32 GB di RAM può far girare un modello da 20 GB, ma sarà molto più lenta di una scheda con 32 GB di VRAM.

Per scegliere la configurazione giusta, è importante considerare sia la memoria disponibile che la velocità di calcolo. Un modello più piccolo in una quantizzazione più aggressiva può essere più veloce di un modello più grande in una quantizzazione meno aggressiva, se la memoria disponibile è limitata.