Saltar al contenido principal
InicioTutorialesInteligencia Artificial (IA)

Tutorial Mistral 7B: Guía paso a paso para utilizar y ajustar Mistral 7B

El tutorial cubre el acceso, la cuantización, el ajuste fino, la fusión y el almacenamiento de este potente modelo lingüístico de código abierto con 7300 millones de parámetros.
mar 2024  · 12 min leer

En este tutorial, obtendrás una visión general de cómo utilizar y ajustar el modelo Mistral 7B para mejorar tus proyectos de procesamiento de lenguaje natural. Aprenderás a cargar el modelo en Kaggle, ejecutar la inferencia, cuantizar, ajustar, fusionarlo y enviar el modelo a Hugging Face Hub.

Comprender Mistral 7B

Mistral 7B es un nuevo modelo lingüístico de 7300 millones de parámetros que representa un gran avance en las capacidades de los grandes modelos lingüísticos (LLM). Ha superado al modelo Llama 2 de 13 000 millones de parámetros en todas las tareas y supera a Llama 1 de 34 000 millones de parámetros en muchas comparativas.

Sorprendentemente, Mistral 7B se aproxima al rendimiento de CodeLlama 7B en tareas de código sin dejar de ser muy capaz en tareas de lengua inglesa. Este rendimiento equilibrado se consigue mediante dos mecanismos clave. En primer lugar, Mistral 7B utiliza Grouped-query Attention (GQA), que permite tiempos de inferencia más rápidos en comparación con la atención plena estándar. En segundo lugar, Sliding Window Attention (SWA) proporciona a Mistral 7B la capacidad de manejar secuencias de texto más largas con un bajo coste.

Tanto el código como las distintas versiones de los modelos se publican con licencia Apache 2.0, lo que permite su uso sin restricciones. Puedes obtener más información sobre la arquitectura del modelo, el rendimiento y el ajuste fino de las instrucciones leyendo el documento de investigación Mistral 7B (arxiv.org).

Acceso a Mistral 7B

Podemos acceder a Mistral 7B en HuggingFace, Vertex AI, Replicate, Sagemaker Jumpstart y Baseten.

También hay una nueva y mejor forma de acceder al modelo a través de la nueva función de Kaggle llamada Models. Significa que no tienes que descargar el modelo o el conjunto de datos: puedes iniciar la inferencia o el ajuste fino en un par de minutos.

En esta sección, aprenderemos a cargar el modelo Kaggle y a ejecutar la inferencia en pocos minutos.

Antes de empezar, tenemos que actualizar las bibliotecas esenciales para evitar el error KeyError: 'mistral.

!pip install -q -U transformers
!pip install -q -U accelerate
!pip install -q -U bitsandbytes

Después, crearemos una cuantización de 4 bits con una configuración de tipo NF4 utilizando BitsAndBytes para cargar nuestro modelo con una precisión de 4 bits. Nos ayudará a cargar el modelo más rápidamente y a reducir la huella de memoria para que pueda ejecutarse en Google Colab o en GPU de consumo.

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, pipeline
import torch

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
)

Ahora aprenderemos a añadir el modelo Mistral 7B a nuestro Kaggle Notebook.

Imagen de Mistral | Kaggle

Imagen de Mistral | Kaggle

  1. Haz clic en el botón "+Add Models" del panel lateral derecho.
  2. Busca tu modelo y haz clic en el botón Plus para añadirlo.
  3. Selecciona la variación correcta "7b-v0.1-hf" y la versión.
  4. Después, copia la ruta del directorio y añádela a tu cuaderno.

image8.png

Ahora cargaremos el modelo y el tokenizador utilizando la biblioteca Transformers.

model_name = "/kaggle/input/mistral/pytorch/7b-v0.1-hf/1"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
        model_name,
        load_in_4bit=True,
        quantization_config=bnb_config,
        torch_dtype=torch.bfloat16,
        device_map="auto",
        trust_remote_code=True,
    )

Para facilitarnos la vida, utilizaremos la función pipeline de la biblioteca Transformers para generar la respuesta en función del prompt.

pipe = pipeline(
    "text-generation", 
    model=model, 
    tokenizer = tokenizer, 
    torch_dtype=torch.bfloat16, 
    device_map="auto"
)

A continuación, proporcionaremos el prompt al objeto pipeline y estableceremos parámetros adicionales para crear el máximo número de tokens y mejorar nuestra respuesta.

prompt = "As a data scientist, can you explain the concept of regularization in machine learning?"

sequences = pipe(
    prompt,
    do_sample=True,
    max_new_tokens=100, 
    temperature=0.7, 
    top_k=50, 
    top_p=0.95,
    num_return_sequences=1,
)
print(sequences[0]['generated_text'])

Como podemos ver, Mistral 7B ha generado resultados adecuados que explican el proceso de regularización en machine learning.

As a data scientist, can you explain the concept of regularization in machine learning?

Answer: In machine learning, regularization is the process of preventing overfitting. Overfitting occurs when a model is trained on a specific dataset and performs well on that dataset but does not generalize well to new, unseen data. Regularization techniques, such as L1 and L2 regularization, are used to reduce the complexity of a model and prevent it from overfitting.

Puedes duplicar y ejecutar el código utilizando el cuaderno de inferencia de 4 bits de Mistral 7B en Kaggle.

Nota: Kaggle proporciona suficiente memoria GPU para que cargues el modelo sin cuantización de 4 bits. Puedes seguir el cuaderno Simple Inference de Mistral 7B para aprender cómo se hace.

Ajuste fino de Mistral 7B

En esta sección, seguiremos pasos similares a los de la guía Ajuste fino de LLaMA 2: Guía paso a paso para personalizar el modelo de lenguaje grande para ajustar el modelo Mistral 7B con nuestro conjunto de datos favorito, guanaco-llama2-1k. También puedes leer la guía para aprender sobre PEFT, cuantización de 4 bits, QLoRA y SFT.

Configuración

Actualizaremos e instalaremos las bibliotecas Python necesarias.

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U peft
%pip install -U accelerate
%pip install -U trl

Después, cargaremos los módulos necesarios para un ajuste fino eficaz del modelo.

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig,HfArgumentParser,TrainingArguments,pipeline, logging
from peft import LoraConfig, PeftModel, prepare_model_for_kbit_training, get_peft_model
import os,torch, wandb
from datasets import load_dataset
from trl import SFTTrainer

Ten en cuenta que utilizamos Kaggle Notebook para ajustar nuestro modelo. Almacenaremos de forma segura las claves API haciendo clic en el botón "Add-ons" y seleccionando la opción "Secret". Para acceder a la API en un cuaderno, copiaremos y ejecutaremos el fragmento de código como se muestra a continuación.

image14.png

En nuestro caso, guardaremos las claves API de Hugging Face y Weights and Biases y accederemos a ellas en Kaggle Notebook.

from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
secret_hf = user_secrets.get_secret("HUGGINGFACE_TOKEN")
secret_wandb = user_secrets.get_secret("wandb")

Utilizaremos la API de Hugging Face para guardar el modelo y enviarlo a Hugging Face Hub.

!huggingface-cli login --token $secret_hf

Para controlar el rendimiento del LLM, inicializaremos los experimentos de Weights and Biases mediante la API.

wandb.login(key = secret_wandb)
run = wandb.init(
    project='Fine tuning mistral 7B', 
    job_type="training", 
    anonymous="allow"
)

En esta sección, estableceremos el modelo base, el conjunto de datos y el nombre del nuevo modelo. El nombre del nuevo modelo se utilizará para guardar un modelo ajustado.

Nota: Si utilizas la versión gratuita de Colab, debes cargar la versión sharded del modelo (someone13574/Mistral-7B-v0.1-sharded).

También puedes cargar el modelo desde Hugging Face Hub utilizando el nombre del modelo base: mistralai/Mistral-7B-v0.1

base_model = "/kaggle/input/mistral/pytorch/7b-v0.1-hf/1"
dataset_name = "mlabonne/guanaco-llama2-1k"
new_model = "mistral_7b_guanaco"

Carga de datos

Ahora cargaremos el conjunto de datos desde Hugging Face Hub y visualizaremos la fila 100.

#Importing the dataset
dataset = load_dataset(dataset_name, split="train")
dataset["text"][100]

image19.png

Carga del modelo Mistral 7B

Ahora cargaremos un modelo utilizando la precisión de 4 bits de Kaggle para un entrenamiento más rápido. Este paso es necesario si quieres cargar y ajustar el modelo en una GPU de consumo.

bnb_config = BitsAndBytesConfig(  
    load_in_4bit= True,
    bnb_4bit_quant_type= "nf4",
    bnb_4bit_compute_dtype= torch.bfloat16,
    bnb_4bit_use_double_quant= False,
)
model = AutoModelForCausalLM.from_pretrained(
        base_model,
        load_in_4bit=True,
        quantization_config=bnb_config,
        torch_dtype=torch.bfloat16,
        device_map="auto",
        trust_remote_code=True,
)
model.config.use_cache = False # silence the warnings
model.config.pretraining_tp = 1
model.gradient_checkpointing_enable()

Carga del tokenizador

A continuación, cargaremos el tokenizador y lo configuraremos para solucionar el problema con fp16.

tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.padding_side = 'right'
tokenizer.pad_token = tokenizer.eos_token
tokenizer.add_eos_token = True
tokenizer.add_bos_token, tokenizer.add_eos_token

Adición del adoptante a la capa

En el siguiente paso, incluiremos una capa de adoptante en nuestro modelo. Esto nos permitirá ajustar el modelo utilizando un número reducido de parámetros, lo que hace todo el proceso más rápido y más eficiente en cuanto a memoria. Para conocer mejor los parámetros, puedes consultar la documentación oficial de PEFT.

model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj","gate_proj"]
)
model = get_peft_model(model, peft_config)

Hiperparámetros

Es crucial establecer los hiperparámetros adecuados. Puedes informarte sobre cada hiperparámetro leyendo el tutorial Ajuste fino de LLaMA 2.

training_arguments = TrainingArguments(
    output_dir="./results",
    num_train_epochs=1,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=1,
    optim="paged_adamw_32bit",
    save_steps=25,
    logging_steps=25,
    learning_rate=2e-4,
    weight_decay=0.001,
    fp16=False,
    bf16=False,
    max_grad_norm=0.3,
    max_steps=-1,
    warmup_ratio=0.03,
    group_by_length=True,
    lr_scheduler_type="constant",
    report_to="wandb"
)

Parámetros SFT

La biblioteca TRL de HuggingFace ofrece una API fácil de usar que permite crear y entrenar modelos Supervised fine-tuning (SFT) en tu conjunto de datos con una programación mínima. Proporcionaremos a SFT Trainer los componentes necesarios, como el modelo, el conjunto de datos, la configuración de Lora, el tokenizador y los parámetros de entrenamiento.

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_config,
    max_seq_length= None,
    dataset_text_field="text",
    tokenizer=tokenizer,
    args=training_arguments,
    packing= False,
)

Entrenamiento del modelo

Después de configurarlo todo, entrenaremos nuestro modelo.

trainer.train()

image5.png

Ten en cuenta que estás utilizando la versión T4 x2 de la GPU, lo que puede reducir el tiempo de entrenamiento a 1 hora y 30 minutos.

image10.png

Almacenamiento del modelo ajustado

Por último, guardaremos un adoptante preentrenado y finalizaremos la ejecución de W&B.

trainer.model.save_pretrained(new_model)
wandb.finish()
model.config.use_cache = True

image4.png

Podemos cargar fácilmente nuestro modelo a Hugging Face Hub con una sola línea de código, lo que nos permite acceder a él desde cualquier equipo.

trainer.model.push_to_hub(new_model, use_temp_dir=False)

image7.png

Evaluación del modelo

Puedes ver las métricas del sistema y el rendimiento del modelo en wandb.ai, en recent run.

Imagen de wandb.ai

Imagen de wandb.ai

Para realizar la inferencia del modelo, tenemos que proporcionar los objetos modelo y tokenizador al pipeline. A continuación, podemos proporcionar el prompt en estilo conjunto de datos al objeto pipeline.

logging.set_verbosity(logging.CRITICAL)

prompt = "How do I find true love?"
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

image17.png

Vamos a generar la respuesta para otro prompt.

prompt = "What is Datacamp Career track?"
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

Parece que estamos obteniendo respuestas perfectas a nuestras sencillas preguntas.

image12.png

Enlaces importantes para Mistral 7B:

Imagen de ajuste fino de QLoRA 4bit de Mistral 7B | Kaggle

Enlaces importantes para Instrucciones de Mistral 7B:

Modelo ajustado de instrucciones de Mistral 7BImagen de ajuste fino de QLoRA 4bit de Mistral 7B | Kaggle

Fusión del adoptante

En esta sección, cargaremos el modelo base y adjuntaremos el adaptador mediante PeftModel, ejecutaremos la inferencia, fusionaremos los pesos del modelo y lo enviaremos al Hugging Face Hub.

from transformers import AutoModelForCausalLM, AutoTokenizer,pipeline 
from peft import PeftModel
import torch

Cargar modelo base con adoptante

En primer lugar, cargaremos de nuevo el modelo base y el adaptador ajustado utilizando peft. La función que aparece a continuación adjuntará el adaptador al modelo base.

base_model_reload = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        device_map="auto",
        trust_remote_code=True,
)

model = PeftModel.from_pretrained(base_model_reload, new_model)

Cargar de nuevo tokenizador

Carga el tokenizador del modelo base y soluciona el problema con fp16.

tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

Inferencia

Crea un pipeline de inferencia con el tokenizador y el modelo.

pipe = pipeline(
    "text-generation", 
    model=model, 
    tokenizer = tokenizer, 
    torch_dtype=torch.bfloat16, 
    device_map="auto"
)

Proporciona el prompt y ejecuta el pipeline para generar la respuesta.

prompt = "How become a DataCamp certified data professional"

sequences = pipe(
    f"<s>[INST] {prompt} [/INST]",
    do_sample=True,
    max_new_tokens=100, 
    temperature=0.7, 
    top_k=50, 
    top_p=0.95,
    num_return_sequences=1,
)
print(sequences[0]['generated_text'])

image15.png

Envío del modelo ajustado

Ahora fusionaremos el adoptante con el modelo base para que puedas utilizar directamente el modelo ajustado, como el modelo original de Mistral 7B, y ejecutar la inferencia. Para ello, utilizaremos la función merge_and_unload.

Después de fusionar el modelo, enviaremos tanto el tokenizador como el modelo a Hugging Face Hub. También puedes seguir el Kaggle Notebook si estás atascado en algún sitio.

model = model.merge_and_unload()

model.push_to_hub(new_model, use_temp_dir=False)
tokenizer.push_to_hub(new_model, use_temp_dir=False)

Imagen de kingabzpro/mistral_7b_guanaco

Imagen de kingabzpro/mistral_7b_guanaco

Como puedes ver, en lugar de solo un adaptador, ahora tenemos un modelo completo con un tamaño de 13,98 GB.

image2.png

Imagen de kingabzpro/mistral_7b_guanaco

Acceso al modelo ajustado

Para mostrar que podemos cargar y ejecutar la inferencia sin la ayuda del modelo base, cargaremos el modelo ajustado desde Hugging Face Hub y ejecutaremos la inferencia.

from transformers import pipeline


pipe = pipeline(
    "text-generation", 
    model = "kingabzpro/mistral_7b_guanaco",
    device_map="auto"
)

prompt = "How do I become a data engineer in 6 months?"

sequences = pipe(
    f"<s>[INST] {prompt} [/INST]",
    do_sample=True,
    max_new_tokens=200, 
    temperature=0.7, 
    top_k=50, 
    top_p=0.95,
    num_return_sequences=1,)

print(sequences[0]['generated_text'])

image11.png

Conclusión

Mistral 7B es un emocionante avance en las capacidades de los grandes modelos lingüísticos. Gracias a innovaciones como Grouped-query Attention y Sliding Window Attention, consigue un rendimiento de vanguardia sin dejar de ser lo suficientemente eficiente como para implementarse.

En este tutorial, hemos aprendido a acceder al modelo de Mistral 7B en Kaggle. Además, hemos aprendido a ajustar el modelo con un pequeño conjunto de datos y a fusionar el adoptante con el modelo base.

Esta guía es un recurso completo tanto para los entusiastas del machine learning como para los principiantes que quieran experimentar y entrenar el gran modelo de lenguaje en GPU de consumo.

Si eres nuevo en los modelos lingüísticos de gran tamaño, te recomendamos que sigas el curso Dominar los conceptos de los LLM. Para los interesados en iniciar una carrera en inteligencia artificial, matricularse en el programa de habilidades Fundamentos de la IA es un gran primer paso.

Recursos

Temas

¡Comienza hoy tu viaje de aprendizaje de LLM!

Course

Introduction to ChatGPT

1 hr
196.2K
Learn how to use ChatGPT. Discover best practices for writing prompts and explore common business use cases for the powerful AI tool.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

tutorial

Ajuste fino de LLaMA 2: Guía paso a paso para personalizar el modelo de lenguaje grande

Aprende a ajustar Llama-2 en Colab utilizando nuevas técnicas para superar las limitaciones de memoria y computación y hacer más accesibles los grandes modelos lingüísticos de código abierto.
Abid Ali Awan's photo

Abid Ali Awan

12 min

tutorial

Tutorial FLAN-T5: Guía y puesta a punto

Una guía completa para afinar un modelo FLAN-T5 para una tarea de respuesta a preguntas utilizando la biblioteca de transformadores, y ejecutando la inferencia optmizada en un escenario del mundo real.
Zoumana Keita 's photo

Zoumana Keita

15 min

tutorial

Tutorial de Llama.cpp: Guía completa para la inferencia e implementación eficientes de LLM

Esta completa guía sobre Llama.cpp le guiará a través de los aspectos esenciales de la configuración de su entorno de desarrollo, la comprensión de sus funcionalidades básicas, y el aprovechamiento de sus capacidades para resolver casos de uso del mundo real.
Zoumana Keita 's photo

Zoumana Keita

11 min

tutorial

Guía introductoria para perfeccionar los LLM

La puesta a punto de grandes modelos lingüísticos (LLM) ha revolucionado el Procesamiento del Lenguaje Natural (PLN), ofreciendo capacidades sin precedentes en tareas como la traducción de idiomas, el análisis de sentimientos y la generación de textos. Este enfoque transformador aprovecha modelos preentrenados como GPT-2, mejorando su rendimiento en dominios específicos mediante el proceso de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

12 min

tutorial

Tutorial de la API de OpenAI Assistants

Una visión completa de la API Assistants con nuestro artículo, que ofrece una mirada en profundidad a sus características, usos en la industria, guía de configuración y las mejores prácticas para maximizar su potencial en diversas aplicaciones empresariales.
Zoumana Keita 's photo

Zoumana Keita

14 min

tutorial

Guía para principiantes sobre el uso de la API ChatGPT

Esta guía te acompanya a través de los fundamentos de la API ChatGPT, demostrando su potencial en el procesamiento del lenguaje natural y la comunicación impulsada por la IA.
Moez Ali's photo

Moez Ali

11 min

See MoreSee More