LoRA, QLoRA o full fine-tuning: cosa cambia in VRAM, tempi e risultati

Tre parole che si confondono. Cosa cambia tra full fine-tuning, LoRA e QLoRA in memoria, tempi e qualità, dai paper originali e dalla documentazione di Unsloth e Hugging Face, e quale scegliere se hai una sola GPU.

Francesco Pio Nocerino7 minAI
PercorsoAI Engineering: gli articoliParte 20 di 24
LoRA, QLoRA o full fine-tuning: cosa cambia in VRAM, tempi e risultati
Indice

In breve: il full fine-tuning aggiorna tutti i pesi del modello e, con Adam in precisione mista, chiede intorno ai 18 byte per parametro prima ancora delle attivazioni: per un modello da 8 miliardi di parametri si va ben oltre una singola GPU consumer. LoRA congela il modello e allena due matrici piccole per ogni strato: il modello resta in memoria a 16 bit, e la tabella di Unsloth indica come minimo 22 GB di VRAM per un 8B. QLoRA fa la stessa cosa con il modello base quantizzato a 4 bit: per lo stesso 8B la tabella scende a 6 GB. Con una sola GPU consumer la scelta pratica è quasi sempre tra QLoRA e LoRA, e la documentazione di Unsloth consiglia di partire da QLoRA.

Questo pezzo è uno spoke della serie Guida AI locale e prepara la puntata sul fine-tuning con Unsloth, in uscita. Il conto della memoria per l'inferenza è in puntata 3; qui parlo di cosa serve per allenare. Nessun test mio: uso i paper originali di LoRA e QLoRA, la documentazione di Hugging Face (Transformers e PEFT) e quella di Unsloth, letti il 22 ottobre 2026. I numeri di VRAM sono quelli pubblicati da queste fonti, o conti fatti a partire da loro, e lo dico ogni volta.

Tre parole, tre cose diverse

Full fine-tuning vuol dire riprendere l'allenamento del modello su dati tuoi, aggiornando tutti i parametri. Il risultato è un modello nuovo, grande quanto l'originale.

LoRA (Low-Rank Adaptation) è il metodo proposto da Microsoft nel paper del 2021. I pesi originali restano congelati; accanto a ogni matrice scelta si allenano due matrici sottili, A e B, il cui prodotto rappresenta la modifica. Quello che esce dall'allenamento è un adapter: un file piccolo che si applica sopra il modello base.

QLoRA è LoRA con il modello base caricato a 4 bit. Il paper del 2023 introduce tre pezzi per risparmiare memoria: il tipo di dato NF4 (4-bit NormalFloat), la doppia quantizzazione delle costanti di quantizzazione e gli optimizer "paginati" per assorbire i picchi di memoria. I gradienti passano attraverso il modello quantizzato e congelato, ma si aggiornano solo gli adapter.

Dove finisce la VRAM

Nel full fine-tuning la memoria non va solo ai pesi. La guida di Transformers sull'anatomia della memoria la scompone così, per l'allenamento in precisione mista con AdamW:

  • Pesi: 6 byte per parametro, perché servono una copia in fp16 per il calcolo e una in fp32 per aggiornare in modo stabile.
  • Stati dell'optimizer: 8 byte per parametro, cioè momento e varianza di Adam in fp32. Con un Adam quantizzato di bitsandbytes la guida indica 2 byte.
  • Gradienti: 4 byte per parametro, in fp32.
  • Attivazioni: variabili, crescono con batch size, lunghezza delle sequenze e dimensione del modello.

Fanno 18 byte per parametro più le attivazioni. Il conto per un modello da 8 miliardi di parametri, fatto da me su quei valori: 8 × 18 = 144 GB, prima delle attivazioni. Nessuna GPU consumer ci si avvicina.

Con LoRA cambiano due cose. I pesi del modello base sono congelati: niente gradienti e niente stati dell'optimizer per loro, solo la copia a 16 bit da 2 byte per parametro. E gradienti e optimizer riguardano solo gli adapter, che sono una frazione minima dei parametri: sul GPT-3 175B il paper di LoRA riporta 10.000 volte meno parametri allenabili e un terzo della memoria GPU rispetto al fine-tuning con Adam.

QLoRA abbassa anche la voce che resta, i pesi del modello base, portandoli a 4 bit. È così che il paper riesce ad allenare un modello da 65 miliardi di parametri su una sola GPU da 48 GB.

La tabella di Unsloth: il minimo per modello

Unsloth pubblica una tabella di VRAM per il fine-tuning, per dimensione del modello. La documentazione avverte che sono valori minimi assoluti e che alcuni modelli chiedono di più. Ne riporto una parte, così come è pubblicata:

Parametri del modello

QLoRA (4 bit)

LoRA (16 bit)

3B

3,5 GB

8 GB

7B

5 GB

19 GB

8B

6 GB

22 GB

14B

8,5 GB

33 GB

27B

22 GB

64 GB

32B

26 GB

76 GB

70B

41 GB

164 GB

La tabella non ha una colonna per il full fine-tuning. Il rapporto tra le due colonne è in linea con quello che la guida agli iperparametri dice in una frase: QLoRA usa circa 4 volte meno VRAM di LoRA a 16 bit.

Tempi: cosa dicono le fonti, senza cronometro

Qui numeri non ne do, perché non ho allenato niente e i tempi dipendono da GPU, dataset, lunghezza delle sequenze e numero di epoche. Le indicazioni che le fonti mettono per iscritto sono qualitative:

  • Il paper di LoRA riporta un throughput di allenamento più alto rispetto al full fine-tuning, oltre a nessuna latenza aggiuntiva in inferenza quando l'adapter viene fuso nel modello.
  • Unsloth descrive QLoRA come leggermente più lento di LoRA a 16 bit.
  • Sulla batch size, Unsloth indica la batch size come la leva principale della VRAM e il gradient accumulation come la leva principale del tempo: se vai fuori memoria, abbassi la batch size e aumenti l'accumulo per tenere la stessa batch effettiva.

Risultati: quanto si perde

Il paper di LoRA riporta qualità pari o superiore al full fine-tuning su RoBERTa, DeBERTa, GPT-2 e GPT-3. Il paper di QLoRA afferma di preservare le prestazioni del fine-tuning completo a 16 bit sui compiti valutati. Sono risultati degli autori, sui loro benchmark: il tuo caso può andare diversamente, ed è per questo che serve un set di prove tuo prima e dopo.

La documentazione di Unsloth è più cauta su QLoRA: lo descrive come "marginalmente meno accurato" di LoRA a 16 bit, e scrive che con i suoi quant dinamici a 4 bit gran parte della perdita è recuperata. Aggiunge un consiglio che vale la pena tenere a mente: allenare e servire nella stessa precisione aiuta a preservare l'accuratezza. Se il modello girerà a 4 bit, ha senso allenarlo a 4 bit.

Sul full fine-tuning la stessa documentazione è netta: è un errore comune partire da lì, perché è pesante in calcolo, e il consiglio è provare prima con LoRA o QLoRA. Se non funziona lì, scrivono, quasi certamente non funzionerà nemmeno con il fine-tuning completo.

Gli iperparametri che contano davvero

LoRA ha poche manopole, e la guida concettuale di PEFT e quella di Unsloth concordano sulle principali:

  • Rank (r): la dimensione delle matrici A e B. Più alto vuol dire più parametri allenabili, più memoria e più rischio di overfitting. Unsloth suggerisce 16 o 32 come punto di partenza.
  • Alpha (lora_alpha): quanto pesa la modifica rispetto al modello base. Unsloth indica alpha uguale al rank come base sicura, e il doppio del rank come euristica diffusa.
  • Moduli target: su quali strati applicare gli adapter. Unsloth raccomanda tutti i principali strati lineari, attention e MLP (q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj): togliere moduli fa risparmiare poco e costa qualità.
  • Learning rate ed epoche: per LoRA e QLoRA Unsloth parte da 2e-4 e da 1 a 3 epoche; oltre le 3, su dataset di istruzioni, il guadagno cala e cresce il rischio di memorizzare i dati.

In Unsloth la scelta del metodo è un flag al caricamento del modello: load_in_4bit=True per QLoRA, 16 bit per LoRA, full_finetuning=True per il fine-tuning completo. Uno alla volta, come precisa la guida al fine-tuning.

Cosa ti resta in mano alla fine

Con il full fine-tuning hai un modello intero, grande quanto il base. Con LoRA e QLoRA hai un adapter piccolo, e due strade per usarlo:

  • Tenerlo separato: stesso modello base, più adapter per compiti diversi. PEFT permette di caricarli, scaricarli e combinarli.
  • Fonderlo nel modello: la funzione merge_and_unload() di PEFT unisce l'adapter ai pesi e restituisce un modello unico, senza la latenza di caricare i due pezzi separati.

Da lì il passaggio al runtime è lo stesso di qualsiasi modello: per Ollama, LM Studio e llama.cpp si converte in GGUF partendo dai pesi a 16 bit, per vLLM si resta in safetensors. Il dettaglio dei formati è in GGUF, safetensors o MLX.

Quale scegliere, caso per caso

Situazione

Metodo

Perché

Una GPU consumer da 8 a 16 GB

QLoRA

È l'unico che fa stare un 7B o 8B nella memoria, secondo la tabella di Unsloth

Una GPU da 24 GB e modello fino a 7B

LoRA a 16 bit o QLoRA

LoRA è leggermente più accurato e veloce; QLoRA lascia margine per batch e contesto più lunghi. Un 8B in LoRA è al limite (22 GB minimi)

Modello che girerà quantizzato a 4 bit

QLoRA

Allenare e servire nella stessa precisione, come consiglia Unsloth

Più compiti sullo stesso modello base

LoRA o QLoRA, adapter separati

Un modello in memoria, più adapter leggeri

Cluster di GPU e un motivo misurato

Full fine-tuning

Solo dopo che LoRA o QLoRA hanno fallito sullo stesso dataset

Se lavori su Mac, il requisito hardware cambia: la memoria è unificata e il conto non si fa sulla VRAM di una scheda. Le differenze sono in Mac con Apple Silicon o GPU NVIDIA; la pagina dei requisiti di Unsloth indica il training come supportato anche su Mac.

Errori comuni

  • Partire dal full fine-tuning "per sicurezza". Costa molta più memoria di LoRA e QLoRA, e la stessa documentazione di Unsloth lo sconsiglia come primo tentativo.
  • Leggere la tabella di Unsloth come garanzia. Sono minimi: batch size e lunghezza del contesto fanno salire la memoria.
  • Alzare il rank per "imparare di più". Più rank vuol dire più memoria e più rischio di overfitting, non per forza un modello migliore.
  • Applicare LoRA solo all'attention per risparmiare. Unsloth raccomanda tutti gli strati lineari principali: il risparmio è poco, la perdita di qualità no.
  • Fare fine-tuning senza un set di prove. Senza casi tuoi da confrontare prima e dopo, non sai se il modello allenato è migliore del base.

Cosa conviene fare adesso

  • Controlla quanta VRAM hai e trova la riga della tabella di Unsloth che ci sta, con margine.
  • Parti da QLoRA con i valori di default (rank 16, alpha 16 o 32, tutti gli strati lineari, 1–3 epoche).
  • Prepara prima una manciata di casi di prova tuoi e confronta il modello base con quello allenato.
  • Se un termine non ti è chiaro (quantizzazione, VRAM, adapter), c'è il glossario. Le altre puntate della serie sono nell'hub AI Engineering.
[ DOMANDE FREQUENTI ]

Domande frequenti

01Che differenza c'è tra LoRA e QLoRA?

Entrambi congelano il modello base e allenano solo due matrici piccole per strato, l'adapter. In LoRA il modello base resta a 16 bit; in QLoRA è quantizzato a 4 bit con il tipo NF4. Secondo la documentazione di Unsloth QLoRA usa circa 4 volte meno VRAM, ed è leggermente più lento e marginalmente meno accurato.

02Quanta VRAM serve per fare fine-tuning di un modello da 7B o 8B?

La tabella di Unsloth indica come minimo 5 GB per un 7B e 6 GB per un 8B con QLoRA, 19 GB e 22 GB con LoRA a 16 bit. Sono minimi assoluti: batch size e contesto lungo fanno salire il conto.

03Il full fine-tuning dà risultati migliori di LoRA?

Non necessariamente. Il paper di LoRA riporta risultati pari o superiori al full fine-tuning sui modelli testati, e Unsloth consiglia di provare prima LoRA o QLoRA: se non funzionano lì, quasi certamente non funzionerà nemmeno il fine-tuning completo.

04Come uso con Ollama un modello allenato con LoRA?

La strada più semplice è fondere l'adapter nel modello base con merge_and_unload() di PEFT, salvare i pesi a 16 bit e importarli in Ollama: come cartella di safetensors oppure dopo averli convertiti e quantizzati in GGUF con llama.cpp. Ollama non quantizza i GGUF durante l'import.

Condividi