Por qué el entrenamiento necesita más que la descarga
Ejecutar un modelo necesita poco más que sus pesos: un modelo de 7B en 16 bits ocupa unos 14 GB. El entrenamiento necesita más, porque cada peso que aprende también necesita un gradiente (hacia dónde moverlo) y un estado del optimizador (los promedios móviles de Adam que establecen cuánto). A esto se suman las activaciones del paso hacia adelante, que crecen con el tamaño del lote y la longitud del ejemplo. Cuáles de estos existen para qué pesos es lo que separa el ajuste fino completo de LoRA.
La regla general
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 congelada en 16 bits: 2 bytes por peso, es decir, 2 GB por cada mil millones de parámetros. El adaptador es diminuto, y los ~3 GB lo cubren a él, a su estado del optimizador, a las activaciones en longitudes moderadas y al propio marco de trabajo.
- El ajuste fino completo entrena cada peso: un peso y un gradiente de 16 bits, más las dos estimaciones de momento de 32 bits de Adam; en total, 12 bytes por peso.
- QLoRA almacena la base congelada en 4 bits, lo que reduce la memoria a aproximadamente un tercio de la de LoRA: un modelo de 8B necesita unos 9 GB en lugar de 19.
La página de ajuste fino completo cuenta 16 bytes por peso, no 12. La diferencia es la copia maestra de 32 bits de los pesos que la receta clásica de precisión mixta mantiene junto a los de 16 bits. Esta regla general asume un entrenamiento sin esa copia adicional; una configuración que la mantenga necesita unos 16 GB por cada mil millones de parámetros. Ambas son estimaciones antes de los ejemplos largos: las activaciones se suman a esto y crecen con la longitud máxima y el tamaño del lote.
| Tamaño del modelo | LoRA | Ajuste fino completo |
|---|---|---|
| 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 |
Las activaciones son la parte que la regla solo puede aproximar. Crecen con el número de tokens retenidos a la vez, el tamaño del lote multiplicado por la longitud del ejemplo, por lo que duplicar la longitud máxima aproximadamente las duplica, y la atención puede añadir más para ejemplos muy largos. El margen fijo en la regla asume longitudes moderadas. Si sus ejemplos son largos, deje un margen adicional en lugar de planificar hasta el último gigabyte.
Cuánta memoria tiene realmente
En los portátiles con memoria unificada, como los Mac con procesadores de Apple, la GPU comparte la memoria principal, por lo que un portátil de 36 GB puede dar a un modelo más espacio que una GPU típica para juegos. Pero el sistema operativo y sus otras aplicaciones necesitan su parte, así que cuente con que aproximadamente tres cuartas partes estarán libres para el entrenamiento. En un PC con una tarjeta gráfica independiente, el límite es la propia memoria de la GPU, no la RAM del ordenador.
- Memoria utilizable: después del sistema operativo y las aplicaciones, unos 27 GB.
- Modelo de 1.5B: LoRA 2 × 1.5 + 3 ≈ 6 GB, ajuste fino completo 12 × 1.5 + 4 ≈ 22 GB. Ambos caben.
- LoRA, modelos más grandes: un modelo de 7B necesita unos 17 GB y cabe; un modelo de 14B necesita más de 30 GB y no cabe. En la práctica, LoRA admite modelos de hasta unos 10B.
- Ajuste fino completo, modelos más grandes: un modelo de 3B necesita unos 40 GB, por lo que el límite es de aproximadamente 1.5B.
- QLoRA: un modelo de 27–32B necesita unos 22–26 GB, lo cual cabe.
1.5B · LoRA 2 × 1.5 + 3 ≈ 6 GB
1.5B · full 12 × 1.5 + 4 ≈ 22 GBEn una GPU NVIDIA de 16 GB, la misma regla dice que un modelo de 8B necesita unos 19 GB con LoRA, lo cual es demasiado, pero unos 9 GB con QLoRA, lo que cabe con espacio para ejemplos más largos.
Si una ejecución se queda sin memoria
- Reduzca la longitud máxima. La memoria crece con la longitud del ejemplo, por lo que esto es lo que más recupera. Compruebe primero que sus ejemplos típicos sigan cabiendo.
- Reduzca el tamaño del lote. Menos ejemplos por paso significa menos activaciones retenidas a la vez.
- Cambie a QLoRA. La base de 4 bits ocupa aproximadamente una cuarta parte de la memoria de una de 16 bits.
- Utilice puntos de control de gradiente. Sacrifica un 20–30% de velocidad a cambio de mucha menos memoria de activación, y muchas configuraciones ya lo activan.
- Elija un modelo más pequeño, o use LoRA en lugar de un ajuste fino completo.
Errores comunes
- Juzgar por el tamaño de descarga. El ajuste fino completo necesita de seis a ocho veces los pesos de 16 bits, más las activaciones.
- Contar toda la RAM de un portátil de memoria compartida como disponible. El sistema operativo y otras aplicaciones necesitan su parte.
- Contar la RAM de un PC en lugar de la memoria de su tarjeta gráfica.
- Aumentar la longitud máxima o el tamaño del lote después de que una ejecución cupiera, y esperar que la siguiente también lo haga.
- Reducir la longitud máxima por debajo de la longitud de sus ejemplos típicos, de modo que el modelo nunca vea el final de las respuestas que debería aprender.
Referencias y lecturas adicionales
Las fuentes externas se abren en una pestaña nueva.
- 01ZeRO: Memory Optimizations Toward Training Trillion Parameter ModelsRajbhandari et al., 2019 · arXiv · arxiv.orgEl cálculo estándar de pesos, gradientes y estado del optimizador por parámetro.
- 02GPU memory usageHugging Face Transformers docs · huggingface.co
- 03Model memory estimatorHugging Face Accelerate docs · huggingface.coUna herramienta para estimar la memoria de un modelo específico de Hugging Face para su ejecución y entrenamiento.
- 04Unified MemoryMLX docs · ml-explore.github.ioCómo la CPU y la GPU de los procesadores de Apple comparten un único grupo de memoria.