¿Qué es LoRA?
LoRA significa Low-Rank Adaptation y es una técnica que permite hacer fine-tuning de modelos grandes de forma mucho más eficiente, rápida y económica.
En lugar de actualizar todos los millones (o billones) de parámetros de un modelo como GPT o LLaMA, LoRA añade pequeñas "capas entrenables" dentro del modelo original, dejando el resto congelado. Esto reduce drásticamente los recursos necesarios para entrenar y evita modificar el modelo base.
¿Por qué se usa LoRA?
Entrenar modelos grandes desde cero es caro, lento y poco práctico para la mayoría de developers o startups. Con LoRA:
- Solo se entrenan unas pocas decenas de miles de parámetros.
- Puedes hacer fine-tuning en tu computador o una GPU modesta (como una RTX 3090 o incluso en Colab).
- El modelo resultante conserva la calidad general del original, pero con mejoras específicas en tareas, dominios o estilos.
¿Cómo funciona LoRA (simplificado)?
En los modelos Transformer, muchas de las operaciones pesadas ocurren en las matrices de atención (por ejemplo, multiplicaciones Wq, Wk, Wv).
LoRA inserta una modificación en esas capas que reemplaza una matriz entrenable grande por dos matrices pequeñas (A
y B
) con un rango menor:
W + ΔW → W + (A × B)
-
W
: matriz original (congelada) -
A
yB
: matrices pequeñas que se entrenan -
A × B
: matriz de bajo rango (low-rank) que adapta W al nuevo dominio
Este truco permite reducir los parámetros entrenables de millones a miles, manteniendo eficiencia y velocidad.
Beneficios de LoRA
Ventaja | Explicación |
---|---|
Ligero | Solo entrenas una fracción del modelo original |
Rápido | El entrenamiento toma menos tiempo, incluso con datasets pequeños |
Barato | Ideal para Colab o entornos cloud con presupuesto limitado |
Modular | Puedes crear múltiples adaptaciones sobre el mismo modelo base |
Open-source friendly | Compatible con modelos como LLaMA 2, Mistral, Falcon, etc. |
¿Dónde se usa LoRA?
- Fine-tuning de modelos para tareas específicas (chatbots legales, médicos, educacionales).
- Adaptación de modelos multilingües a un lenguaje o dialecto específico.
- Entrenamiento de modelos con datasets privados sin necesidad de abrir o modificar el modelo base.
- Sistemas que permiten cargar múltiples LoRAs según contexto, como modelos multi-rol o multi-estilo.
Herramientas para usar LoRA fácilmente
peft
de Hugging Face: la forma más sencilla y moderna de aplicar LoRA sobre modelos en PyTorch.LLaMA-Adapter
: adaptación directa de LLaMA con LoRA.Axolotl
: framework CLI que automatiza fine-tuning con LoRA en distintos modelos.
Ejemplo rápido con Hugging Face y LoRA
Queremos cargar un modelo preentrenado (por ejemplo, LLaMA 2) y aplicarle LoRA, es decir, prepararlo para que podamos hacer fine-tuning eficiente sobre un conjunto de datos propio sin modificar el modelo base completo.
1. Importamos las librerías necesarias
from transformers import AutoModelForCausalLM
from peft import get_peft_model, LoraConfig
transformers
: es la biblioteca central de Hugging Face. Aquí usamosAutoModelForCausalLM
, que carga un modelo de lenguaje causal (como GPT o LLaMA).peft
: es una librería de Hugging Face para aplicar Parameter-Efficient Fine-Tuning, como LoRA.get_peft_model
: aplica la configuración LoRA al modelo.LoraConfig
: define los parámetros de LoRA.
2. Cargamos el modelo base (preentrenado)
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
- Aquí se descarga y carga el modelo
Llama-2-7b
desde Hugging Face. - Este modelo ya sabe generar texto, pero aún no está personalizado.
- Aún no se entrena nada, solo se prepara.
Nota: Para usar modelos como LLaMA 2 necesitas tener acceso aprobado por Meta en Hugging Face.
3. Configuramos LoRA
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05
)
Aquí definimos cómo y dónde aplicar LoRA dentro del modelo:
Parámetro | ¿Qué hace? |
---|---|
r |
El tamaño del "rango bajo". A mayor r , más capacidad pero más recursos. |
lora_alpha |
Un factor de escala para controlar el impacto del ajuste. |
target_modules |
Las capas del modelo donde se aplicará LoRA (típicamente atención). |
lora_dropout |
Dropout para regularización durante entrenamiento. |
4. Aplicamos LoRA al modelo
model = get_peft_model(base_model, lora_config)
- Esto "inyecta" las capas LoRA en el modelo original.
- Ahora, en lugar de entrenar todo el modelo base, solo entrenarás las nuevas capas ligeras.
- A partir de aquí, puedes entrenar con
Trainer
,Accelerate
,SFTTrainer
, etc.
Una vez tienes el modelo con LoRA aplicado, puedes seguir con el proceso de entrenamiento:
5. Prepara tus datos
Dataset en formato JSONL:
{"prompt": "¿Qué es una API?", "completion": "Una API es un conjunto de reglas que permite a los programas comunicarse entre sí."}
Luego lo cargas como dataset de entrenamiento con datasets
:
from datasets import load_dataset
dataset = load_dataset("json", data_files="tu_dataset.jsonl")
6. Entrena el modelo (ejemplo básico con Trainer
)
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="modelo_lora",
per_device_train_batch_size=4,
num_train_epochs=3,
learning_rate=2e-4,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"]
)
trainer.train()
7. Guardas el modelo fine-tuned
model.save_pretrained("mi_modelo_finetuned_con_lora")
Resultado final
- Tienes una versión del modelo LLaMA 2 adaptado a tus propios datos.
- Solo entrenaste pequeñas capas LoRA, no todo el modelo (lo que reduce costos y tiempos).
- Puedes cargarlo luego para generar texto, integrarlo en una API, o seguir ajustando.
Conclusión
LoRA es una de las técnicas más importantes hoy para trabajar con modelos de lenguaje sin requerir infraestructura costosa. Si estás explorando fine-tuning accesible, escalable y modular, LoRA es el camino.
Gracias a LoRA, los developers pueden construir modelos adaptados sin sacrificar rendimiento ni recursos, lo que abre la puerta a una nueva generación de soluciones IA personalizadas a medida.