Ajuste fino de Qwen2.5-32B-Instruct: Guía para crear asistentes personalizados

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.

Etiquetas: Qwen2.5 DeepSpeed transformers LLM fine-tuning YARN

Publicado el 8-14 06:49