Vai a Mappa Corsi Laboratorio Glossario Come funziona Problemi comuni Inizia →
ITEN
← Corso 06 · Dal modello all'app (Lezione 06.02 · 16 minuti · Nessun sensore · Per tutti)

Quantizzare.

Scrivere i pesi con meno bit rende un modello quattro volte più piccolo e spesso più veloce. Qui vedi come si fa, quanto si perde davvero e cosa fare quando si perde troppo, fino ai 4 bit dei modelli che scrivono.

Cosa impari
  1. Come si passa da 32 a 8 bit, e perché l'errore di ogni peso è minuscolo
  2. Quanto spazio e quanta velocità si guadagnano
  3. Cosa sono la calibrazione e l'addestramento con i gradini
  4. Perché per i modelli linguistici si scende a 4 bit
Ti serve sapere

Se non ti ricordi una di queste cose, il link ti porta al capitolo che la spiega.

Come vuoi seguirla
Preparo la scena…
  1. 01 I pesi

    Ogni peso è un numero con la virgola.

    Dopo l'addestramento un modello è una lunga lista di pesi01.03, numeri come 0,0173 o meno 0,84. Di solito ognuno è scritto con 32 bit, cioè 4 byte, e ha circa sette cifre significative. MobileNet v2 ha 3,4 milioni di pesi, quindi pesa quasi 14 MB. Serve davvero tutta quella precisione?

    In pratica. Il peso di un modello si stima così. Numero di pesi per byte di ogni peso. Con 32 bit sono 4 byte, con 8 bit uno solo.

01 / 07
(Approfondisci)

Qualche numero in più.


(01)

La formula dei gradini

Per ogni strato si scelgono due numeri. La scala, cioè quanto vale un gradino, e lo zero, cioè quale gradino corrisponde allo zero vero. Con pesi da meno 1 a 1 e 256 gradini, la scala vale 2 diviso 255, circa 0,0078.

Per scrivere un peso lo si divide per la scala, si arrotonda e si aggiunge lo zero. Per rileggerlo si fa il contrario. Il peso riletto non è identico all'originale, ma la differenza non supera mai mezzo gradino, cioè circa 0,004 in questo esempio.

q = arrotonda(x / scala) + zero        (un intero tra 0 e 255)
x ≈ scala × (q − zero)
(02)

Strato per strato o canale per canale

Nel 2018 Raghuraman Krishnamoorthi di Google ha confrontato i modi di quantizzare le reti per il telefono. MobileNet v2 quantizzata con una sola scala per strato, dopo l'addestramento, crollava. Con una scala per ogni canale restava vicina all'originale, e con l'addestramento sui gradini recuperava quasi tutto.

Il motivo sta nei filtri di MobileNet che lavorano un canale alla volta. Alcuni canali hanno pesi minuscoli e altri grandi. Con una scala sola per tutti, quelli piccoli finiscono tutti sullo stesso gradino e si perdono. Oggi quasi tutti gli strumenti usano una scala per canale.

(03)

Gli strumenti

Con LiteRT la quantizzazione dopo l'addestramento si chiede al convertitore, insieme a una funzione che fornisce gli esempi per la calibrazione. Core ML ha coremltools, PyTorch ha i suoi strumenti di quantizzazione e ExecuTorch li usa per preparare il modello.

Per i modelli linguistici si usano formati apposta. GGUF di llama.cpp offre molte varianti a 4 bit, come Q4_K_M, e le app per il telefono di solito partono da quelle.

conv = tf.lite.TFLiteConverter.from_saved_model("modello")
conv.optimizations = [tf.lite.Optimize.DEFAULT]
conv.representative_dataset = cento_esempi_veri      # la calibrazione
open("modello_int8.tflite", "wb").write(conv.convert())
(Prova sul telefono)

Quanti bit servono?


Scegli quanti bit usare e guarda due cose. Una foto scritta con meno bit per colore e una fila di pesi posati sui gradini. Sotto, quanto peserebbe MobileNet v2 e quanto sbaglia in media ogni peso.

Lo strumento ha bisogno di JavaScript acceso.

La foto rende l'idea ma esagera. Un modello sopporta i gradini molto meglio dell'occhio, perché gli errori piccoli di tanti pesi in parte si compensano.

(Verifica)

4 domande per chiudere la lezione.

Quando rispondi a tutte, la lezione risulta fatta e sulla mappa la sua pietra diventa gialla. Conta rispondere, non il punteggio.


  1. (01)

    Un modello ha 3,4 milioni di pesi a 32 bit. Quanto pesa a 8 bit?

  2. (02)

    Con 8 bit, quanto sbaglia al massimo ogni peso?

  3. (03)

    A cosa serve la calibrazione?

  4. (04)

    Il modello quantizzato perde troppo. Qual è il passo successivo più sensato?

Per chiudere la lezione rispondi alla verifica

← Misurare davvero Torna alla mappa
(Prossima lezione · 06.03) Potare, distillare, scegliere l'architettura