Inicio / Artículos / LoRA y QLoRA explicados: ajustar un modelo de 7B sin 100 GB de VRAM

LoRA y QLoRA explicados: ajustar un modelo de 7B sin 100 GB de VRAM

Por qué el fine-tuning completo necesita de 80 a 100 GB, cómo los adaptadores de bajo rango reducen los pesos entrenables al 1,6 %, cómo elegir el rango y las capas objetivo y qué añade QLoRA.

1064 palabras

LoRA solo tiene sentido cuando se ve dónde encaja entre el preentrenamiento y el fine-tuning, así que empecemos por ahí.

Preentrenamiento frente a fine-tuning

El preentrenamiento ocurre cuando se construye un modelo por primera vez. Aprende por sí solo a partir de secuencias de texto, sin etiquetas: el propio texto de entrenamiento aporta tanto las entradas como los objetivos, y el resultado es un modelo base de propósito general.

Ese modelo base tiene muchísimo conocimiento, pero no sigue un formato, un patrón ni una instrucción concretos. Con bastante frecuencia se limita a continuar lo que escribió y añade más palabras al final. El fine-tuning corrige esto. Se entrena con ejemplos etiquetados formados por una instrucción, una entrada y la respuesta deseada, para que aprenda cómo son las buenas respuestas.

Suponga que quiere un modelo para consultas jurídicas. No lo entrenaría desde cero si ya existe un modelo preentrenado con mucho conocimiento del dominio. Lo ajusta para que responda con eficacia.

Por qué el fine-tuning completo es tan costoso

Actualizar todos los parámetros devora memoria. Tome un modelo Llama de 7B con esta configuración:

Model size: 7 billion parameters
Training dtype: BF16 / FP16
Optimizer: AdamW
Sequence length: 2048

Solo cargar el modelo base ocupa 14 GB. En el fine-tuning completo todos los parámetros son entrenables, así que cada uno necesita un gradiente, y si los gradientes se guardan en BF16 o FP16 son otros 14 GB. Después el optimizador AdamW pide unos 56 GB más y puede mantener una copia de los parámetros en FP32, lo que suma unos 28 GB adicionales. Las activaciones también ocupan algo. En total hablamos de 80 a 100 GB, demasiado para una tarea concreta y acotada que ni siquiera es muy complicada.

Qué hace LoRA

LoRA significa Low-Rank Adaptation, adaptación de bajo rango. Ajusta un modelo sin actualizar cada peso por separado. Todos los pesos originales quedan congelados, y un par de matrices pequeñas se encarga del aprendizaje.

¿Cómo pueden unas matrices pequeñas dirigir un modelo grande? Piense en lo que ya sabe un modelo preentrenado: inglés, gramática, patrones de razonamiento, programación, hechos. Si ahora quiere que responda preguntas jurídicas con un estilo concreto, no necesita volver a aprender el idioma. Basta con orientar lo que ya está ahí. LoRA apuesta a que ese cambio suele poder captarse en una estructura de menor dimensión:

ΔW = AB

Así, los miles de millones de pesos que ha aprendido el modelo quedan intactos. LoRA deja W tal cual y añade una corrección encima:

W_new = W + ΔW

Haciendo las cuentas

Imagine un transformer con una sola capa lineal:

X -> W -> Output

Dele a W la forma 1000 por 1000. Entonces contiene:

1000 x 1000 = 1,000,000 parameters

El fine-tuning completo entrena cada uno de ellos, y los LLM reales tienen matrices así por todas partes, de modo que un modelo de 7B tiene unos 7.000 millones de parámetros que entrenar.

Con LoRA se construyen dos matrices estrechas, A y B, y se elige un rango, por ejemplo r = 8:

A = [1000 x 8]
b = [8 x 1000]

Su producto tiene la misma forma que W, así que la suma es válida:

W_new = W + AB

[1000×1000] + [1000×1000]

El ahorro viene de los pocos parámetros que contienen las dos matrices estrechas:

A: 1000 × 8 = 8,000
B: 8 × 1000 = 8,000

Total = 16,000 parameters

Compare los dos enfoques:

Full fine-tuning:
1,000,000 parameters

LoRA:
16,000 parameters

Para esta capa, eso supone solo un 1,6 % de los parámetros entrenables.

Qué significa el rango

El rango es uno de los hiperparámetros principales de LoRA y determina cuánta capacidad tiene el adaptador. Un rango bajo, como 4 u 8, da un adaptador más pequeño que usa menos memoria pero es menos flexible. Las tareas complejas pueden necesitar 32, 64 o 128. Un rango más alto cuesta más memoria y no implica automáticamente más calidad, ya que puede añadir ruido. Pruebe varios rangos y quédese con el que mejor funcione.

Dónde van los adaptadores

LoRA acopla matrices entrenables pequeñas a un transformer congelado, pero un transformer contiene muchas matrices. Un bloque simplificado de tipo decoder-only tiene varias, y un modelo puede apilar ese bloque 32, 40, 80 o más veces. La pregunta que plantea LoRA es cuáles de esas matrices W merecen una corrección BA entrenable. Tres estrategias habituales:

Estrategia 1: solo q_proj y v_proj. Un adaptador en q_proj puede cambiar cómo las representaciones forman consultas sobre el contexto relevante, mientras que uno en v_proj cambia la información que transmiten los tokens a los que se presta atención.

Estrategia 2: todas las proyecciones de atención. Añada adaptadores a q_proj, k_proj, v_proj y o_proj, y LoRA podrá modificar todas las transformaciones lineales aprendidas principales de la atención. Gana capacidad de adaptación y también más parámetros entrenables.

Estrategia 3: proyecciones de atención más capas MLP. Es la configuración más amplia y potente de uso general:

ATTENTION

q_proj       ✅
k_proj       ✅
v_proj       ✅
o_proj       ✅


MLP

gate_proj    ✅
up_proj      ✅
down_proj    ✅

Los transformers no son solo atención. El MLP realiza una enorme parte de la transformación aprendida de características, así que cubrirlo da al fine-tuning bastante más libertad.

¿Resolvió LoRA el problema de memoria?

No del todo. Reduce los parámetros entrenables en torno a un 99 %, pero la memoria de la GPU no baja un 99 %, porque el modelo base sigue teniendo que cargarse y la pasada hacia delante sigue ejecutándose, con un poco de cálculo extra encima. La verdadera ganancia está en los gradientes y los estados del optimizador. Ya no hace falta guardar gradientes para 7.000 millones de parámetros.

QLoRA

QLoRA significa adaptación de bajo rango cuantizada y lleva la idea un paso más allá. Como los pesos base están congelados de todos modos, pueden cuantizarse a 4 bits. Un modelo de 7B que necesita 14 GB en BF16 se reduce a unos 3,5-5 GB. Por eso un modelo de 7B puede ajustarse con QLoRA en una sola tarjeta gráfica de gama gaming, un trabajo que el fine-tuning completo tradicional repartiría entre varias GPU con mucha memoria.