Saltar al contenido principal

LoRA & PEFT

El Fine-Tuning Eficiente en Parámetros te permite entrenar modelos grandes con menos memoria.

¿Qué es LoRA?

LoRA (Low-Rank Adaptation) añade pequeñas matrices entrenables al modelo mientras mantiene los pesos base congelados. Esto reduce drásticamente el uso de memoria y el tiempo de entrenamiento.

Inicio Rápido

aitraining llm --train \
  --model meta-llama/Llama-3.2-1B \
  --data-path ./data.jsonl \
  --project-name lora-model \
  --peft \
  --lora-r 16 \
  --lora-alpha 32

Python API

from autotrain.trainers.clm.params import LLMTrainingParams
from autotrain.project import AutoTrainProject

params = LLMTrainingParams(
    model="meta-llama/Llama-3.2-1B",
    data_path="./data.jsonl",
    project_name="lora-model",

    trainer="sft",

    # LoRA configuration
    peft=True,
    lora_r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    target_modules="all-linear",  # Default: all-linear

    epochs=3,
    batch_size=4,
    lr=2e-4,  # Higher LR works with LoRA
)

project = AutoTrainProject(params=params, backend="local", process=True)
project.create()

Parámetros

ParámetroDescripciónPor Defecto
peftHabilitar LoRAFalse
lora_rRango (tamaño de adaptadores)16
lora_alphaFactor de escala32
lora_dropoutTasa de dropout0.05
target_modulesMódulos a adaptarall-linear

Rango (lora_r)

Rango mayor = más parámetros = más capacidad:
RangoCaso de Uso
8Tareas simples, muy limitado en memoria
16Estándar (recomendado)
32-64Tareas complejas, más memoria disponible
128+Capacidad cercana a fine-tuning completo

Alpha

La razón alpha/rango afecta el aprendizaje:
# Escalado estándar
lora_r=16
lora_alpha=32  # alpha/r = 2

# Más agresivo
lora_r=16
lora_alpha=64  # alpha/r = 4

# Conservador
lora_r=16
lora_alpha=16  # alpha/r = 1

Módulos Objetivo

Por defecto, LoRA apunta a todas las capas lineales (all-linear). Puedes personalizar:
# All linear layers (default)
target_modules="all-linear"

# Attention layers only
target_modules="q_proj,k_proj,v_proj,o_proj"

# Include MLP
target_modules="q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj"

Con Cuantización

Combina LoRA con cuantización para máximo ahorro de memoria:
aitraining llm --train \
  --model meta-llama/Llama-3.2-8B \
  --data-path ./data.jsonl \
  --project-name quantized-lora \
  --peft \
  --quantization int4
params = LLMTrainingParams(
    model="meta-llama/Llama-3.2-8B",
    data_path="./data.jsonl",
    project_name="quantized-lora",

    peft=True,
    lora_r=16,
    quantization="int4",  # or "int8"
)

Comparación de Memoria

ModeloFine-tune CompletoLoRALoRA + 4bit
1B8 GB4 GB3 GB
7B56 GB16 GB8 GB
13B104 GB32 GB16 GB

Fusionando Adaptadores

Por defecto, los adaptadores LoRA se fusionan automáticamente en el modelo base después del entrenamiento. Esto simplifica la inferencia - obtienes un único archivo de modelo listo para usar.

Comportamiento Por Defecto (Fusionado)

params = LLMTrainingParams(
    ...
    peft=True,
    # merge_adapter=True is the default
)

Guardar Solo Adaptadores

Para guardar solo los archivos de adaptador (más pequeños, pero requiere modelo base para inferencia):
aitraining llm --train \
  --model meta-llama/Llama-3.2-1B \
  --data-path ./data.jsonl \
  --project-name lora-model \
  --peft \
  --no-merge-adapter

Fusionar Manualmente Después

aitraining tools merge-llm-adapter \
  --base-model-path meta-llama/Llama-3.2-1B \
  --adapter-path ./lora-model \
  --output-folder ./merged-model
Debes especificar --output-folder para guardar localmente o --push-to-hub para subir a Hugging Face Hub.

Parámetros de la Herramienta de Fusión

ParámetroDescripciónRequerido
--base-model-pathModelo base para fusionar adaptador
--adapter-pathRuta al adaptador LoRA
--output-folderDirectorio de salida localUno de estos
--push-to-hubSubir a Hugging Face Hubrequerido
--tokenToken Hugging Face (para push al hub)No
--pad-to-multiple-ofRellenar tamaño del vocabularioNo
O en Python:
from peft import PeftModel
from transformers import AutoModelForCausalLM

# Load base model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")

# Load and merge adapter
model = PeftModel.from_pretrained(model, "./lora-model")
model = model.merge_and_unload()

# Save merged model
model.save_pretrained("./merged-model")

Convertir a Formato Kohya

Convierte adaptadores LoRA a formato .safetensors compatible con Kohya:
aitraining tools convert_to_kohya \
  --adapter-path ./lora-model \
  --output-path ./kohya-lora.safetensors

Cargando Adaptadores

Usa adaptadores sin fusionar:
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

# Load base model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B")

# Load adapter
model = PeftModel.from_pretrained(model, "./lora-model")

# Use for inference
inputs = tokenizer("Hello", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=50)

Mejores Prácticas

Entrenamiento

  • Usa tasa de aprendizaje mayor (2e-4 a 1e-3)
  • LoRA se beneficia de entrenamiento más largo
  • Considera apuntar a todas las capas lineales para tareas complejas

Memoria

  • Comienza con lora_r=16
  • Añade cuantización si es necesario
  • Usa gradient checkpointing (activado por defecto)

Calidad

  • Rango mayor generalmente = mejor calidad
  • Prueba en tu tarea específica
  • Compara con fine-tuning completo si la memoria lo permite

Próximos Pasos