Microsoft LoRA es una biblioteca de Python de código abierto de Microsoft que implementa la técnica "LoRA: Adaptación de Bajo Rango de Modelos de Lenguaje Grandes" (Low-Rank Adaptation of Large Language Models). Este proyecto proporciona una solución revolucionaria para el ajuste fino eficiente de modelos de lenguaje grandes.
Dirección del Proyecto: https://github.com/microsoft/LoRA
Dirección del Artículo: https://arxiv.org/abs/2106.09685
LoRA (Low-Rank Adaptation) es un método de ajuste fino eficiente en parámetros, cuya idea central es:
En el benchmark GLUE, LoRA demostró un rendimiento excepcional:
Modelo | Número de Parámetros de Entrenamiento | Precisión MNLI | Precisión SST-2 | Precisión MRPC |
---|---|---|---|---|
RoBERTa Base Ajuste Fino Completo | 125M | 87.6 | 94.8 | 90.2 |
RoBERTa Base LoRA | 0.8M | 87.6±.1 | 95.1±.2 | 89.7±.7 |
DeBERTa XXL Ajuste Fino Completo | 1.5B | 91.1 | 96.8 | 92.9 |
DeBERTa XXL LoRA | 4.7M | 91.9±.1 | 96.9±.2 | 92.6±.6 |
En tareas de generación de texto como E2E, DART, WebNLG, LoRA también muestra un rendimiento excelente:
Método | Parámetros de Entrenamiento | E2E (BLEU) | DART (BLEU) | WebNLG (BLEU) |
---|---|---|---|---|
GPT-2 M Ajuste Fino Completo | 354.92M | 68.2 | 46.0 | 47.6 |
GPT-2 M LoRA | 0.35M | 70.4±.1 | 47.1±.2 | 55.3±.2 |
microsoft/LoRA/
├── loralib/ # Código fuente de la biblioteca principal
├── examples/
│ ├── NLG/ # Ejemplo de generación de lenguaje natural GPT-2
│ └── NLU/ # Ejemplo de comprensión del lenguaje natural RoBERTa/DeBERTa
├── README.md
└── setup.py
pip install loralib
# O instalar desde el código fuente
pip install git+https://github.com/microsoft/LoRA
# ===== Antes de la modificación =====
# layer = nn.Linear(in_features, out_features)
# ===== Después de la modificación =====
import loralib as lora
layer = lora.Linear(in_features, out_features, r=16)
import loralib as lora
model = BigModel()
# Establecer solo los parámetros que contienen "lora_" como entrenables
lora.mark_only_lora_as_trainable(model)
# Bucle de entrenamiento
for batch in dataloader:
# Flujo de entrenamiento normal
pass
# Guardar los parámetros LoRA
torch.save(lora.lora_state_dict(model), 'lora_checkpoint.pt')
# Cargar el modelo pre-entrenado
model.load_state_dict(torch.load('pretrained.pt'), strict=False)
# Cargar los parámetros LoRA
model.load_state_dict(torch.load('lora_checkpoint.pt'), strict=False)
Actualmente, la biblioteca LoRA soporta los siguientes tipos de capas:
nn.Linear
→ lora.Linear
nn.Embedding
→ lora.Embedding
nn.Conv2d
→ lora.Conv2d
lora.MergedLinear
(para capas lineales fusionadas como la proyección QKV)# Para escenarios como la proyección QKV
qkv_proj = lora.MergedLinear(
d_model, 3*d_model,
r=8,
enable_lora=[True, False, True] # Aplicar LoRA solo a Q y V
)
# Entrenar el sesgo relacionado con LoRA
lora.mark_only_lora_as_trainable(model, bias='lora_only')
# Entrenar todos los sesgos
lora.mark_only_lora_as_trainable(model, bias='all')
# Modo de evaluación: fusionar pesos, eliminar la latencia de inferencia
model.eval()
# Modo de entrenamiento: restaurar el estado de separación
model.train()
El proyecto Microsoft LoRA proporciona una solución innovadora para el ajuste fino eficiente de modelos de lenguaje grandes. A través de la ingeniosa técnica de adaptación de bajo rango, mantiene un excelente rendimiento del modelo al tiempo que reduce significativamente los costos de computación y almacenamiento. Este proyecto no solo tiene un importante valor académico, sino que también proporciona una ruta técnica viable para aplicaciones industriales prácticas, y es un trabajo histórico en el campo del ajuste fino eficiente en parámetros.