[!NOTE] Traducción automática Este artículo se tradujo automáticamente a partir de la versión original en inglés.

LLM Fine-Tuning Guía: LoRA, QLoRA, DoRA, Unsloth, Axolotl y despliegue

La mayoría de los fallos fine-tuning se deben a problemas en la toma de decisiones. Un equipo realiza entrenamiento antes de comprobar si la inducción de prompts, la recuperación de información o constrained decoding pueden resolver el problema; evalúa los resultados en la distribución de datos utilizada para el entrenamiento; o descubre, una vez finalizado el entrenamiento, que el resultado generado es difícil de utilizar.

Esta guía considera la adaptación como un experimento que cuenta con un punto de salida operativo definido. Comienza por delimitar el umbral de decisión y, a continuación, sigue una secuencia que incluye el procesamiento de los datos, LoRA o QLoRA, la evaluación específica para cada tarea, la exportación de resultados y serving.

TL;DR: Realice el ajuste fino cuando una línea de base medida indique que modificar el comportamiento del modelo justifica una actualización de pesos. Utilice la recuperación de información para cambiar hechos y constrained decoding para la sintaxis. Empiece con LoRA cuando el modelo base se adapte sin problemas; emplee QLoRA cuando la limitación sea la memoria con pesos congelados. Reserve un conjunto de evaluación antes del entrenamiento, compárelo con la línea de base sin ajustar y elija el artefacto de despliegue antes de decidirse por un método específico.

¿Debería realizarse algún tipo de ajuste fino?

Antes de invertir GPU horas, decida si fine-tuning es la herramienta adecuada para resolver el problema que tiene entre manos.

Diagrama de flujo de decisión

Fine-tuning frente a RAG

Fine-tuning puede modificar la forma en que un modelo utiliza el lenguaje del dominio, pero constituye un mecanismo de actualización deficiente para aquellos hechos que cambian o deben citarse. La recuperación de información y fine-tuning abordan aspectos diferentes del problema y, con frecuencia, deben integrarse dentro del mismo sistema.

CaracterísticaFine-TuningRAG (Generación mejorada por recuperación de información)
Función principalModifica los pesos internos para enseñar habilidades, estilos o comportamientos.Proporciona contexto externo y actualizado en el momento de la inferencia
Mejor para• Estilos de conversación específicos
• Seguimiento de instrucciones complejas
• Razonamiento específico para un dominio determinado
• Datos en constante cambio (noticias, precios de acciones)
• Reducción de las alucinaciones (anclaje en datos reales)
• Citación de fuentes
Gestión del conocimientoModifica el comportamiento estadístico de los pesos; no se garantiza una recuperación exacta.Recupera registros o fragmentos que pueden ser actualizados y citados
Frecuencia de actualizaciónRequiere un nuevo entrenamiento para aplicar las actualizaciones.Se actualiza de inmediato al incorporar nuevos documentos.

Fine-tuning frente a prompt engineering

Los modelos modernos LLMs responden de manera óptima ante instrucciones claras prompts y ejemplos concretos. Pruebe esas opciones antes de invertir en fine-tuning.

AspectoFine-TuningPrompt Engineering
Coste de configuraciónAlto (curación de datos, GPU de cómputo, iteración)Baja (refinamiento iterativo prompt)
FlexibilidadCambios relacionados con el prompt
Formato/EstiloEs posible aumentar la probabilidad de que se produzca un comportamiento repetitivo.Con frecuencia es suficiente para el formato y los estilos simples.
LatenciaSe pueden acortar las instrucciones repetidas.Depende de la longitud de prompt y del caché del proveedor.
Mejor paraComportamientos complejos, destilación, costo a escalaIteración rápida y cambios en los requisitos

[!TIP] Pruebe primero con prompts Comience utilizando prompt y ejemplos representativos. Si solo la sintaxis de la salida es poco fiable, añada constrained decoding antes de modificar los pesos.

Fine-tuning frente a constrained decoding

Bibliotecas como xgrammar y outlines Se limita la generación a un JSON schema, una expresión regular o una gramática. En función de la restricción y de backend, se compila un autómata o una gramática que permite filtrar los tokens siguientes inválidos. No es necesario realizar ninguna actualización de pesos.

Esto garantiza la pertenencia al idioma de salida admitido, pero no implica que los valores sean verdaderos, completos o semanticamente adecuados. Una llamada a función sintácticamente válida puede seguir conteniendo un ID de cliente incorrecto.

AspectoConstrained DecodingFine-Tuning
ConfiguraciónInmediato: definir el esquema y desplegarlo.Requiere curación de datos, GPU de cómputo y iteraciones.
GarantíaSintaxis válida para la restricción soportadaComportamiento aprendido; la conformidad con el esquema puede variar.
FlexibilidadEs posible modificar el esquema en cualquier momento sin necesidad de realizar un nuevo entrenamiento.Bloqueado tras el entrenamiento
LatenciaUn ligero sobrecoste operativo (el modelo puede “entrar en conflicto” con el esquema).Reducir (formato de salida natural del modelo)
Mejor paraJSON, opciones, gramáticas, sintaxis de llamadas a herramientasComportamiento de tarea repetitiva que carece el modelo base

Un orden práctico:

  1. Comience con prompts y ejemplos de few-shot para el formateo básico.
  2. Añada constrained decoding (xgrammar o outlines) cuando la sintaxis es inconsistente.
  3. Realice el ajuste fino únicamente cuando sea necesario introducir cambios de comportamiento que un esquema no pueda imponer.

Referencia rápida: asociación de problemas con soluciones

DesafíoPrimer mecanismo para probar¿Por qué?
Conocimiento faltanteRAGLos modelos generan falsedades sobre hechos reales. La recuperación de información proporciona un contexto fiable y actualizado.
Formato/tono incorrectoPrompt EngineeringLos modelos modernos siguen correctamente las instrucciones de estilo mediante ejemplos de pocos ejemplares.
Sintaxis de salida inválidaConstrained decodingAplica un esquema o gramática admitida durante la generación.
Fallo reiterado de la tareaFine-tuning (SFT)Aprende a partir de ejemplos de entrada/salida seleccionados cuidadosamente.
Desequilibrio en las preferencias por paresOptimización de preferenciasUtiliza los ejemplos seleccionados/rechazados una vez que el comportamiento de la tarea sea medible.
Latencia/costo a escalaDestilación (SFT)Entrenar un modelo estudiante más pequeño a partir de las salidas del modelo maestro de mayor tamaño.
Reducir el tamaño del modeloCuantizaciónSin entrenamiento: comprimir los pesos (FP16→INT4) para una inferencia más rápida

Hacer que el caso de negocio sea medible

Fine-tuning puede reducir la cantidad de tokens prompt que se generan de forma recurrente o permitir que un modelo más pequeño cumpla con los requisitos establecidos, pero ninguna de estas economías se produce de forma automática. Es necesario calcular el punto de equilibrio utilizando los datos de tráfico y las tarifas propias del proyecto:

[ \text{Solicitudes de punto de equilibrio} = \frac{\text{Coste de entrenamiento + evaluación + despliegue}}{\text{Coste base/solicitud} - \text{Coste ajustado/solicitud}} ]

Si el denominador es pequeño, negativo o se basa en una suposición de calidad no comprobada, el proyecto aún no cuenta con un argumento económico sólido.

[!TIP] La configuración híbrida Una arquitectura habitual consiste en un modelo más pequeño adaptado a la tarea, combinado con mecanismos de recuperación de información para actualizar datos cuando sea necesario. Considere el modelo más grande, activado mediante prompts, como referencia base, y mantenga el modelo más pequeño únicamente si cumple con los mismos umbrales de calidad y seguridad específicos de la tarea.


Tipos de fine-tuning

Existen tres formas principales que puede adoptar fine-tuning. Diferen según el tipo de datos que requieren y qué enseñan al modelo.

Fine-Tuning Tipos

1. Preentrenamiento continuo (no supervisado)

Entrenas el modelo base con más texto en bruto, sin etiquetas. Continúa realizando predicciones de token siguiente, tal como ocurría durante la fase inicial de preentrenamiento.

Cuándo utilizarlo:

Ejemplo: entrenamiento con millones de notas clínicas para que el modelo aprenda las abreviaturas médicas, los nombres de fármacos y los flujos de trabajo clínicos.

2. Aprendizaje supervisado fine-tuning (SFT)

SFT se entrena con pares etiquetados de entrada y salida. Se le muestra al modelo la salida exacta que se desea obtener para cada entrada.

Cuándo utilizarlo:

Entrenamiento con pares de (descripción de consulta SQL, código SQL) para la tarea de texto a SQL.

{
    "input": "Get all users who signed up last month",
    "output": "SELECT * FROM users WHERE signup_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)"
}

3. Ajuste de instrucciones

El ajuste por instrucciones es un caso especial de SFT cuyo objetivo es hacer que los modelos sigan una gran variedad de instrucciones en lenguaje natural. Los datos de entrenamiento consisten en pares (instrucción, respuesta) provenientes de numerosas tareas diferentes.

Cuándo utilizarlo:

Ejemplo: entrenamiento con miles de instrucciones diversas como “Resumir este artículo”, “Escribir un poema sobre X” o “Explicar Y de forma sencilla”.

Comparación

AspectoEntrenamiento previo continuoSFTAjuste de instrucciones
DatosTexto brutopares (entrada, salida)pares (instrucción, respuesta)
EtiquetasNinguno (no supervisado)Específico para la tareaTareas diversas
ObjetivoConocimiento del dominioComportamiento específico de la tareaSeguir cualquier instrucción.
Volumen de datosPor lo general, se trata del corpus más grande.Se determina en función de la cobertura de tareas y la diversidad de errores.Por lo general, son más amplios que los SFT específicos para una tarea concreta.

[!NOTA] Qué es lo que realmente hacen los usuarios SFT y el ajuste por instrucciones emplean el mismo objetivo basado en el siguiente token; la diferencia radica en el alcance y la estructura de los dataset. El entrenamiento previo continuo constituye un experimento independiente, al cual deben seguir pruebas tanto para evaluar las mejoras en el dominio específico como para detectar cualquier regresión en las capacidades generales.


El proceso de 7 etapas fine-tuning pipeline

Fine-tuning es un pipeline, y no una única orden. Cada etapa presenta sus propios modos de fallo, y omitir alguna de ellas suele manifestarse posteriormente como un modelo de mala calidad.

7 etapas Pipeline

Cada etapa se basa en la anterior:

  1. Preparación de datos — Definir la unidad de evaluación, dividir los datos y, a continuación, limpiarlos y formatearlos.
  2. Selección del modelo — Elegir el modelo base adecuado e cargar sus pesos.
  3. Configuración del entrenamiento — Configurar el hardware, los hiperparámetros y la estrategia de optimización.
  4. Fine-tuning — Ejecutar SFT, DPO o el entrenamiento ORPO.
  5. Evaluación — Analizar el rendimiento de Benchmark y validar la calidad.
  6. Despliegue — Exportar y hacer disponible el modelo.
  7. Monitoreo — Seguir de cerca el rendimiento, realizar mantenimiento e iterar.

[!ADVERTENCIA] Los datos son la base fundamental El entrenamiento reproduce defectos sistemáticos en los ejemplos. Antes de invertir tiempo en pruebas con optimizadores, es necesario examinar las etiquetas, los problemas de fuga de información, el nivel de cobertura y el cumplimiento de las políticas establecidas.


Etapa 1: Preparación de datos

La mayoría de los proyectos fine-tuning fracasan en esta fase, y no durante el entrenamiento. La preparación moderna de datos va más allá de simplemente aplicar expresiones regulares a archivos CSV.

Datos Pipeline

El proceso de datos en 5 etapas pipeline

Herramientas como DataTrove y Distilabel pueden ser útiles a gran escala, pero la selección de pipeline debe basarse en la taxonomía de fallos y el contrato de datos, y no en la preferencia por una herramienta concreta.

1. Ingestión y filtrado

2. Política de datos sensibles

3. Duplicación (MinHash LSH)

4. Aumentación sintética, si es necesario

5. Formato

Ejemplos de formatos de datos

Formato Alpaca (seguimiento de instrucciones):

{
    "instruction": "Summarize the following text.",
    "input": "The text to be summarized...",
    "output": "This is the summary."
}

Formato ShareGPT/ChatML (conversacional):

{
    "conversations": [
        { "from": "user", "value": "Hello, who are you?" },
        { "from": "assistant", "value": "I am a helpful AI assistant." }
    ]
}

Qué es lo que realmente importa


Etapa 2: Selección del modelo y hardware

Elegir el modelo base y conocer el límite inferior definido por GPU determina qué es lo que realmente se puede entrenar.

Comience con el modelo base más pequeño que ya supere las verificaciones básicas indispensables. Confirme:

Fine-tuning representa una fase de adaptación y no una corrección para una base inadecuada. Si el modelo carece de las capacidades que abarca dataset, es necesario seleccionar otra base antes de continuar con la entrenamiento durante más épocas.

Ajuste el tamaño de la ejecución, no el nivel de marketing

No existe una tabla estable y duradera que relacione el “tamaño del modelo → GPU”. El consumo máximo de memoria varía en función de la precisión de los pesos, el optimizador, la cantidad de parámetros entrenables, la longitud de las secuencias, el tamaño de los microlotes, la implementación de checkpoints de activación, la forma en que se gestiona la atención, así como del sobrecoste generado por framework. Comience haciendo una estimación preliminar del uso de memoria y, a continuación, ejecute una prueba rápida de longitud máxima con la configuración técnica exacta.

Componente de memoriaFull fine-tuningLoRAQLoRA
Pesos basePrecisión de entrenamientoCongelado, por lo general BF16/FP16Congelado, típicamente NF4 de 4 bits.
GradientesTodos los pesos entrenablesPesos del adaptadorPesos del adaptador
Estados del optimizadorTodos los pesos entrenablesPesos del adaptadorPesos del adaptador
ActivacionesDepende de la longitud del lote y de la secuencia en cada método.Misma dependenciaMisma dependencia

El artículo original QLoRA logró adaptar un modelo LLaMA de 65 mil millones de parámetros en un único dispositivo GPU de 48 GB, dentro de su configuración específica. Dicho resultado constituye un límite útil, pero no garantiza que toda arquitectura actual de 70 mil millones de parámetros, ni ninguna longitud de contexto, kernel o algoritmo de entrenamiento, pueda adaptarse al mismo equipo.

Matemáticas de la memoria

En el caso de un modelo con (P) parámetros, solo los pesos requieren aproximadamente (2P) bytes en BF16/FP16 o (0.5P) bytes si se almacenan con cuatro bits, sin contar aún los metadatos de cuantización ni los buffers de runtime. El entrenamiento completo al estilo Adam añade además los gradientes, los estados del optimizador y, con frecuencia, pesos maestros de mayor precisión. LoRA permite evitar la mayor parte de la memoria dedicada a los estados entrenables; por su parte, QLoRA reduce aún más el espacio ocupado por los pesos base congelados. No obstante, las activaciones siguen pudiendo ser los componentes que dominen el consumo de memoria en secuencias muy largas.

Utilice este flujo de trabajo:

  1. Elija la secuencia más larga y el tamaño del micro-lote que deba soportar.
  2. Estime los pesos y los estados entrenables, reservando espacio adicional para las activaciones y los núcleos.
  3. Ejecute un paso hacia adelante/atrás con la longitud máxima permitida.
  4. Registre la memoria máxima asignada y reservada.
  5. Solo entonces ajuste el tamaño del lote, el número de procesadores, la longitud de la secuencia o el conteo de GPU.

Etapa 3: Métodos de entrenamiento (PEFT y LoRA)

fine-tuning completo frente a PEFT

El proceso completo de fine-tuning (FFT) actualiza cada peso individualmente, por lo que los gradientes y el estado del optimizador escalan junto con todo el modelo. No es posible determinar el consumo máximo de memoria únicamente a partir del número de parámetros, pero este valor está muy por encima de la memoria necesaria para cargar los pesos con el fin de realizar inferencias.

El fine-tuning (PEFT) eficiente en parámetros entrena únicamente un subconjunto reducido de parámetros y congela el resto. De este modo, las operaciones matemáticas se vuelven mucho más sencillas.

LoRA: el punto de partida

LoRA (Adaptación de rango bajo) consiste en congelar una matriz preentrenada y representar su actualización aprendida mediante dos matrices más pequeñas. El artículo original justifica este enfoque partiendo de la hipótesis de que las actualizaciones de adaptación útiles presentan un rango intrínseco bajo.

LoRA Arquitectura

Para una matriz congelada (W0 \in \mathbb{R}^{d{out} \times d_{in}}), LoRA aprende:

La capa adaptada es:

[ W’ = W_0 + \frac{\alpha}{r}BA ]

El adaptador cuenta con (r(d*{in}+d*{out})) parámetros entrenables en lugar de (d*{in}d*{out}) para dicha matriz. En el caso de una matriz cuadrada de 4.096 elementos con rango 16, esto supone una reducción de 128× en su tamaño, y no una reducción de 10.000× como ocurre en modelos arbitrarios. La cifra de 10.000× mencionada en el artículo LoRA se refería específicamente a una configuración de GPT-3 de 175 mil millones de parámetros que aplicaba adaptaciones a matrices seleccionadas.

Comparación de métodos PEFT

Método¿Qué cambios?Elige esta opción cuando
LoRABase congelada más actualizaciones entrenables de rango bajoEl modelo base se adapta sin problemas y se desea obtener artefactos de tareas de tamaño reducido.
QLoRALoRA junto con la base congelada almacenada en formato de 4 bitsLa memoria de peso base es el factor limitante
DoRASepara la magnitud del peso de la dirección actualizada mediante LoRA.Una línea de base medida con LoRA genera una brecha de calidad que requiere mayor complejidad.
fine-tuning completoTodos los pesos del modeloPEFT no alcanza el objetivo, y la mejora en calidad justifica el entrenamiento distribuido así como un checkpoints completo.

Cuándo elegir uno u otro

DoRA: LoRA descompuesto por pesos

DoRA (Adaptación de Bajo Rango Descompuesta por Pesos) separa la magnitud de cada vector de pesos de su dirección. Aplica una actualización LoRA al componente direccional, mientras que aprende la magnitud de forma independiente.

DoRA Arquitectura

Cómo funciona:

En lugar de tratar los pesos como una única entidad, DoRA divide los pesos preentrenados en dos componentes:

  1. Magnitud: un valor entrenable asociado a cada vector de pesos. 2. Dirección: un vector normalizado que se actualiza mediante matrices de rango bajo.

En notación compacta por columnas:

[ W’ = m \frac{V + BA}{\lVert V + BA \rVert_c} ]

Donde:

Qué obtienes con esa estructura adicional:

Fusión de adaptadores para el aprendizaje multi-tarea

Métodos comunes de fusión:

  1. Concatenación: combina los parámetros de los adaptadores y aumenta el rango efectivo. Es un método rápido y sencillo.
  2. Combinación lineal: suma ponderada de los adaptadores. Permite ajustar sus parámetros de forma precisa.
  3. SVD: descomposición matricial utilizada para la fusión. Ofrece mayor flexibilidad, pero es más lento.

Un adaptador para la resumenización y otro para la traducción, fusionados en un único modelo multitarea.


Etapa 4: Fine-tuning y alineación de preferencias

SFT aprende a partir de demostraciones. En cambio, la optimización de preferencias se basa en comparaciones como “la respuesta seleccionada A es mejor que la respuesta rechazada B”. Úsala únicamente cuando la preferencia entre pares sea la etiqueta adecuada para describir el error; la corrección factual y el cumplimiento de políticas suelen requerir evaluadores más robustos que una preferencia global.

Métodos de alineación

PPO basado en RLHF

La receta original constaba de tres fases pipeline:

  1. SFT: aprender la tarea.
  2. Modelo de recompensa: entrenamiento basado en las preferencias humanas (elegidas frente a rechazadas).
  3. PPO (Optimización de políticas proximal): aprendizaje por refuerzo utilizado para optimizar la política.

El costo operativo proviene de las partes móviles:

DPO

DPO (Optimización de preferencias directas) elimina el modelo de recompensa explícito y el bucle de aprendizaje por refuerzo. Sigue optimizando el objetivo RLHF (maximización de recompensas con una restricción de divergencia KL), pero lo hace como un problema de aprendizaje supervisado reparametrizado en lugar de mediante aprendizaje por refuerzo:

{
    "prompt": "Explain quantum computing",
    "chosen": "Quantum computing uses qubits...",   # Preferred response
    "rejected": "Well, it's complicated..."        # Non-preferred response
}

Qué cambios operativos se producen:

Prototipar DPO resulta más sencillo que hacerlo con un PPO pipeline completo, pero esto no implica necesariamente una mejora automática en la calidad. Los resultados dependen de la política de partida, de la calidad de las parejas de datos, de los parámetros de pérdida, de los efectos derivados de la longitud de los inputs y del protocolo de evaluación. Es conveniente compararlo con un SFT checkpoint utilizando los mismos conjuntos de preferencias y tareas reservadas para pruebas.

ORPO

ORPO (Odds-Ratio Preference Optimization) integra la pérdida de verosimilitud logarítmica negativa SFT con una penalización basada en la razón de probabilidades aplicada a las respuestas rechazadas. Este método elimina la necesidad de utilizar un modelo de referencia independiente y permite combinar el aprendizaje por tareas con la optimización de preferencias en una sola ejecución.

Cómo funciona: ORPO utiliza una pérdida combinada que realiza dos acciones al mismo tiempo:

  1. Maximiza la probabilidad de que se elija la respuesta adecuada (aprendizaje de la tarea).
  2. Castiga la respuesta rechazada mediante un término basado en la relación de probabilidades (aprendizaje de preferencias).

Hipérmparametros que merecen atención:

from trl import ORPOConfig

config = ORPOConfig(
    learning_rate=8e-6,  # Very low, as recommended by the ORPO paper
    beta=0.1,            # Controls strength of preference penalty
    # ... other params
)

El compromiso:

Elige entre los diseños de datos y evaluación:

El valor por defecto en todas las tareas es “ninguno”. Es necesario mantener una línea de base exclusiva basada en SFT y reportar tanto las métricas relacionadas con la tarea como las métricas de preferencia.


Fine-tuning frameworks

Frameworks La superposición y los cambios ocurren con gran rapidez. Es necesario seleccionar según la ruta de ejecución que se vaya a soportar, fijar las versiones y mantener la configuración de entrenamiento lo suficientemente portátil como para poder reproducirla fuera de un entorno de notebooks.

Unsloth: eficiencia en velocidad y consumo de memoria

Unsloth se integra con Hugging Face trl y transformers Además, ofrece núcleos optimizados, mecanismos de checkpointing y rutas fine-tuning cuantizadas para los modelos compatibles.

[!IMPORTANTE] El orden de importación es crucial Sigue el orden de importación del ejemplo de Unsloth correspondiente a la versión que hayas fijado. Unsloth aplica parches durante el proceso de importación, por lo que es necesario importarlo primero. trl y transformers Evita la omisión de optimizaciones o errores propios de determinadas versiones.

# ✅ Correct order
from unsloth import FastLanguageModel  # Must be first!
from trl import SFTTrainer
from transformers import TrainingArguments

# Avoid this order with Unsloth's patched path
from trl import SFTTrainer
from unsloth import FastLanguageModel

Ideal para: entrenamiento individual con GPU, prototipado, cuadernos de trabajo de Colab, y para todo aquel que deba hacer frente a la factura de GPU.

Las cifras relativas a la velocidad de publicación y al consumo de memoria varían en función del modelo, de la longitud de la secuencia, del lote de procesamiento, de la precisión numérica y del hardware utilizado. Es importante considerar los tokens por segundo generados por Benchmark así como el consumo máximo de memoria en la ejecución concreta, en lugar de interpretar una relación indicada en titulares como si se tratara de una propiedad estática de framework.

Axolotl: entrenamiento impulsado por configuraciones

# config.yaml - no code required
base_model: meta-llama/Meta-Llama-3-8B
adapter: qlora
lora_r: 32
lora_alpha: 16
datasets:
    - path: data/my_data.jsonl
      type: alpaca
sample_packing: true

Ejecutar con: accelerate launch -m axolotl.cli.train config.yaml

Ideal para: ejecuciones declarativas y reproducibles, así como opciones integradas de inicio para el entrenamiento distribuido.

La principal ventaja radica en una configuración declarativa que permite su revisión, versionado y reutilización tanto en ejecuciones locales como distribuidas.

Framework comparación

HerramientaEs útil cuandoVerificar antes de realizar el commit
UnslothDesea una ruta de modelo compatible optimizada con ejemplos concisos.Modelo, GPU, cuantización y matriz de soporte distribuido
AxolotlDeseas configuraciones declarativas y recetas distribuidas integradas.Esquema de configuración exacto y programa de lanzamiento para la versión fija
TRLDeseas acceso directo a Hugging Face SFT y a los entrenadores de preferencias.formato Dataset, plantilla de chat, enmascaramiento de pérdida e integración con PEFT
TorchtuneDeseas recetas y componentes nativos de PyTorch.Cobertura de la receta del modelo y compatibilidad de exportación

Demo práctica: fine-tuning con Unsloth

He aquí un ejemplo completo de mi unsloth-finetune-demo repositorio. La demostración realiza un ajuste fino de Nemotron-Nano para function calling.

Entrenamiento de Pipeline

Inicio rápido

# Clone and setup
git clone https://github.com/slavadubrov/unsloth-finetune-demo.git
cd unsloth-finetune-demo

# Install with uv (recommended)
uv sync

# Run fine-tuning (quick test)
uv run finetune --max-samples 1000

Configuración

Las partes interesantes se encuentran en config.py:

# Model & Dataset
MODEL_NAME = "nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1"  # 4B params, 128K context
DATASET_NAME = "glaiveai/glaive-function-calling-v2"   # 113K examples

# LoRA Configuration
LORA_R = 16        # Adapter capacity; tune against held-out results
LORA_ALPHA = 32    # Update scaling; alpha/r is the classic LoRA scale
MAX_SEQ_LENGTH = 4096

# Candidate modules for this Llama-family model
LORA_TARGET_MODULES = [
    "q_proj", "k_proj", "v_proj", "o_proj",
    "gate_proj", "up_proj", "down_proj",
]

[!NOTE] La relación alfa-a-valor de rango alpha/r escala la actualización clásica de LoRA. alpha = 2r

Código de entrenamiento principal

from unsloth import FastLanguageModel
from trl import SFTConfig, SFTTrainer

# Load model with 4-bit quantization
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1",
    max_seq_length=4096,
    load_in_4bit=True,
)

# Add LoRA adapters
model = FastLanguageModel.get_peft_model(
    model,
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    use_gradient_checkpointing="unsloth",  # Lower activation memory; extra compute
)

# The data step creates versioned train_dataset and eval_dataset objects.
# Each row has the chat messages and tool schemas expected by current TRL.

# Train with the current TRL configuration surface.
trainer = SFTTrainer(
    model=model,
    processing_class=tokenizer,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    args=SFTConfig(
        output_dir="outputs/nemotron-function-calling",
        max_length=4096,
        packing=True,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        learning_rate=2e-4,
        num_train_epochs=3,
        bf16=True,
    ),
)
trainer.train()

Fine-tuning con Axolotl

[!NOTE] Próxima demostración Estoy trabajando en una demostración práctica con Axolotl. Hasta entonces, la Guía para acelerar el paralelismo n-D El documento proveniente de Hugging Face constituye una referencia útil para las estrategias de entrenamiento multi-GPU.

En configuraciones basadas en la configuración y distribuidas, Axolotl permite que el flujo de trabajo sea reproducible:

# axolotl_config.yaml
base_model: meta-llama/Meta-Llama-3-8B
model_type: LlamaForCausalLM

# QLoRA configuration
load_in_4bit: true
adapter: qlora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
    - q_proj
    - k_proj
    - v_proj
    - o_proj
    - gate_proj
    - up_proj
    - down_proj

# Dataset
datasets:
    - path: data/training_data.jsonl
      type: alpaca

# Training settings
sequence_len: 4096
sample_packing: true # Benchmark with your length distribution
micro_batch_size: 2
gradient_accumulation_steps: 4
learning_rate: 0.0002
num_epochs: 3

# Precision and attention path; verify support on the pinned stack
bf16: true
flash_attention: true

Ejecutar el entrenamiento:

axolotl train axolotl_config.yaml

Etapa 5: Evaluación

Congele el contrato de evaluación antes del primer ejecución. Como mínimo, compare la versión ajustada de checkpoint con la versión base sin ajustes, bajo las mismas condiciones de prompt, parámetros de decodificación y entorno de herramientas. Solo presente los resultados globales de calidad una vez comprobados los casos de fallo que el proyecto debía corregir.

Rastrea cuatro grupos:

  1. Tarea objetivo: coincidencia exacta, éxito en la ejecución, evaluación humana, u otro resultado relacionado con el caso de uso.
  2. Regresión: capacidades generales y subtareas previamente soportadas que podrían verse afectadas negativamente por la adaptación.
  3. Seguridad y políticas: rechazos, fugas de datos, prompt injection, o restricciones específicas del dominio.
  4. Operaciones: latencia, ancho de banda, memoria, tamaño de los artefactos, y coste en la configuración serving prevista.

Automatización de benchmarks

Utilizar lm-evaluation-harness para tareas estandarizadas relevantes, y no como sustituto de la evaluación del producto:

lm_eval --model hf \
    --model_args pretrained=./outputs/merged-model \
    --tasks hellaswag,arc_easy,mmlu \
    --batch_size 8

LLM como juez

En cuanto a la calidad subjetiva, un modelo más grande puede ayudar a realizar la puntuación, pero es necesario calibrarlo con ejemplos revisados por humanos y mantener oculta la identidad del candidato:

judge_prompt = """
Rate this response from 1-5 on:
- Relevance
- Accuracy
- Formatting

Response: {model_output}
Expected: {ground_truth}
"""

Evaluación específica del dominio

Se deben excluir los ejemplos reales por origen, usuario, documento o fecha de tal manera que los casi duplicados no puedan filtrarse entre las dos partes del conjunto de datos. En el caso de function calling, es necesario validar toda la trayectoria del proceso: selección de herramientas, argumentos utilizados, resultado de ejecución, acciones de recuperación y respuesta final. Cuando la muestra sea pequeña, se deben presentar intervalos de confianza o conteos de éxitos y fracasos correspondientes, además de analizar detenidamente cada regresión que ocurra en una franja crítica del tiempo.


Etapa 6: Despliegue y formatos de salida

Elige el artefacto en función del motor serving y del plan de reversión, y no únicamente del tamaño del archivo:

Formatos de salida

1. Adaptador LoRA

uv run finetune  # Saves ~100-500MB adapter

2. Modelo fusionado

uv run finetune --merge  # Creates a standalone full model

3. Formato GGUF

uv run finetune --gguf q4_k_m  # Creates ~2-4GB quantized model

Etapa 7: Serving y monitoreo

Con vLLM

# Serve the base and expose a PEFT adapter as a model name.
vllm serve nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1 \
    --enable-lora \
    --lora-modules function-calling=./outputs/adapter \
    --host 0.0.0.0 \
    --port 8000 \
    --max-model-len 4096

Consulta mediante el API compatible con OpenAI:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
    model="function-calling",
    messages=[{"role": "user", "content": "Book a flight to Tokyo"}]
)

Con Ollama (local)

# Create Modelfile
echo 'FROM ./outputs/unsloth-nemotron-function-calling-gguf/model-q4_k_m.gguf' > Modelfile

# Import to Ollama
ollama create my-function-model -f Modelfile

# Run
ollama run my-function-model

Con llama.cpp (CPU)

./llama-cli -m ./outputs/model-q4_k_m.gguf \
    -p "What's the weather in Tokyo?" \
    --ctx-size 4096

Monitorear el modelo publicado

El ciclo de vida no finaliza cuando la pérdida durante el entrenamiento alcanza un valor aceptable. Se debe registrar la versión del modelo base, el tokenizador y la plantilla de chat, el hash del adaptador, la versión de dataset, la configuración de entrenamiento y el informe de evaluación como una única unidad de lanzamiento. En producción, se debe monitorear el éxito de las tareas, las salidas inválidas, los fallos en las políticas, la latencia y la deriva de las entradas mediante los mismos datos de muestra que se utilizaron en modo offline. Asimismo, es necesario mantener los artefactos anteriores listos para ser cargados y definir un umbral de retroceso antes del despliegue.


Conclusiones clave

  1. Realice el ajuste fino únicamente después de que una versión base sin ajustar y una taxonomía de fallos demuestren que la adaptación de pesos resuelve el problema.
  2. El módulo de recuperación se encarga de gestionar las pruebas variables; constrained decoding se ocupa de la sintaxis; ninguno de ellos es reemplazado por SFT.
  3. LoRA reduce el número de estados entrenables. QLoRA comprime adicionalmente los pesos base congelados. No atribuya las cifras de memoria de QLoRA a LoRA.
  4. La cobertura de datos, la integridad de las particiones, el origen de los mismos y el enmascaramiento de pérdidas son más importantes que copiar una configuración de optimizador de moda.
  5. DPO, ORPO y los diseños experimentales basados en PPO y RLHF son enfoques distintos, no una escala de calidad con un valor predeterminado universal.
  6. Evalúe el comportamiento deseado, las regresiones, la seguridad y las operaciones utilizando el mismo modelo base.
  7. Elija la salida del adaptador, la combinada o GGUF según los requisitos de serving y de reversión antes de iniciar el entrenamiento.

Referencias

Artículos y trabajos de investigación

Herramientas de procesamiento de datos

Constrained decoding

Entrenamiento frameworks

Inferencia e implementación

Evaluación

Guías y recursos