Mistral-finetune - Ajuste fino de modelos Mistral
(github.com/mistralai)mistral-finetunees una base de código ligera para hacer ajuste fino eficiente en memoria y de buen rendimiento de modelos Mistral, y el repositorio actual está archivado y ya no recibe mantenimiento activo- El método de entrenamiento se basa en LoRA, que congela la mayoría de los pesos y entrena solo entre 1% y 2% de pesos adicionales en forma de perturbaciones matriciales de bajo rango
- Para máxima eficiencia se recomienda usar GPUs A100 o H100; el código está optimizado para entrenamiento en múltiples GPUs en un solo nodo, aunque modelos pequeños como 7B también pueden ejecutarse en una sola GPU
- Entre los modelos compatibles están 7B, Mixtral 8x7B, Mixtral 8x22B, Mistral-Nemo 12B y Mistral Large v2 123B Instruct; Mistral-Nemo y Large v2 tienen restricciones relacionadas con longitud de secuencia y tasa de aprendizaje, respectivamente
- Los datos deben seguir el formato
jsonly un esquema estricto; antes de entrenar es importante validar el formato y estimar el tiempo de entrenamiento conutils.validate_data
Estado y objetivo del proyecto
- El repositorio
mistral-finetuneestá en estado Archived y ya no recibe mantenimiento activo - Si hay demanda de la comunidad o se considera que puede aportar valor al ecosistema de ajuste fino, en el futuro podrían aparecer una nueva librería o actualizaciones de gran escala
- El objetivo es ofrecer un punto de entrada simple y guiado para ajustar modelos Mistral
- Esta base de código tiene criterios bastante rígidos, especialmente sobre el formato de datos, y no busca ser una herramienta genérica que cubra múltiples arquitecturas de modelos o tipos de hardware
- Para un enfoque más general se puede consultar proyectos como torchtune
Método de ajuste fino y recomendaciones de hardware
mistral-finetunese basa en LoRA- La mayoría de los pesos del modelo se mantienen congelados
- Solo se entrena entre 1% y 2% de pesos adicionales en forma de perturbaciones matriciales de bajo rango
- Para máxima eficiencia se recomienda usar GPUs A100 o H100
- El código está optimizado para entornos de entrenamiento con múltiples GPUs en un solo nodo
- Modelos pequeños como 7B pueden funcionar bien en una sola GPU
Actualizaciones recientes de modelos compatibles
- Desde el 13 de agosto de 2024, Mistral Large v2 es compatible con
mistral-finetune- Hay que descargar el checkpoint 123B Instruct y configurar
model_id_or_pathal directorio de ese checkpoint - Debido al tamaño del modelo, se requiere mucha más memoria para el ajuste fino
- Actualmente,
seq_lendebe configurarse en 8192 o menos - Se recomienda una tasa de aprendizaje más baja que en otros modelos, y se indica que en la mayoría de los casos
lr=1e-6funciona bien
- Hay que descargar el checkpoint 123B Instruct y configurar
- Desde el 19 de julio de 2024, Mistral Nemo es compatible con
mistral-finetune- Hay que descargar el modelo 12B Base o Instruct y configurar
model_id_or_pathal directorio del checkpoint - Se requiere una versión de
mistral-commoncompatible con Tekkenizer; debe instalarse la versión>=1.3.1conpip install --upgrade mistral-common - Debido al gran tamaño del vocabulario, aumenta el pico de memoria requerido por la CE loss y por ahora se necesita más memoria
- Actualmente,
seq_lendebe configurarse en 16384 o menos - Se recomienda usar los mismos hiperparámetros que en 7B v3
- Hay que descargar el modelo 12B Base o Instruct y configurar
Instalación y descarga de modelos
- El proceso inicial consiste en clonar el repositorio e instalar dependencias
git clone https://github.com/mistralai/mistral-finetune.gitpip install -r requirements.txt
- Se recomienda hacer ajuste fino sobre modelos oficiales de Mistral, y el README proporciona los siguientes enlaces de descarga y checksums
- 7B Base:
0663b293810d7571dad25dae2f2a5806 - 7B Instruct v3:
80b71fcb6416085bcb4efad86dfb4d52 - 8x7B Base: enlace de Hugging Face
- 8x7B Instruct:
8e2d3930145dc43d3084396f49d38a3f - 8x22 Instruct:
471a02a6902706a2f1e44a693813855b - 8x22B Base:
a2fa75117174f87d1197e3a4eb50371a - 12B Instruct (Mistral-Nemo):
296fbdf911cb88e6f0be74cd04827fe7 - 12 Base (Mistral-Nemo):
c5d079ac4b55fc1ae35f51f0a3c0eb83 - 123B Instruct (Large v2):
fc602155f9e39151fba81fcaab2fa7c4
- 7B Base:
- 8x7B Base V1 y 8x7B Instruct V1 deben usar el tokenizer v3 y ampliar el vocabulario a 32768 antes del ajuste fino
- La ruta de la carpeta del modelo descargado debe especificarse como ruta absoluta en
model_id_or_pathdentro del YAML de entrenamiento
Requisitos del formato de datos
- Todos los archivos de datos deben estar en formato jsonl
- Los datos de preentrenamiento guardan texto plano en la clave
"text" - Los datos de instrucciones guardan una lista de conversación en la clave
"messages"- Cada elemento incluye las claves
"content"y"role" "role"debe ser uno de"user","assistant","system"- La pérdida solo se calcula cuando
"role" == "assistant" - Se puede excluir del entrenamiento un mensaje del assistant indicando
"weight": 0
- Cada elemento incluye las claves
- Los datos de llamadas a funciones también guardan una lista de conversación en la clave
"messages"- Cada elemento incluye la clave
"role"y"content"o"tool_calls" "role"debe ser uno de"user","assistant","system","tool"- La pérdida solo se calcula cuando
"role" == "assistant" "id"de"tool_calls"y"tool_call_id"deben ser cadenas aleatorias de exactamente 9 caracteres- El README recomienda generar esto automáticamente en el script de preparación de datos
- Cada elemento incluye la clave
Validación de datos y flujo de trabajo de ejemplo
- Antes de iniciar el entrenamiento, hay que validar el formato de los datos y estimar el tiempo de entrenamiento con utils.validate_data
- El ejemplo de instrucciones usa una parte de Ultachat_200k
- Se cargan datos parquet con Pandas
- Se dividen en 95% entrenamiento y 5% evaluación
- Se guardan como
jsonl - Las rutas se configuran en
data.instruct_dataydata.eval_instruct_datadeexample/7B.yaml
- Durante la validación puede detectarse que algunas conversaciones terminan con rol
user- Como solo se entrenan mensajes del assistant, el último mensaje de
userqueda como procesamiento innecesario - Los datos pueden corregirse con utils.reformat_data.py
- Como solo se entrenan mensajes del assistant, el último mensaje de
- Después de corregir y validar de nuevo, se imprime un resumen con número de tokens de datos, tokens de entrenamiento, número de épocas,
max_stepsy tiempo estimado - En el ejemplo del README,
max_steps=500recorre el dataset unas 5 veces y toma cerca de 30 minutos en un clúster 8xH100, por lo que se recomiendamax_steps=300
Ejemplo de ajuste fino para llamadas a funciones
- El ejemplo de llamadas a funciones usa el Glaive function calling dataset
- Los datos se cargan con Pandas, se dividen en 95% entrenamiento y 5% evaluación, y luego se guardan como
jsonl - El dataset original no sigue el formato de llamadas a funciones requerido, así que necesita reformateo
"from"debe cambiarse a"user"- Deben eliminarse caracteres
"\n"innecesarios
- utils.reformat_data_glaive.py permite llevar la mayoría de las muestras al formato correcto
- Como es imposible escribir un script de reformateo que funcione para todo tipo de datasets, los datasets que no cumplan el formato requerido pueden necesitar un script aparte
- Si se usa
utils.validate_data --create_corrected, se pueden eliminar los errores restantes y generar un dataset.corrected
Ejecución del entrenamiento y ejemplos de resultados
- Tras validar los datos, se puede iniciar el entrenamiento
- Para entrenar más rápido, se recomienda una configuración con
max_stepsen 300 run_dirdebe configurarse como carpeta del experimento y, opcionalmente, puede definirsewandb.projectpara usar logging con Weights & Biases- La ejecución del entrenamiento usa
torchrun, y--nproc-per-nodedebe ajustarse al número de GPUs disponibles - El entrenamiento con UltraChat toma cerca de 30 minutos en un nodo 8xH100, y los pesos resultantes pueden lograr una puntuación MT Bench de alrededor de 6.3
- El entrenamiento con Glaive toma cerca de 1 hora en un nodo 8xH100, y se indica que los pesos resultantes funcionan bien para llamadas a funciones
Campos principales de configuración de entrenamiento
model_id_or_path: modelo preentrenado o ruta al directorio del modelo local desde el que se iniciará el entrenamientorun_dir: directorio donde se guardarán checkpoints y métricasseq_len: longitud de secuencia de entrenamiento; las muestras se empaquetan a ese tamaño para mayor eficienciabatch_size: número de ejemplos de entrenamiento por GPU- El tamaño efectivo total del batch de tokens es
num_gpus x batch_size x seq_len
- El tamaño efectivo total del batch de tokens es
max_steps: número total de iteraciones de entrenamiento- El total de tokens vistos durante el entrenamiento es
max_steps x num_gpus x batch_size x seq_len
- El total de tokens vistos durante el entrenamiento es
optim.lr: tasa de aprendizaje inicial del optimizadoroptim.weight_decay: decaimiento de pesos; el README recomienda mantenerlo en 0.1optim.pct_start: proporción de la fase de warm-up de PyTorchOneCycleLRlora.rank: tamaño del adaptador LoRA; se recomienda 64 o menosseed: semilla aleatoria para reproducibilidad en inicialización, mezcla y muestreo de datosdata.instruct_data: ruta de los datos de entrenamiento por instrucciones- Puede especificarse un solo archivo
jsonl, un directoriojsonlo varias fuentes de datos con pesos
- Puede especificarse un solo archivo
data.data: ruta opcional para datos adicionales de preentrenamientodata.eval_instruct_data: ruta opcional para datos de evaluación por instruccioneseval_freq,no_eval,ckpt_freq: controlan la frecuencia de evaluación, evaluación intermedia y guardado de checkpointssave_adapters: decide si guardar solo checkpoints de LoRA o fusionar LoRA con el modelo base y guardar el modelo completosave_adapters=Falserequiere suficiente memoria de CPU y GPU para guardar el modelo completo en un solo proceso, y normalmente solo es viable con modelos 7B
Inferencia y Weights & Biases
- Para la inferencia con el modelo entrenado se recomienda usar mistral-inference
- Puede instalarse con
pip install mistral_inference - Al ejecutar
mistral-chat, se pueden usar los pesos LoRA indicando en--lora_pathla ruta guardada delora.safetensors - Incluye soporte para Weights and Biases para monitorear métricas y experimentos de entrenamiento
- Se instala con
pip install wandb - Se recomienda proporcionar la API key mediante la variable de entorno
WANDB_API_KEY - Por seguridad, la API key no se lee desde la configuración YAML
- La pérdida de entrenamiento, pérdida de evaluación, tasa de aprendizaje y otros datos se registran y visualizan en el dashboard del proyecto en wandb
- Se instala con
- Para más detalles de uso se puede consultar la documentación de Weights and Biases
Escalado de modelos y FAQ
- Solo pueden ajustarse modelos Mistral compatibles con el tokenizer v3
- Los modelos compatibles deben tener un vocabulario de 32768, no de 32000
- Los modelos anteriores con vocabulario 32000 pueden ampliarse a 32768 con
utils.extend_model_vocab - El ajuste fino de modelos MoE presenta una mayor variación de rendimiento
- Se sugiere ejecutar varias veces el mismo ajuste fino MoE con distintas seeds y elegir el mejor resultado
- Esta alta variación no se observó en modelos densos
- La cantidad de tokens usada en entrenamiento puede verificarse pasando el archivo YAML de entrenamiento a utils.validate_data.py
- Si aparece un error de CUDA out-of-memory, se puede reducir el tamaño del batch por GPU
- El tamaño del batch es
seq_len x batch_size - Se sugiere configurar
batch_sizeen 1 y reducirseq_len
- El tamaño del batch es
- La librería se ofrece bajo Apache 2.0 License
- Esta librería o estos modelos no deben usarse de formas que infrinjan, faciliten o violen derechos, incluidos derechos de propiedad intelectual de terceros
1 comentarios
Opiniones de Hacker News
Con lo rápido que avanzan los modelos, ¿la afinación fina todavía tiene valor? Me dan curiosidad los casos de uso reales.
Por ejemplo, el año pasado Bloomberg entrenó un LLM de nivel GPT-3.5 con datos financieros, pero poco después GPT-4-8k lo superó en casi todas las tareas financieras.
Al final, terminamos enfocándonos en datos de evaluación de alta calidad y en una arquitectura que permita cambiar fácilmente a modelos nuevos.
Los LLM nunca han visto esas anotaciones, los LLM que no son en inglés tampoco son la máxima prioridad de las empresas, y por privacidad de datos solo se pueden usar modelos offline-first.
En una situación así, afinar finamente un modelo de lenguaje de propósito general encaja muy bien.
Si lo afinas con mensajes ya formateados, el modelo genera automáticamente ese formato, así que puedes ahorrar muchos tokens que, de otro modo, usarías en cada prompt para explicar el formato de salida.
Sin embargo, la afinación fina cierra bastante la brecha entre ambos.
Es un ámbito estrecho, pero lo mismo pasa con gran parte de la programación. Si el objetivo es hacer que un LLM de propósito general se incline más hacia tus datos, probablemente la afinación fina no sea muy relevante.
Pero si estás tratando de resolver un problema muy específico y a la vez ambiguo, y el LLM solo resuelve una parte, es muy probable que la afinación fina sea la mejor opción.
Si tu app tiene muchas funciones personalizadas que interactúan con herramientas, quizá prefieras la afinación fina en lugar de gastar tokens de contexto.
¿Qué GPU se necesita para hacer esto? Tengo una 3060 Ti versión laptop, i9 y 16 GB de RAM.
No tengo cuota en AWS ni GCP, y he oído hablar de Paperspace, pero quiero empezar rápido con la afinación fina de Mistral porque planeo usar algunos modelos de Mistral en un proyecto de cliente en el que estoy trabajando.
Una GPU gamer puede disipar 300 W de calor sin problemas, pero si una GPU de laptop hiciera eso se derretiría, así que probablemente esté limitada a alrededor de 100 W.
La disipación de calor es directamente proporcional a la velocidad.
Además, en una desktop puedes actualizar a una GPU más rápida o usar varias GPU.
Eso sí, especialmente las configuraciones multi-GPU son ruidosas y generan tanto calor que pueden calentar una habitación en poco tiempo.
Si en los próximos años no vas a tener la GPU a carga completa más del 10% del tiempo, probablemente la nube sea más barata.
Resume los requisitos de hardware por modelo, y puedes elegir la VRAM y la memoria del sistema para filtrar los modelos disponibles.
En nuestra empresa hemos estado afinando finamente Mistral y Llama 3 con las RTX4000 que tienen ahí.
Es algo limitado porque solo tiene 20 GB de RAM, pero para cantidades mayores de tokens de entrada ayudó reducir el nivel de cuantización.
Ahora también ofrecen renta por hora.
Lo estamos usando en mi empresa y hemos visto resultados bastante buenos.
Me parece muy interesante ver qué herramientas se volverán el estándar de facto para cada caso de uso común de LLM.
El ecosistema está tan fragmentado que siento que ni siquiera he oído hablar de la mayoría de las herramientas.
Hace unos días vi Olive de Microsoft y era una herramienta completamente nueva para mí.
Ahora que muchos LLM open source ya llegaron a un nivel “usable”, lo importante es facilitar el desarrollo a su alrededor.
En especial, las personas que son usuarias y desarrolladoras deben poder aprovechar datos privados, más precisamente datos que no estaban en el preentrenamiento del modelo.
El repositorio dice que está optimizado para modelos grandes y que requiere A100/H100, pero aun así siento que esto podría beneficiar más a los modelos pequeños que a los grandes.
Se puede extender el “si lo construyes, vendrán” a “si das herramientas, la gente construirá”.
La parte de los pesos es interesante.
El SFTTrainer de HuggingFace permite, si quieres, entrenar solo la parte de la respuesta, pero aunque eso parezca natural para los humanos, por lo general a los LLM les va mejor entrenando para predecir toda la entrada.
Con este enfoque se puede obtener lo mejor de ambos mundos.
¿Se podría optimizar para poder entrenar variantes más grandes con dos 3090 o dos 4090?
Un punto de partida que cubre varias opciones está aquí: https://huggingface.co/blog/trl-peft
¿Cómo podría entrenar mi modelo de chats de WhatsApp?
¿Quieres entrenar un modelo con tus mensajes de WhatsApp? ¿Con qué objetivo? Depende de si quieres que escriba como tú o si buscas hacer preguntas y respuestas basadas en RAG.