Come funziona l'IA Token, parametri, reti neurali
Diagramma tecnico Diciassette stadi · Settembre 2026

Token, parametri, reti: i conti veri

Le stesse cose del poster introduttivo, con le formule, le dimensioni delle matrici e i byte. Ogni stadio ha un conto svolto su un modello reale: quanti parametri, dove stanno, quanta memoria occupano, quante operazioni servono per produrre un token.

Il modello di riferimento

Tutti i numeri di questa pagina sono calcolati su una configurazione reale, tipica dei modelli aperti da 8 miliardi di parametri.

dmodel = 4096 · strati = 32
teste = 32 · teste KV = 8 · dhead = 128
dff = 14336 · vocabolario = 128.256
01
Vocabolario

Tutto è un array multidimensionale

Un tensore è un array con una forma e un tipo. Tutta la rete è una sequenza di trasformazioni di forma, e sapere leggere una forma è metà del mestiere: quando qualcosa non funziona, quasi sempre non tornano le forme.

Per chi programma

È un float[][][] contiguo in memoria con la forma dichiarata a parte. La differenza pratica: le operazioni sono definite sull'intero array, non sui singoli elementi, e girano su hardware che ne esegue migliaia in parallelo.

Forma
Cos'è
Esempio
[ ]
uno scalare
la loss
[4096]
un vettore
un token
[128256, 4096]
una matrice
gli embedding
[8, 2048, 4096]
batch × posizioni × canali — la forma che attraversa tutta la rete
l'attivazione
[8, 32, 2048, 2048]
batch × teste × query × chiavi
i pesi di attenzione
L'ultima riga è quella che esplode: cresce con il quadrato della lunghezza. Con 2048 posizioni sono 8·32·2048² ≈ 1,07 miliardi di numeri — 2,1 GB in bf16, per un solo strato. È il motivo per cui in pratica non la si costruisce mai per intero.
02
Ingresso

BPE: come si costruisce un vocabolario

Il vocabolario non è scelto da un linguista: è il risultato di un algoritmo di compressione avidamente semplice, eseguito una volta sul corpus prima di addestrare qualsiasi cosa.

L'algoritmo, per intero

Prima, un'espressione regolare divide il testo in parole, spazi, punteggiatura e numeri: le fusioni non attraversano mai questi confini. Poi parti dai 256 byte possibili. Conta tutte le coppie adiacenti nel corpus. Fondi la coppia più frequente in un simbolo nuovo. Ripeti finché il vocabolario non raggiunge la dimensione voluta. Fine: non c'è altro.

Le prime fusioni, su un corpus italiano
#1
« c » + « h » → « ch »
frequentissima
#2
« ch » + « e » → « che »
una parola intera
poi
« zi » + « one » → « zione »
un suffisso
#48k
« ·costituzionalmente »
se compare abbastanza
Ogni fusione unisce esattamente due simboli: « zione » arriva dopo che « z » + « i » → « zi » e « on » + « e » → « one » sono già avvenute. Nessuna nozione di morfologia è stata inserita: prefissi e suffissi emergono perché sono frequenti. Su lingue meno rappresentate nel corpus le fusioni sono meno efficienti, e lo stesso testo costa più token.
Token per parola
inglese
1,3
italiano
1,8
codice
2,1
cifre
3,2
Valori indicativi. Sul nostro modello i numeri vengono spezzati in gruppi di al più tre cifre: 4096 arriva come « 409 » + « 6 », due pezzi che non corrispondono alle migliaia. È una delle ragioni concrete per cui l'aritmetica «in testa» è difficile.
03
Ingresso

Embedding: una riga pescata da una tabella

La matrice degli embedding ha forma [V, d] — una riga per token del vocabolario. «Calcolare l'embedding» è un accesso a indice, non una moltiplicazione: costo nullo, ma i numeri dentro la riga sono parametri appresi come tutti gli altri.

Cosa vuol dire «vicini»

La similarità si misura con il coseno dell'angolo fra due vettori: cos(a,b) = a·b / (‖a‖‖b‖), un numero fra −1 e 1. Non si usa la distanza euclidea perché conta la direzione, non la lunghezza — e la lunghezza in questi spazi codifica più che altro la frequenza del token.

Similarità coseno fra embedding di ingresso — valori tipici
« gatto » / « gatti »
0,82
« gatto » / « cane »
0,61
« gatto » / « animale »
0,44
« gatto » / « bilancio »
0,09
« gatto » / « ·gatto »
0,71
L'ultima riga è istruttiva: due token distinti, con embedding distinti, che il modello deve imparare a trattare quasi allo stesso modo. Nessuno gliel'ha detto — l'ha dedotto dal fatto che compaiono nei medesimi contesti.
Attenzione a un equivoco

Questi sono gli embedding di ingresso, prima di qualsiasi strato: codificano il token isolato, non il suo significato nel contesto.

Gli embedding usati per la ricerca semantica sono un'altra cosa: vengono dall'uscita di un modello, dopo tutti gli strati, e rappresentano una frase intera.

128.256 × 4096
forma della tabella
525 M
parametri · 6,5% del modello
1,05 GB
in bf16
04
Ingresso

La posizione va aggiunta a mano

L'attenzione è una somma pesata: senza maschera, cambiando l'ordine dei token il risultato non cambia. Senza un'informazione di posizione, «il cane morde l'uomo» e «l'uomo morde il cane» sarebbero identici per la rete.

RoPE, il metodo oggi standard

Le 128 dimensioni di ogni testa si trattano a coppie, come punti su un piano. Ogni coppia viene ruotata di un angolo proporzionale alla posizione del token: θi·m per il token in posizione m. Frequenze diverse per coppie diverse — le prime ruotano velocissime, le ultime quasi ferme.

La proprietà che conta
Se ruoti il vettore query di un angolo α·m e il vettore chiave di α·n, il loro prodotto scalare dipende solo da (m − n).
L'attenzione riceve la distanza relativa fra due token, non le loro posizioni assolute. Un'informazione che generalizza: la relazione «tre token più indietro» è la stessa all'inizio e alla fine del documento.
La rotazione si applica a Q e K a ogni strato, non una volta all'ingresso. Estendere il contesto oltre quello di addestramento si fa scalando le frequenze θ — è il trucco dietro molte finestre «estese». La maschera causale lascia comunque filtrare un po' di posizione (un token vede quanti ne ha davanti), e alcuni modelli recenti, come Llama 4 e SmolLM3, tolgono RoPE da uno strato su quattro proprio per estendere meglio il contesto.
Velocità di rotazione per coppia
rapida lentissima coppia 0 → coppia 63
Le coppie veloci distinguono token adiacenti, quelle lente distinguono parti lontane del documento. È lo stesso principio delle lancette di un orologio.
05
Mattone

Lo strato lineare: y = Wx

Più del 90% dei parametri (qui il 93%; il resto è la tabella degli embedding, che si legge per indice) sta dentro matrici usate così. Ogni riga di W è un rilevatore: il suo prodotto scalare con x misura quanto x somiglia a quella riga. Una moltiplicazione matrice-vettore è un banco di migliaia di rilevatori applicati insieme.

Il conto

W di forma [m, n] applicata a x di forma [n] produce y di forma [m]. Costa m·n moltiplicazioni e altrettante somme: 2·m·n FLOP. E contiene esattamente m·n parametri. Da qui la regola pratica di tutto il campo: ogni parametro costa 2 FLOP per ogni token che lo attraversa.

Matrice
Forma
Parametri
FLOP/token
Wq
[4096, 4096]
16,8 M
33,6 M
Wk, Wv (GQA)
[1024, 4096] ciascuna
4,2 M · 2
16,8 M
Wo
[4096, 4096]
16,8 M
33,6 M
MLP (3 matrici)
[14336, 4096] × 2 + [4096, 14336]
176,2 M
352,3 M
Totale per strato
218,1 M
436,2 M
L'MLP da solo è l'81% dei parametri di uno strato. L'attenzione fa il lavoro concettualmente interessante, ma il grosso della memoria e del calcolo sta altrove.
06
Mattone

Perché serve una non linearità

Due strati lineari in fila sono ancora uno strato lineare: W₂(W₁x) = (W₂W₁)x. Senza qualcosa di non lineare in mezzo, cento strati collassano matematicamente in una sola matrice — e la profondità non comprerebbe nulla.

Cosa aggiunge

Una funzione applicata elemento per elemento — nessun parametro, costo trascurabile — che spezza la linearità e permette al modello di rappresentare condizioni: «questa caratteristica conta solo se quell'altra è presente». Le interazioni fra concetti nascono qui.

ReLU
max(0, x)

Azzera il negativo. Semplicissima, per anni lo standard. Difetto: un neurone che finisce sempre in negativo smette di ricevere gradiente e resta morto.

GELU / SiLU
x · Φ(x) / x · σ(x)

Due varianti morbide quasi uguali (Φ è la ripartizione della normale): attorno allo zero non taglia di netto ma sfuma. Derivata continua, gradiente più docile, risultati migliori.

SwiGLU · usata qui
SiLU(W₁x) ⊙ W₃x

Due proiezioni: una fa da segnale, l'altra da saracinesca che lo lascia passare o no, moltiplicando elemento per elemento. Costa una matrice in più — ecco perché l'MLP ne ha tre e non due.

Il compromesso di dff

Con due matrici (GELU classica) si usava dff = 4d. Con SwiGLU le matrici sono tre, e per non gonfiare il conto si riduce dff a circa 83·d — qui 4096 · 8/3 ≈ 10.923, e l'MLP resterebbe due terzi dello strato. Qui si è scelto di più: 8/3·d × 1,3 ≈ 14.200, arrotondato a 14336 (multiplo di 1024). Risultato: l'MLP è l'81% dello strato e il 70% del modello.

07
Cuore

Attenzione, riga per riga

Una formula sola, cinque operazioni. Vale la pena percorrerla con le forme accanto: è il punto in cui la maggior parte delle spiegazioni salta un passaggio.

Attn(Q,K,V) = softmax( QKᵀ / √dhead + M ) · V
1
Proietta: Q = XWq, K = XWk, V = XWv
[2048, 4096] → [2048, 128] per testa
2
Punteggi: ogni query contro ogni chiave, prodotto scalare
→ [2048, 2048]
3
Dividi per √128 ≈ 11,3 — senza questo la softmax satura
forma invariata
4
Maschera causale M: −∞ su tutto ciò che viene dopo, poi softmax per riga
ogni riga somma a 1
5
Media pesata dei V, poi riunisci le teste e proietta con Wo
→ [2048, 4096]
Perché √dhead

Il prodotto scalare di due vettori casuali a d componenti di varianza 1 ha varianza d: con d = 128 i punteggi arriverebbero a ±11 e oltre. La softmax su valori così grandi diventa quasi uno 0/1 secco, e il gradiente si annulla. Dividere per √d riporta la varianza a 1.

La matrice [n, n] non si costruisce

Le implementazioni moderne calcolano l'attenzione a blocchi, tenendo in memoria veloce solo un riquadro per volta e aggiornando la softmax in modo incrementale. Stesso risultato esatto, memoria lineare invece che quadratica: è ciò che ha reso praticabili i contesti lunghi.

08
Cuore

Teste multiple e il costo della cache

Le 4096 dimensioni si dividono in 32 teste da 128, ognuna con le proprie proiezioni. Girano in parallelo e cercano cose diverse. Il conto dei parametri non cambia: cambia cosa si può rappresentare.

Il problema che GQA risolve

In generazione, chiavi e valori dei token già visti si tengono in memoria per non ricalcolarli. Quella cache cresce con la lunghezza del contesto e con il numero di teste — e con contesti lunghi diventa più grande dei pesi del modello. GQA: 32 teste di query condividono 8 gruppi di chiavi e valori. Quattro volte meno cache.

Cache per token = 2 (K e V) × strati × testeKV × dhead × byte
Senza GQA — 32 teste KV
2 × 32 × 32 × 128 × 2 B = 512 KiB / token
100.000 token → ≈ 52 GB
Con GQA — 8 teste KV
2 × 32 × 8 × 128 × 2 B = 128 KiB / token
100.000 token → ≈ 13 GB
Da confrontare con i 16 GB dei pesi del modello in bf16: senza GQA, un utente con un contesto lungo occuperebbe da solo più memoria del modello stesso.
Oltre GQA: la cache diventa architettura
MLA

Salvare un riassunto

Multi-head Latent Attention (DeepSeek-V3, Kimi K2) non salva K e V ma un vettore latente compresso, da cui si ricostruiscono. In DeepSeek-V3 sono 512 + 64 numeri per strato: 576 × 61 × 2 B ≈ 70 KB per token, meno del nostro 8B per un modello da 671 G. Sul nostro: 36 KiB, 3,7 GB a 100.000 token.

Finestra locale

Guardare solo vicino

Gli strati locali vedono solo gli ultimi 1.000-4.000 token e hanno una cache di dimensione fissa. Gemma 3 ne alterna cinque, con finestra di 1.024, a ogni strato globale. Sul nostro modello: 5 strati globali e 27 locali, ≈ 2,2 GB a 100.000 token invece di 13.

Ibrida

Attenzione lineare

Tre strati su quattro usano attenzione lineare (Gated DeltaNet e varianti, in Qwen3-Next e Kimi Linear), con uno stato fisso invece di una cache che cresce. Solo 8 strati su 32 restano pieni: 32 KiB per token, 3,3 GB a 100.000 token.

Perché è una questione economica, non tecnica

La memoria della scheda è divisa fra pesi e cache di tutti gli utenti serviti insieme. Meno cache per utente significa più utenti sulla stessa scheda, e quindi un costo per richiesta più basso. Quasi tutte le scelte architetturali degli ultimi anni — GQA, MLA, attenzione a finestra o ibrida — nascono da questa aritmetica.

09
Struttura

Il blocco, nell'ordine esatto

Trentadue blocchi identici nella forma, tutti con pesi diversi. L'ordine delle operazioni non è arbitrario: la variante pre-norm che vedi qui è ciò che ha reso addestrabili le reti profonde con molti meno accorgimenti.

1
h = x + Attn( RMSNorm(x) )
normalizza, poi somma al flusso
2
y = h + MLP( RMSNorm(h) )
stessa struttura, altra funzione
Il « x + »

Connessione residua

Ogni blocco somma il proprio contributo invece di sostituire. Il gradiente trova così una via diretta dall'uscita all'ingresso: senza, oltre una decina di strati non si addestra più niente.

RMSNorm

x / RMS(x) · g

Riporta il vettore a una scala fissa dividendolo per la radice della media dei quadrati, poi lo riscala con un vettore appreso g di 4096 valori. Nessuna sottrazione della media: meno operazioni della LayerNorm classica, stessa efficacia.

Pre-norm

Normalizzare prima

Nel transformer originale la norma stava dopo la somma. Spostarla prima rende l'addestramento molto più stabile e il riscaldamento del learning rate molto meno critico. Resta comunque in uso: poche migliaia di passi con learning rate crescente.

Il flusso residuo come lavagna condivisa

Poiché tutto si somma, il vettore che sale è una lavagna su cui ogni blocco scrive. Gli strati non comunicano solo con il vicino: uno strato profondo può leggere qualcosa scritto trenta strati prima. È l'osservazione su cui si fonda gran parte della ricerca sull'interpretabilità.

QK-Norm, una norma in più

Molti modelli recenti (OLMo 2, Qwen3, Gemma 3) aggiungono una RMSNorm anche su Q e K, per testa, prima del prodotto scalare: i punteggi dell'attenzione non possono più crescere senza limite, e l'addestramento regge learning rate più alti. Costa 2 × 128 parametri per strato, 8.192 su tutto il modello.

10
Famiglie

Encoder e decoder: la differenza è una maschera

Le tre famiglie di transformer usano gli stessi blocchi dello stadio precedente. Ciò che cambia è la M nella formula dell'attenzione: se è tutta zeri, ogni token vede l'intera sequenza; se è triangolare, vede solo il passato. Da questa singola scelta discende tutto il resto.

Analogia

Il lettore e lo scrittore. Chi legge ha la pagina intera davanti e può andare avanti e indietro: capisce meglio, ma non produce niente di nuovo. Chi scrive vede solo quello che ha già messo sul foglio: sa meno, ma può continuare. La traduzione ha bisogno di entrambi.

Solo encoder

Legge tutto insieme

Nessuna maschera: attenzione bidirezionale. Si addestra nascondendo token a caso in mezzo al testo e chiedendo di indovinarli.

Uscita: un vettore per token, o uno per l'intera frase. Serve per: embedding, ricerca semantica, reranker, classificazione. Non sa generare.

Encoder + decoder

Legge, poi scrive

Due pile. L'encoder digerisce l'ingresso senza maschera; il decoder genera con maschera causale e in più una cross-attention: le query vengono da lui, chiavi e valori dall'encoder.

Serve per: traduzione, trascrizione, compiti con ingresso e uscita di natura diversa. È l'architettura del transformer originale.

Solo decoder · il nostro modello

Scrive e basta

Maschera causale ovunque, una pila sola. Ingresso e uscita sono la stessa sequenza: il prompt è semplicemente la parte già scritta.

Ha vinto perché un solo obiettivo scala, ogni compito si può riformulare come continuazione di testo, e la cache KV rende la generazione efficiente.

La stessa matrice di attenzione, con e senza maschera — quattro token
Encoder · M = 0
Ogni token vede tutti. Rappresentazioni migliori, ma il primo token conosce già il quarto: non si può usare per prevederlo.
Decoder · M triangolare
Le celle chiare valgono −∞ prima della softmax, quindi peso zero. È questa metà mancante a rendere possibile l'addestramento su ogni posizione in parallelo.
Il vantaggio nascosto della maschera

Con la maschera causale ogni posizione è contemporaneamente un esempio di addestramento: da 2048 token si ricavano 2048 previsioni in un solo passaggio. Un encoder mascherato ne sfrutta circa il 15%, quelle effettivamente nascoste. È un fattore sei o sette di efficienza sui dati — una delle ragioni concrete per cui i decoder hanno scalato meglio.

Gli encoder non sono spariti

Per trasformare un documento in un vettore, un encoder da 100-300 M resta la scelta economica: un passaggio in avanti, contesto bidirezionale, costo cento volte inferiore. I modelli di embedding più accurati oggi sono però spesso decoder da qualche miliardo di parametri, riaddestrati a produrre un vettore: la distinzione conta meno della taglia.

11
Bilancio

Dove stanno gli 8 miliardi

Il conto completo, in ordine di peso. Vale la pena guardarlo una volta: rende concreto cosa si compra quando si «scala un modello», e cosa cambia fra una configurazione e l'altra.

MLP · 32 strati
5,64 G
70,2%
Attenzione · 32 strati
1,34 G
16,7%
Embedding di ingresso
0,53 G
6,5%
Proiezione di uscita
0,53 G
6,5%
Norme
0,0003 G
0,003%
8,03 miliardi
= 16,1 GB in bf16 · 8,0 GB in fp8 · ≈ 4,3 GB a 4 bit, scale comprese
La formula generale

Trascurando GQA e le estremità, un transformer ha circa 12·d² per strato — 4d² di attenzione e 8d² di MLP. Con d = 4096 e 32 strati: 12 · 4096² · 32 ≈ 6,4 G. Un'approssimazione a mente che sbaglia di poco.

Profondo o largo?

A parità di parametri si può scegliere più strati o più canali. Più largo parallelizza meglio ed è più veloce; più profondo tende a ragionare in più passaggi. I rapporti usati in pratica — d/strati attorno a 128 — sono il frutto di misurazioni empiriche, non di una teoria.

12
Variante

MoE: spezzare l'MLP in esperti

Se l'MLP è il 70% dei parametri e il 70% del calcolo, l'idea è tenerne tanti ma accenderne pochi. Al posto di un MLP grande, N MLP più piccoli e un router che per ogni token ne sceglie k.

Il router

Una singola matrice [N, d] produce un punteggio per esperto; si prendono i k migliori e si combinano le loro uscite pesandole con quei punteggi. Il router si addestra insieme al resto. Nei MoE recenti gli esperti sono molti e piccoli (256 in DeepSeek-V3, 384 in Kimi K2, 8 attivi per token), più uno condiviso sempre acceso. Il bilanciamento spesso non usa più una loss aggiuntiva: a ogni esperto si somma un bias che cresce se riceve pochi token e cala se ne riceve troppi, senza toccare il gradiente del modello.

Denso · il nostro modelloMoE tipico
Parametri totali8 G400 G
Attivi per token8 G (100%)25 G (6%)
FLOP per token16 G50 G
Memoria richiesta16 GB800 GB — tutti i pesi devono essere caricati
Qualità attesadi un 8 Gfra un 25 G e un 400 G denso
Il compromesso in una riga: si compra qualità con la memoria invece che con il calcolo. Ottimo per chi serve molte richieste su molte schede, pessimo per chi vuole far girare il modello su una macchina sola.
Gli esperti non sono specialisti

Non c'è l'esperto di medicina e quello di codice: l'analisi delle attivazioni mostra suddivisioni molto più fini e poco interpretabili, spesso legate alla forma superficiale del token. Il nome è suggestivo e fuorviante.

Il costo nascosto

Token diversi nello stesso batch vanno a esperti diversi, e su più schede questo significa spostare dati sulla rete a ogni strato. L'implementazione efficiente di un MoE è un problema di sistemi distribuiti, più che di reti neurali.

13
Uscita

Dai logit alla scelta, con i numeri

L'ultimo vettore [4096] viene moltiplicato per la matrice di uscita [128256, 4096]: un prodotto scalare con ogni riga del vocabolario. Ne escono 128.256 punteggi non normalizzati — i logit.

Token
Logit
T = 1
T = 0,5
« dorme »
2,0
0,659
0,864
« mangia »
1,0
0,242
0,117
« corre »
0,1
0,099
0,019
La softmax è ezᵢ/T / Σ ezⱼ/T. Con T = 1: e² = 7,39, e¹ = 2,72, e⁰·¹ = 1,11, somma 11,21 — da cui la prima colonna. Dimezzare T raddoppia i logit prima dell'esponenziale, e le differenze si amplificano: 4, 2, 0,2; e⁴ = 54,6, e² = 7,39, e⁰·² = 1,22, somma 63,2.
I tre filtri, in ordine

Temperatura — riscala i logit. T→0 tende al massimo secco, T>1 appiattisce.

top-k — tiene solo i k candidati migliori e ridistribuisce.

top-p — tiene i candidati fino a cumulare probabilità p. Si adatta: pochi quando il modello è sicuro, molti quando è incerto. È il filtro più diffuso, ma nelle API di solito resta disattivato (p = 1) finché non lo si imposta.

Il costo dell'ultimo strato

2 · 4096 · 128.256 ≈ 1,05 GFLOP per token, contro i 14 GFLOP di tutti i 32 strati messi insieme: il 7% del calcolo per un solo prodotto. In addestramento, dove i logit si calcolano per tutte le posizioni contemporaneamente, questo tensore [batch, seq, 128256] è spesso il singolo consumo di memoria più grande dell'intero passaggio.

14
Obiettivo

La loss: un numero, e cosa significa

Cross-entropy: L = −log p(token corretto), mediata su tutte le posizioni. Solo la probabilità assegnata al token giusto entra nel conto — tutte le altre contano indirettamente, perché la softmax le fa competere.

Loss
Perplexity
Bit per token
Come leggerlo
11,76
128.256
17,0
tira a caso
4,0
54,6
5,8
ha imparato la grammatica
2,0
7,4
2,9
un buon modello moderno
1,5
4,5
2,2
frontiera
Perplexity in una frase

eL: quanti token equiprobabili il modello sta di fatto considerando. Perplexity 7,4 significa che, in media, esita fra circa sette possibilità — su un vocabolario di 128.256.

Perché i decimali contano

Da 2,0 a 1,9 sembra poco: sono 0,14 bit per token. Ma è anche il salto fra una generazione di modelli e la successiva, e costa un ordine di grandezza di calcolo. La loss è logaritmica: schiaccia miglioramenti enormi in differenze minuscole.

15
Training

Backpropagation e il costo della memoria

Il gradiente dice, per ognuno degli 8 miliardi di parametri, di quanto cambierebbe la loss se quel parametro aumentasse di un'inezia. Si ottiene applicando la regola della catena all'indietro, riusando i risultati: un solo passaggio inverso per tutti i parametri insieme.

Il punto non ovvio

Calcolare il gradiente per differenze finite costerebbe un passaggio in avanti per ogni parametro: 8 miliardi di passaggi. La backpropagation costa circa due volte un passaggio in avanti, per tutti i parametri contemporaneamente. Senza questa asimmetria il deep learning non esisterebbe.

Memoria per addestrare un modello da 8 G — precisione mista con Adam
Pesi in bf16
2 byte × 8 G
16 GB
Gradienti
2 byte × 8 G
16 GB
Copia master in fp32
4 byte × 8 G
32 GB
Stati di Adam · momento e varianza
8 byte × 8 G
64 GB
Totale, senza attivazioni
≈ 16 byte per parametro
128 GB
Otto volte la memoria dell'inferenza, e le attivazioni conservate per il passaggio inverso non sono ancora contate. È la ragione per cui l'addestramento richiede decine di schede anche per un modello che, una volta pronto, gira su una sola.
Perché Adam tiene due stati

Uno è la media mobile del gradiente (la direzione recente), l'altro la media mobile del suo quadrato (quanto è instabile). Il passo effettivo è il primo diviso la radice del secondo: parametri con gradiente rumoroso si muovono meno. Costa 8 byte per parametro, e vale ogni byte.

Ricalcolare invece di conservare

Le attivazioni intermedie servono al passaggio inverso. Conservarle tutte è impossibile; si tengono solo quelle ai confini dei blocchi e si ricalcola il resto al volo — circa il 30% di calcolo in più per una riduzione di memoria molto maggiore.

Oltre Adam

Muon, usato nel pre-training di Moonlight e Kimi K2, tiene un solo stato, il momento, e ortogonalizza l'aggiornamento di ogni matrice: 12 byte per parametro invece di 16, cioè circa 96 GB invece di 128 sul nostro 8 G (qualcosa in più, perché embedding e uscita restano di solito ad AdamW), con una convergenza misurata come circa due volte più efficiente in calcolo. Nella pratica pesi, gradienti e stati non stanno interi su ogni scheda: ZeRO/FSDP li divide fra le N schede, che ne tengono 1/N ciascuna. Su 8 schede, 16 GB a testa invece di 128.

16
Aritmetica

Le due formule che servono davvero

Con queste due si stima a mente quasi qualsiasi cosa: quanto costa addestrare un modello, quanto serve per servirlo, se un'idea è praticabile prima ancora di scrivere codice.

Calcolo
C ≈ 6 · N · D

FLOP totali per addestrare N parametri su D token. Il 6 è 2 in avanti + 4 all'indietro.

Il nostro 8 G su 15.000 G di token: 6 · 8·10⁹ · 1,5·10¹³ = 7,2 · 10²³ FLOP. Su mille schede da 400 TFLOP/s efficaci al 40%: circa 52 giorni.

Memoria
M ≈ N · byte

Byte per parametro: 4 in fp32, 2 in bf16, 1 in fp8, 0,5 a 4 bit più le scale.

Regola pratica per l'inferenza: miliardi di parametri × 2 = GB in bf16. Poi si aggiungono cache e margine — di solito il 20-30% in più.

Precisione: cosa si perde a scendere
Formato
Struttura
Modello 8 G
Uso
fp32
1+8+23 bit
32 GB
solo copia master
bf16
1+8+7 — stessa scala di fp32, meno precisione
16 GB
lo standard, ovunque
fp8
1+4+3 · richiede fattori di scala per blocco
8 GB
inferenza, e ormai anche training
int4
16 livelli, più una scala ogni 32-128 pesi
≈ 4,1-4,3 GB
girare in locale, con qualche perdita
fp4 (MXFP4 / NVFP4)
1+2+1 bit, più una scala ogni 16-32 pesi
≈ 4,3-4,5 GB
inferenza nativa sulle GPU recenti, e i primi addestramenti
Perché bf16 e non fp16: stesso numero di bit, ma bf16 conserva l'intervallo di fp32 sacrificando cifre significative. Nel deep learning gli intervalli enormi contano più della precisione decimale — un gradiente che diventa zero per troppo piccolo è un problema, un gradiente arrotondato non lo è. A 4 bit le scale aggiungono 0,25-0,5 bit per parametro: MXFP4 ne ha una a 8 bit ogni 32 pesi (4,25 bit), NVFP4 una fp8 ogni 16 (4,5 bit).
17
Sistemi

Generare non è limitato dal calcolo

Per produrre un token bisogna leggere tutti i 16 GB di pesi dalla memoria della scheda e farci sopra appena 16 GFLOP. Il rapporto è di circa 1 operazione per byte letto — mentre una GPU moderna ne vorrebbe qualche centinaio per non restare in attesa.

La conseguenza

La scheda passa la maggior parte del tempo ad aspettare la memoria, non a calcolare. Con 3 TB/s di banda, leggere 16 GB richiede 5,3 ms: circa 190 token al secondo, ed è un tetto imposto dalla banda, non dalla potenza di calcolo. Aggiungere FLOP non lo alza.

Prefill — leggere il prompt

Tutti i token del prompt attraversano la rete insieme: si leggono i pesi una volta sola e si usano per 2048 posizioni. Migliaia di operazioni per byte: la scheda lavora a pieno regime.

Limitato dal calcolo. Un prompt lungo si elabora in una frazione del tempo che servirebbe a generarlo.

Decode — scrivere la risposta

Un token per volta, e per ognuno si rileggono tutti i pesi. Un'operazione per byte: la scheda è quasi ferma ad aspettare.

Limitato dalla memoria. È la ragione economica per cui i token in uscita costano molto più di quelli in ingresso.

Perché il batching risolve

Se servi 64 richieste insieme, leggi i pesi una volta e li usi per 64 token: 64 volte il lavoro utile con la stessa lettura di memoria. È il motivo per cui i servizi in cloud raggruppano richieste di utenti diversi, e per cui un modello che gira solo per te è drammaticamente inefficiente.

Decodifica speculativa

Un modello piccolo propone cinque token, quello grande li verifica tutti insieme in un solo passaggio — perché verificare è come il prefill. Quelli giusti si tengono. Due o tre volte più veloce, con un risultato identico a quello che si sarebbe ottenuto comunque.

Il limite del batching

I pesi si leggono una volta per tutto il batch, ma la cache KV è diversa per ogni richiesta e va riletta ogni volta. Con 100.000 token di contesto sono ≈ 13 GB per utente, quasi quanto i 16 GB dei pesi: con 64 utenti a contesto lungo, a ogni passo si leggono 16 GB di pesi e 840 GB di cache, e il 98% della banda se ne va in cache. Per questo la cache per token è il numero su cui si progettano le architetture recenti.

In una riga

Moltiplicazioni fra matrici, ripetute molte volte.

Nessuna operazione di questa pagina è più complicata di un prodotto scalare, di un esponenziale o di una divisione. Quello che colpisce non è la sofisticazione dei pezzi: è che ripetendoli 8 miliardi di volte, su 15.000 miliardi di token, emerga qualcosa che sa scrivere.

La configurazione di riferimento è tipica dei modelli aperti da 8 miliardi di parametri; i valori di banda, throughput ed efficienza sono ordini di grandezza indicativi. Settembre 2026