Configuración del entorno de trabajo
Instalación de dependencias
Las versiones específicas de las bibliotecas son críticas para evitar incompatibilidades:
- transformers==4.45.0
- accelerate==0.34.0
- deepspeed==0.15.0
Para instalarlas todas de una vez:
pip install -r examples/requirements.txt
Obtención del código fuente
git clone https://gitcode.com/hf_mirrors/AI-Research/Qwen2.5-32B-Instruct
cd Qwen2.5-32B-Instruct
Análisis de la arquitectura
Antes de modificar parámetros, conviene entender la estructura interna del modelo:
| Característica | Especificación |
|---|---|
| Capas Transformer | 64 |
| Mecanismo de atención | GQA (40 cabezales Q, 8 cabezales KV) |
| Función de activación | SwiGLU |
| Normalización | RMSNorm |
| Parámetros totales | 32.5B (31.0B excluyendo embeddings) |
Estos valores se encuentran en config.json y determinan el consumo de memoria y la velocidad de entrenamiento.
Preparación de datos para el ajuste fino
El formato de conversación estructurado es el siguiente:
[
{"role": "system", "content": "Eres un asistente médico especializado en cardiología"},
{"role": "user", "content": "¿Cuáles son los síntomas de la insuficiencia cardíaca congestiva?"},
{"role": "assistant", "content": "La insuficiencia cardíaca congestiva se caracteriza por..."}
]
Cada muestra debe contener al menos una interacción usuario-asistente. El campo system es opcional pero recomendado para definir el comportamiento deseado.
Implementación del entrenamiento
Carga del modelo base
from transformers import AutoModelForCausalLM, AutoTokenizer
ruta_modelo = "./"
modelo = AutoModelForCausalLM.from_pretrained(
ruta_modelo,
torch_dtype="auto",
device_map="auto"
)
tokenizador = AutoTokenizer.from_pretrained(ruta_modelo)
Configuración de DeepSpeed
Cree un archivo ds_config.json para optimizar el uso de memoria en entrenamientos distribuidos:
{
"bf16": {"enabled": true},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {"device": "cpu"}
},
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto"
}
Script de entrenamiento completo
from transformers import TrainingArguments, Trainer
args = TrainingArguments(
output_dir="./modelo_ajustado",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=3e-5,
num_train_epochs=3,
warmup_ratio=0.03,
lr_scheduler_type="cosine",
deepspeed="ds_config.json",
logging_steps=10,
save_strategy="epoch",
)
entrenador = Trainer(
model=modelo,
args=args,
train_dataset=datos_entrenamiento,
)
entrenador.train()
Extensión del contexto con YaRN
Si sus documentos superan los 32,768 tokens, active la extensión dinámica en config.json:
{
"rope_scaling": {
"type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 32768
}
}
Esto permite procesar secuencias de hasta 128K tokens sin reentrenar desde cero.
Exportación e inferencia
Guardado del modelo ajustado
modelo.save_pretrained("./modelo_ajustado")
tokenizador.save_pretrained("./modelo_ajustado")
Ejemplo de generación con el modelo personalizado
consulta = "Resume los puntos clave de este contrato"
historial = [
{"role": "system", "content": "Eres un asistente legal experto en derecho corporativo"},
{"role": "user", "content": consulta}
]
texto = tokenizador.apply_chat_template(historial, add_generation_prompt=True, tokenize=False)
entradas = tokenizador([texto], return_tensors="pt").to(modelo.device)
ids_generados = modelo.generate(
**entradas,
max_new_tokens=512,
temperature=0.7,
do_sample=True
)
respuesta = tokenizador.batch_decode(ids_generados, skip_special_tokens=True)[0]
print(respuesta)
Recomendaciones para optimizar resultados
Infraestructura recomendada
- GPU con al menos 24GB de VRAM (RTX 4090, A100 o superior)
- Para modelos de 32B parámetros en precisión completa: 2-4 GPUs A100 de 80GB
- Almacenamiento NVMe para datasets grandes
Hiperparámetros clave
| Parámetro | Rango sugerido | Efecto |
|---|---|---|
| Tasa de aprendizaje | 2e-5 – 5e-5 | Valores altos aceleran convergencia pero pueden inestabilizar |
| Tamaño de lote efectivo | 16 – 64 | Mayor suaviza gradientes, menor ahorra memoria |
| Épocas | 2 – 5 | Más de 5 suele causar sobreajuste |
| Warmup | 3% – 10% | Evita divergencia en iteraciones iniciales |
Resolución de problemas comunes
Error OOM durante entrenamiento: Reduzca per_device_train_batch_size y aumente gradient_accumulation_steps manteniendo el tamaño de lote efectivo.
Respuestas repetitivas: Aumente el parámetro repetition_penalty en generación o reduzca las épocas de entrenamiento.
Incoherencia en formato de salida: Incluya ejemplos con el formato deseado en el dataset de entrenamiento (few-shot implícito).
Para profundizar en la configuración avanzada, consulte los archivos config.json y generation_config.json del repositorio, donde se documentan opciones como cuantización QLoRA, entrenamiento en múltiples nodos y técnicas de fusión de adapters.