Perché l'addestramento richiede più memoria rispetto al download
L'esecuzione di un modello richiede poco più dei suoi pesi: un modello da 7B a 16 bit occupa circa 14 GB. L'addestramento richiede di più, perché ogni peso che apprende necessita anche di un gradiente (in quale direzione spostarlo) e dello stato dell'ottimizzatore (le medie mobili di Adam che stabiliscono di quanto). A questi si aggiungono le attivazioni del forward pass, che crescono con la dimensione del batch e la lunghezza degli esempi. Quali di questi elementi esistano per quali pesi è ciò che distingue il fine-tuning completo da LoRA.
La regola empirica
LoRA ≈ 2 GB per billion parameters + ~3 GB
frozen 16-bit weights adapter, activations, overhead
full ≈ 12 GB per billion parameters + ~4 GB
16-bit weight 2 bytes
16-bit gradient 2 bytes
Adam moment 1 (fp32) 4 bytes
Adam moment 2 (fp32) 4 bytes
─────────
12 bytes per weight
(+ 4 bytes for a 32-bit master copy = 16)- LoRA mantiene la base congelata a 16 bit: 2 byte per peso, quindi 2 GB per miliardo di parametri. L'adattatore è minuscolo e i ~3 GB coprono quest'ultimo, il suo stato dell'ottimizzatore, le attivazioni a lunghezze moderate e il framework stesso.
- Il full fine-tuning addestra ogni peso: un peso e un gradiente a 16 bit, più le due stime dei momenti a 32 bit di Adam, per un totale di 12 byte per peso.
- QLoRA archivia il modello di base congelato a 4 bit, riducendo la memoria a circa un terzo rispetto a LoRA: un modello da 8B richiede circa 9 GB invece di 19.
La pagina sul fine-tuning completo calcola 16 byte per peso, non 12. La differenza è la copia master a 32 bit dei pesi che la classica configurazione a precisione mista mantiene accanto a quelli a 16 bit. Questa regola empirica presuppone un addestramento senza tale copia aggiuntiva; una configurazione che la mantiene richiede circa 16 GB per miliardo di parametri. Entrambe sono stime che non considerano gli esempi lunghi: le attivazioni si aggiungono a questo calcolo e crescono con la lunghezza massima e la dimensione del batch.
| Dimensioni del modello | LoRA | Full fine-tuning |
|---|---|---|
| 0.5B | ~4 GB | ~10 GB |
| 1.5B | ~6 GB | ~22 GB |
| 3B | ~9 GB | ~40 GB |
| 7B | ~17 GB | ~88 GB |
| 14B | ~31 GB | ~172 GB |
Le attivazioni sono la parte che la regola può solo approssimare. Crescono con il numero di token mantenuti contemporaneamente, ovvero la dimensione del batch moltiplicata per la lunghezza degli esempi; pertanto, raddoppiare la lunghezza massima le raddoppia all'incirca, e l'attenzione può aggiungerne ulteriormente per esempi molto lunghi. L'overhead fisso nella regola presuppone lunghezze moderate. Se gli esempi sono lunghi, è consigliabile lasciare un margine aggiuntivo piuttosto che pianificare fino all'ultimo gigabyte.
Quanta memoria si ha realmente a disposizione
Sui laptop con memoria unificata, come i Mac con Apple silicon, la GPU condivide la memoria principale, quindi un laptop da 36 GB può offrire a un modello più spazio rispetto a una tipica GPU da gaming. Tuttavia, il sistema operativo e le altre app richiedono la loro parte, quindi si consiglia di calcolare che circa tre quarti di essa siano liberi per l'addestramento. Su un PC con una scheda grafica separata, il limite è la memoria dedicata della GPU, non la RAM del computer.
- Memoria utilizzabile: dopo il sistema operativo e le app, circa 27 GB.
- Modello da 1.5B: LoRA 2 × 1.5 + 3 ≈ 6 GB, fine-tuning completo 12 × 1.5 + 4 ≈ 22 GB. Entrambi rientrano nei limiti.
- LoRA, modelli più grandi: un modello da 7B richiede circa 17 GB e rientra nei limiti; un modello da 14B richiede oltre 30 GB e non rientra. In pratica, LoRA supporta modelli fino a circa 10B.
- Fine-tuning completo, modelli più grandi: un modello da 3B richiede circa 40 GB, quindi il limite massimo è di circa 1.5B.
- QLoRA: un modello da 27–32B richiede circa 22–26 GB, rientrando nei limiti.
1.5B · LoRA 2 × 1.5 + 3 ≈ 6 GB
1.5B · full 12 × 1.5 + 4 ≈ 22 GBSu una GPU NVIDIA da 16 GB, la stessa regola indica che un modello da 8B richiede circa 19 GB con LoRA, che sono troppi, ma circa 9 GB con QLoRA, che rientra nei limiti lasciando spazio per esempi più lunghi.
Se un'esecuzione esaurisce la memoria
- Ridurre la lunghezza massima. La memoria cresce con la lunghezza degli esempi, quindi questa operazione libera il maggior quantitativo di spazio. Verificare prima che gli esempi tipici rientrino ancora nei limiti.
- Ridurre la dimensione del batch. Meno esempi per passaggio significano meno attivazioni mantenute contemporaneamente.
- Passare a QLoRA. La base a 4 bit occupa circa un quarto della memoria rispetto a una a 16 bit.
- Utilizzare il gradient checkpointing. Sacrifica circa il 20–30% della velocità in cambio di una memoria di attivazione molto inferiore, e molte configurazioni lo attivano già di default.
- Scegliere un modello più piccolo, oppure utilizzare LoRA invece del fine-tuning completo.
Errori comuni
- Valutare in base alle dimensioni del download. Il fine-tuning completo richiede da sei a otto volte i pesi a 16 bit, oltre alle attivazioni.
- Considerare disponibile tutta la RAM di un laptop a memoria condivisa. Il sistema operativo e le altre app richiedono la loro parte.
- Considerare la RAM di un PC invece della memoria della sua scheda grafica.
- Aumentare la lunghezza massima o la dimensione del batch dopo un'esecuzione andata a buon fine, aspettandosi che anche la successiva rientri nei limiti.
- Ridurre la lunghezza massima al di sotto di quella degli esempi tipici, in modo che il modello non veda mai la fine delle risposte che dovrebbe imparare.
Riferimenti e letture di approfondimento
Le fonti esterne si aprono in una nuova scheda.
- 01ZeRO: Memory Optimizations Toward Training Trillion Parameter ModelsRajbhandari et al., 2019 · arXiv · arxiv.orgIl calcolo standard di pesi, gradienti e stato dell'ottimizzatore per parametro.
- 02GPU memory usageHugging Face Transformers docs · huggingface.co
- 03Model memory estimatorHugging Face Accelerate docs · huggingface.coUno strumento per stimare la memoria necessaria per l'esecuzione e l'addestramento di uno specifico modello Hugging Face.
- 04Unified MemoryMLX docs · ml-explore.github.ioCome la CPU e la GPU di Apple silicon condividono un unico pool di memoria.