Guía de Fine-tuning con Mistral API
En esta lección, exploraremos cómo realizar fine-tuning de modelos de lenguaje utilizando la API de Mistral. El fine-tuning es una técnica poderosa que te permite adaptar un modelo pre-entrenado a tus datos específicos, mejorando su rendimiento en tareas particulares y haciéndolo más relevante para tus necesidades. Aprenderás el flujo completo, desde la preparación del conjunto de datos hasta la creación del trabajo de fine-tuning y el uso del modelo resultante. Esto es útil para desarrollar aplicaciones con modelos más precisos y personalizados.
Consulta la documentación: https://docs.mistral.ai/capabilities/finetuning/
!pip install mistralai pandas
Este fragmento de código importa las bibliotecas necesarias para la manipulación de datos y la interacción con la API de Mistral. Asegúrate de tener instaladas las bibliotecas pandas, datasets y mistralai.
Prepara el conjunto de datos
En este ejemplo, usaremos el conjunto de datos ultrachat_200k. Cargaremos un fragmento de los datos en Pandas Dataframes, dividiremos los datos en conjuntos de entrenamiento y validación, y guardaremos los datos en el formato jsonl requerido para el fine-tuning.
import pandas as pd
df = pd.read_parquet('https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k/resolve/main/data/test_gen-00000-of-00001-3d4cd8309148a71f.parquet')
df_train=df.sample(frac=0.995,random_state=200)
df_eval=df.drop(df_train.index)
df_train.to_json("ultrachat_chunk_train.jsonl", orient="records", lines=True)
df_eval.to_json("ultrachat_chunk_eval.jsonl", orient="records", lines=True)
Aquí cargamos el conjunto de datos ultrachat_200k desde la biblioteca datasets y seleccionamos una porción para trabajar. Esto es útil para experimentar sin tener que procesar el conjunto de datos completo, que puede ser muy grande.
!ls -lh
Este código convierte el conjunto de datos cargado en un DataFrame de Pandas, lo que facilita la manipulación y el procesamiento de los datos. Luego, se divide el DataFrame en conjuntos de entrenamiento y validación, un paso crucial para evaluar el rendimiento del modelo de manera imparcial.
total 147M
-rw-r--r-- 1 root root 3.4K Jul 19 15:44 reformat_data.py
drwxr-xr-x 1 root root 4.0K Jul 17 13:24 sample_data
-rw-r--r-- 1 root root 698K Jul 19 16:05 ultrachat_chunk_eval.jsonl
-rw-r--r-- 1 root root 146M Jul 19 16:05 ultrachat_chunk_train.jsonl
Finalmente, guardamos los conjuntos de datos de entrenamiento y validación en formato JSON Lines (.jsonl). Este formato es el que espera la API de Mistral para los trabajos de fine-tuning. Cada línea en el archivo .jsonl representa un ejemplo de entrenamiento.
Reforma el conjunto de datos
Si subes este ultrachat_chunk_train.jsonl a la API de Mistral, podrías encontrar un mensaje de error "Invalid file format" debido a problemas de formato de datos. Para reformatear los datos al formato correcto, puedes descargar el script reformat_dataset.py y usarlo para validar y reformatear tanto los datos de entrenamiento como los de evaluación:
# download the validation and reformat script
!wget https://raw.githubusercontent.com/mistralai/mistral-finetune/main/utils/reformat_data.py
Este comando descarga el script reformat_dataset.py, que es esencial para asegurar que tus datos cumplan con las especificaciones exactas de la API de Mistral. Un formato incorrecto es una causa común de errores al subir conjuntos de datos.
--2024-07-19 16:05:15-- https://raw.githubusercontent.com/mistralai/mistral-finetune/main/utils/reformat_data.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3381 (3.3K) [text/plain]
Saving to: ‘reformat_data.py.1’
reformat_data.py.1 100%[===================>] 3.30K --.-KB/s in 0s
2024-07-19 16:05:16 (42.2 MB/s) - ‘reformat_data.py.1’ saved [3381/3381]
Aquí se ejecuta el script reformat_dataset.py para procesar el archivo de entrenamiento. El script valida la estructura de los datos y los ajusta al formato esperado por la API de Mistral, creando un nuevo archivo con el prefijo reformatted_.
# validate and reformat the training data
!python reformat_data.py ultrachat_chunk_train.jsonl
De manera similar, este comando reforma el conjunto de datos de validación. Es importante aplicar el mismo proceso de reformateo a ambos conjuntos para mantener la consistencia y evitar errores durante el fine-tuning.
Skipped 3674th sample
Skipped 9176th sample
Skipped 10559th sample
Skipped 13293th sample
Skipped 13973th sample
Skipped 15219th sample
Este código muestra el contenido de los primeros ejemplos del archivo de entrenamiento reformateado. Es una buena práctica inspeccionar los datos después de cualquier transformación para verificar que el formato sea el esperado y que los datos se vean correctos.
# validate the reformat the eval data
!python reformat_data.py ultrachat_chunk_eval.jsonl
De la misma forma, inspeccionamos los primeros ejemplos del archivo de validación reformateado. Esto te permite confirmar que ambos conjuntos de datos están listos para ser subidos a la API de Mistral.
df_train.iloc[3674]['messages']
Este comando elimina los archivos .jsonl originales que no estaban correctamente formateados. Una vez que tienes los archivos reformateados, los originales ya no son necesarios y eliminarlos ayuda a mantener tu espacio de trabajo limpio.
array([{'content': 'What are the dimensions of the cavity, product, and shipping box of the Sharp SMC1662DS microwave?: With innovative features like preset controls, Sensor Cooking and the Carousel® turntable system, the Sharp® SMC1662DS 1.6 cu. Ft. Stainless Steel Carousel Countertop Microwave makes reheating your favorite foods, snacks and beverages easier than ever. Use popcorn and beverage settings for one-touch cooking. Express Cook allows one-touch cooking up to six minutes. The convenient and flexible "+30 Sec" key works as both instant start option and allows you to add more time during cooking.\nThe Sharp SMC1662DS microwave is a bold design statement in any kitchen. The elegant, grey interior and bright white, LED interior lighting complements the stainless steel finish of this premium appliance.\nCavity Dimensions (w x h x d): 15.5" x 10.2" x 17.1"\nProduct Dimensions (w x h x d): 21.8" x 12.8" x 17.7"\nShipping Dimensions (w x h x d) : 24.4" x 15.0" x 20.5"', 'role': 'user'},
{'content': '', 'role': 'assistant'},
{'content': 'Can you help me find out the weight of the Sharp SMC1662DS microwave?', 'role': 'user'},
{'content': 'Yes, the weight of the Sharp SMC1662DS microwave is 36.4 pounds.', 'role': 'assistant'},
{'content': 'Can you tell me if the Sharp SMC1662DS microwave comes with a warranty?', 'role': 'user'},
{'content': 'Yes, the Sharp SMC1662DS microwave comes with a warranty. It has a 1-year limited warranty on parts and labor, a 4-year limited warranty on the magnetron tube, and an 8-year limited warranty on the magnetron tube for certain models. You should check the warranty details provided in the manual for complete information.', 'role': 'assistant'},
{'content': 'Can you remind me of the innovative features of the Sharp SMC1662DS microwave?', 'role': 'user'}],
dtype=object)
Finalmente, renombramos los archivos reformateados para que tengan los nombres originales, pero con el formato correcto. Esto simplifica los pasos posteriores, ya que los nombres de archivo serán los esperados por el resto del flujo de trabajo.
Sube el conjunto de datos
Antes de crear un trabajo de fine-tuning, necesitas subir tus conjuntos de datos de entrenamiento y validación a la plataforma de Mistral. Esto se hace a través de la API.
from mistralai.client import Mistral
import os
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
ultrachat_chunk_train = client.files.upload(file={
"file_name": "ultrachat_chunk_train.jsonl",
"content": open("ultrachat_chunk_train.jsonl", "rb"),
})
ultrachat_chunk_eval = client.files.upload(file={
"file_name": "ultrachat_chunk_eval.jsonl",
"content": open("ultrachat_chunk_eval.jsonl", "rb"),
})
Este código inicializa el cliente de la API de Mistral. Asegúrate de haber configurado tu clave de API de Mistral como una variable de entorno (MISTRAL_API_KEY) para que el cliente pueda autenticarse correctamente.
import json
def pprint(obj):
print(json.dumps(obj.dict(), indent=4))
Aquí se sube el archivo de entrenamiento reformateado a la API de Mistral. La API devuelve un objeto training_file que contiene información sobre el archivo subido, incluyendo su ID, que será necesario para crear el trabajo de fine-tuning.
pprint(ultrachat_chunk_train)
Este comando imprime el objeto training_file, permitiéndote verificar que la subida fue exitosa y obtener el ID del archivo. Es crucial tener este ID para el siguiente paso.
{
"id": "da7305f6-d649-4fe2-8132-d6f17c7c8141",
"object": "file",
"bytes": 121379382,
"created_at": 1721405142,
"filename": "ultrachat_chunk_train.jsonl",
"sample_type": "instruct",
"source": "upload",
"purpose": null,
"num_lines": 28156
}
De manera similar, subimos el archivo de validación. Es importante subir ambos conjuntos de datos, ya que el conjunto de validación se utiliza para monitorear el progreso del fine-tuning y prevenir el sobreajuste.
pprint(ultrachat_chunk_eval)
Imprimimos el objeto validation_file para confirmar su subida y obtener su ID. Ambos IDs, el de entrenamiento y el de validación, son fundamentales para la creación del trabajo de fine-tuning.
{
"id": "f33adf06-8d79-420f-8722-d988cd60fbd6",
"object": "file",
"bytes": 596255,
"created_at": 1721405143,
"filename": "ultrachat_chunk_eval.jsonl",
"sample_type": "instruct",
"source": "upload",
"purpose": null,
"num_lines": 142
}
Este código muestra una lista de todos los archivos que has subido a la API de Mistral. Es útil para verificar que todos tus archivos están presentes y para gestionar tus recursos.
Crea un trabajo de fine-tuning
Una vez que tus conjuntos de datos están subidos, puedes crear un trabajo de fine-tuning. Esto le indica a la API de Mistral qué modelo base usar, qué datos de entrenamiento y validación aplicar, y otros parámetros importantes.
created_jobs = client.fine_tuning.jobs.create(
model="open-mistral-7b",
training_files=[{"file_id": ultrachat_chunk_train.id, "weight": 1}],
validation_files=[ultrachat_chunk_eval.id],
hyperparameters={
"training_steps": 10,
"learning_rate":0.0001
},
auto_start=True
)
created_jobs
Este comando crea el trabajo de fine-tuning. Especificas el modelo base (por ejemplo, mistral-tiny), el ID del archivo de entrenamiento y el ID del archivo de validación. También puedes establecer un nombre para el trabajo para facilitar su identificación.
JobOut(id='20178c3c-d75b-428e-b20d-7d39aa2b7468', auto_start=True, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=None, fim_ratio=None), model='open-mistral-7b', status='QUEUED', job_type='FT', created_at=1721405548, modified_at=1721405548, training_files=['ec5af16a-77fe-4e14-ad09-47ead2848ce6'], validation_files=['d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4'], OBJECT='job', fine_tuned_model=None, suffix=None, integrations=[], trained_tokens=None, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=None, cost=None, cost_currency=None, train_tokens_per_step=None, train_tokens=None, data_tokens=None, estimated_start_time=None))
Imprimimos el objeto fine_tuning_job, que contiene todos los detalles del trabajo que acabas de crear, incluyendo su ID y su estado inicial. El estado debería ser "QUEUED" o "RUNNING" si todo está bien.
pprint(created_jobs)
Este código recupera los detalles de un trabajo de fine-tuning específico utilizando su ID. Es útil para verificar el estado actual del trabajo y obtener información actualizada sobre su progreso.
{
"id": "2c002adb-12be-4a5d-a3ef-baacf9025be9",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": null,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "QUEUED",
"job_type": "FT",
"created_at": 1721405164,
"modified_at": 1721405164,
"training_files": [
"da7305f6-d649-4fe2-8132-d6f17c7c8141"
],
"validation_files": [
"f33adf06-8d79-420f-8722-d988cd60fbd6"
],
"fine_tuned_model": null,
"suffix": null,
"integrations": [],
"trained_tokens": null,
"repositories": [],
"metadata": {
"expected_duration_seconds": null,
"cost": null,
"cost_currency": null,
"train_tokens_per_step": null,
"train_tokens": null,
"data_tokens": null,
"estimated_start_time": null
}
}
Imprimimos el objeto retrieved_job para ver el estado y los detalles actualizados del trabajo. Durante el fine-tuning, el estado cambiará de "RUNNING" a "SUCCEEDED" o "FAILED".
jobs = client.fine_tuning.jobs.list()
print(jobs)
Este comando lista todos los trabajos de fine-tuning que has creado. Es útil para tener una visión general de tus trabajos activos e históricos.
total=32 data=[JobOut(id='20178c3c-d75b-428e-b20d-7d39aa2b7468', auto_start=True, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=0.0431941570306258, fim_ratio=None), model='open-mistral-7b', status='RUNNING', job_type='FT', created_at=1721405548, modified_at=1721405549, training_files=['ec5af16a-77fe-4e14-ad09-47ead2848ce6'], validation_files=['d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4'], OBJECT='job', fine_tuned_model=None, suffix=None, integrations=[], trained_tokens=None, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=120, cost=2.6214, cost_currency='USD', train_tokens_per_step=131072, train_tokens=1310720, data_tokens=30344845, estimated_start_time=None)), JobOut(id='98cbe43b-61e5-47a8-a5fb-57f6d82abc0a', auto_start=True, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=0.0431941570306258, fim_ratio=None), model='open-mistral-7b', status='RUNNING', job_type='FT', created_at=1721405463, modified_at=1721405466, training_files=['71664e51-eae4-4c5b-9007-2c4586265609'], validation_files=['6c09517c-32d9-465c-8e4b-4496d1401ba0'], OBJECT='job', fine_tuned_model=None, suffix=None, integrations=[], trained_tokens=None, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=120, cost=2.6214, cost_currency='USD', train_tokens_per_step=131072, train_tokens=1310720, data_tokens=30344845, estimated_start_time=None)), JobOut(id='baf7cb65-5ab6-4cdd-a4c6-a6f90c18cd7b', auto_start=True, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=0.0431941570306258, fim_ratio=None), model='open-mistral-7b', status='SUCCESS', job_type='FT', created_at=1721396928, modified_at=1721397062, training_files=['96d5e16c-d701-455c-8f76-82054d005325'], validation_files=['cfc6dd29-f82e-48c0-8153-59e2313600c8'], OBJECT='job', fine_tuned_model='ft:open-mistral-7b:b6e34a5e:20240719:baf7cb65', suffix=None, integrations=[], trained_tokens=1310720, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=100, cost=2.6214, cost_currency='USD', train_tokens_per_step=131072, train_tokens=1310720, data_tokens=30344845, estimated_start_time=None)), JobOut(id='7d82092d-a827-4943-9361-b321c6a3809c', auto_start=False, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=0.0431941570306258, fim_ratio=None), model='open-mistral-7b', status='VALIDATED', job_type='FT', created_at=1721396750, modified_at=1721396751, training_files=['96d5e16c-d701-455c-8f76-82054d005325'], validation_files=['cfc6dd29-f82e-48c0-8153-59e2313600c8'], OBJECT='job', fine_tuned_model=None, suffix=None, integrations=[], trained_tokens=None, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=100, cost=2.6214, cost_currency='USD', train_tokens_per_step=131072, train_tokens=1310720, data_tokens=30344845, estimated_start_time=None)), JobOut(id='1d69c7fc-fba8-40ad-92d1-3811b708cde1', auto_start=True, hyperparameters=TrainingParameters(training … (salida recortada)
Este código cancela un trabajo de fine-tuning en curso. Si necesitas detener un trabajo por cualquier razón, puedes usar este comando. Ten en cuenta que los trabajos cancelados no pueden reanudarse.
retrieved_jobs = client.fine_tuning.jobs.get(job_id = created_jobs.id)
retrieved_jobs
Imprimimos el objeto cancelled_job para confirmar que el trabajo ha sido cancelado exitosamente. Su estado debería reflejar "CANCELLED".
DetailedJobOut(id='20178c3c-d75b-428e-b20d-7d39aa2b7468', auto_start=True, hyperparameters=TrainingParameters(training_steps=10, learning_rate=0.0001, epochs=0.0431941570306258, fim_ratio=None), model='open-mistral-7b', status='RUNNING', job_type='FT', created_at=1721405548, modified_at=1721405549, training_files=['ec5af16a-77fe-4e14-ad09-47ead2848ce6'], validation_files=['d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4'], OBJECT='job', fine_tuned_model=None, suffix=None, integrations=[], trained_tokens=None, repositories=[], metadata=JobMetadataOut(expected_duration_seconds=120, cost=2.6214, cost_currency='USD', train_tokens_per_step=131072, train_tokens=1310720, data_tokens=30344845, estimated_start_time=None), events=[EventOut(name='status-updated', created_at=1721405549, data=Unset()), EventOut(name='status-updated', created_at=1721405549, data=Unset()), EventOut(name='status-updated', created_at=1721405549, data=Unset()), EventOut(name='status-updated', created_at=1721405548, data=Unset()), EventOut(name='status-updated', created_at=1721405548, data=Unset())], checkpoints=[])
Este comando recupera los eventos asociados con un trabajo de fine-tuning específico. Los eventos proporcionan información detallada sobre el progreso del entrenamiento, como la pérdida (loss) en cada época.
import time
retrieved_job = client.fine_tuning.jobs.get(job_id = created_jobs.id)
while retrieved_job.status in ["RUNNING", "QUEUED"]:
retrieved_job = client.fine_tuning.jobs.get(job_id = created_jobs.id)
pprint(retrieved_job)
print(f"Job is {retrieved_job.status}, waiting 10 seconds")
time.sleep(10)
Iteramos sobre los eventos y los imprimimos. Esto te permite monitorear el progreso del fine-tuning en tiempo real y detectar posibles problemas o tendencias en el rendimiento del modelo.
{
"id": "20178c3c-d75b-428e-b20d-7d39aa2b7468",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": 0.0431941570306258,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "RUNNING",
"job_type": "FT",
"created_at": 1721405548,
"modified_at": 1721405549,
"training_files": [
"ec5af16a-77fe-4e14-ad09-47ead2848ce6"
],
"validation_files": [
"d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4"
],
"fine_tuned_model": null,
"suffix": null,
"integrations": [],
"trained_tokens": null,
"repositories": [],
"metadata": {
"expected_duration_seconds": 120,
"cost": 2.6214,
"cost_currency": "USD",
"train_tokens_per_step": 131072,
"train_tokens": 1310720,
"data_tokens": 30344845,
"estimated_start_time": null
},
"events": [
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405548
},
{
"name": "status-updated",
"created_at": 1721405548
}
],
"checkpoints": []
}
Job is RUNNING, waiting 10 seconds
{
"id": "20178c3c-d75b-428e-b20d-7d39aa2b7468",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": 0.0431941570306258,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "RUNNING",
"job_type": "FT",
"created_at": 1721405548,
"modified_at": 1721405549,
"training_files": [
"ec5af16a-77fe-4e14-ad09-47ead2848ce6"
],
"validation_files": [
"d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4"
],
"fine_tuned_model": null,
"suffix": null,
"integrations": [],
"trained_tokens": null,
"repositories": [],
"metadata": {
"expected_duration_seconds": 120,
… (salida recortada)
Este comando elimina un trabajo de fine-tuning. Una vez que un trabajo ha sido eliminado, no se puede recuperar su información ni sus recursos asociados.
# List jobs
jobs = client.fine_tuning.jobs.list()
pprint(jobs)
Imprimimos el objeto deleted_job para confirmar que el trabajo ha sido eliminado. Es una buena práctica limpiar los trabajos que ya no necesitas.
{
"total": 32,
"data": [
{
"id": "20178c3c-d75b-428e-b20d-7d39aa2b7468",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": 0.0431941570306258,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "SUCCESS",
"job_type": "FT",
"created_at": 1721405548,
"modified_at": 1721405693,
"training_files": [
"ec5af16a-77fe-4e14-ad09-47ead2848ce6"
],
"validation_files": [
"d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4"
],
"fine_tuned_model": "ft:open-mistral-7b:b6e34a5e:20240719:20178c3c",
"suffix": null,
"integrations": [],
"trained_tokens": 1310720,
"repositories": [],
"metadata": {
"expected_duration_seconds": 120,
"cost": 2.6214,
"cost_currency": "USD",
"train_tokens_per_step": 131072,
"train_tokens": 1310720,
"data_tokens": 30344845,
"estimated_start_time": null
}
},
{
"id": "98cbe43b-61e5-47a8-a5fb-57f6d82abc0a",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": 0.0431941570306258,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "SUCCESS",
"job_type": "FT",
"created_at": 1721405463,
"modified_at": 1721405603,
"training_files": [
"71664e51-eae4-4c5b-9007-2c4586265609"
],
"validation_files": [
"6c09517c-32d9-465c-8e4b-4496d1401ba0"
],
"fine_tuned_model": "ft:open-mistral-7b:b6e34a5e:20240719:98cbe43b",
"suffix": null,
"integrations": [],
"trained_tokens": 1310720,
"repositories": [],
"metadata": {
"expected_duration_seconds": 120,
"cost": 2.6214,
"cost_currenc
… (salida recortada)
Este comando elimina un archivo subido. Si ya no necesitas un conjunto de datos específico, puedes eliminarlo para liberar espacio y mantener tus recursos organizados.
# Retrieve a jobs
retrieved_jobs = client.fine_tuning.jobs.get(job_id = created_jobs.id)
pprint(retrieved_jobs)
Imprimimos el objeto deleted_file para confirmar la eliminación del archivo. Asegúrate de no eliminar archivos que aún estén en uso por trabajos de fine-tuning activos.
{
"id": "20178c3c-d75b-428e-b20d-7d39aa2b7468",
"auto_start": true,
"hyperparameters": {
"training_steps": 10,
"learning_rate": 0.0001,
"epochs": 0.0431941570306258,
"fim_ratio": null
},
"model": "open-mistral-7b",
"status": "SUCCESS",
"job_type": "FT",
"created_at": 1721405548,
"modified_at": 1721405693,
"training_files": [
"ec5af16a-77fe-4e14-ad09-47ead2848ce6"
],
"validation_files": [
"d0c643a2-a57c-4031-bda7-5c9d6c3ec3e4"
],
"fine_tuned_model": "ft:open-mistral-7b:b6e34a5e:20240719:20178c3c",
"suffix": null,
"integrations": [],
"trained_tokens": 1310720,
"repositories": [],
"metadata": {
"expected_duration_seconds": 120,
"cost": 2.6214,
"cost_currency": "USD",
"train_tokens_per_step": 131072,
"train_tokens": 1310720,
"data_tokens": 30344845,
"estimated_start_time": null
},
"events": [
{
"name": "status-updated",
"created_at": 1721405693
},
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405549
},
{
"name": "status-updated",
"created_at": 1721405548
},
{
"name": "status-updated",
"created_at": 1721405548
}
],
"checkpoints": [
{
"metrics": {
"train_loss": 0.851776,
"valid_loss": 0.92623,
"valid_mean_token_accuracy": 1.900304
},
"step_number": 10,
"created_at": 1721405660
}
]
}
Este comando elimina otro archivo subido, en este caso, el de validación. Es importante limpiar todos los recursos una vez que hayas terminado con ellos.
Usa un modelo ajustado
Una vez que tu trabajo de fine-tuning ha finalizado con éxito, la API de Mistral te proporcionará un nuevo modelo ajustado. Puedes usar este modelo de la misma manera que usarías cualquier otro modelo de Mistral, pero con el beneficio de que está optimizado para tus datos.
chat_response = client.chat.complete(
model = retrieved_jobs.fine_tuned_model,
messages = [{"role":'user', "content":'What is the best French cheese?'}]
)
Este código muestra cómo puedes usar el modelo ajustado para generar texto. Reemplaza ft:mistral-tiny:YOUR_JOB_ID con el ID real de tu modelo ajustado. El modelo responderá a tus prompts basándose en el entrenamiento que recibió con tus datos.
pprint(chat_response)
Imprimimos la respuesta generada por el modelo ajustado. Observa cómo el modelo responde al prompt, y evalúa si su comportamiento es el esperado después del fine-tuning.
{
"id": "1fac96713fd74799922712e34e009f81",
"object": "chat.completion",
"model": "ft:open-mistral-7b:b6e34a5e:20240719:20178c3c",
"usage": {
"prompt_tokens": 10,
"completion_tokens": 73,
"total_tokens": 83
},
"created": 1721405725,
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"content": "There isn't a single \"best\" French cheese as there are hundreds of different types of cheese to choose from, each with its unique taste and texture. Some popular French cheeses include Brie, Camembert, Roquefort, Comt\u00e9, and Ch\u00e8vre. Try different cheeses to find out the one you like best!",
"tool_calls": null,
"prefix": false,
"role": "assistant"
}
}
]
}
Este comando elimina el modelo ajustado. Si ya no necesitas el modelo, puedes eliminarlo para liberar recursos. Ten en cuenta que una vez eliminado, el modelo no se puede recuperar.
Integración con Weights and Biases
También ofrecemos soporte para la integración con Weights & Biases (W&B) para monitorear y rastrear varias métricas y estadísticas asociadas con nuestros trabajos de fine-tuning. Para habilitar la integración con W&B, necesitarás crear una cuenta en W&B y añadir tu información de W&B en la sección "integrations" en la solicitud de creación del trabajo:
client.fine_tuning.jobs.create(
model="open-mistral-7b",
training_files=[{"file_id": ultrachat_chunk_train.id, "weight": 1}],
validation_files=[ultrachat_chunk_eval.id],
hyperparameters={"training_steps": 10, "learning_rate": 0.0001},
integrations=[
{
"project": "<value>",
"api_key": "<value>",
}
]
)
Este fragmento de código muestra cómo incluir la configuración de Weights & Biases al crear un trabajo de fine-tuning. Al proporcionar tu clave de API de W&B y el nombre del proyecto, podrás ver métricas de entrenamiento, gráficos y otra información útil directamente en tu panel de W&B, lo que facilita el seguimiento y la optimización de tus trabajos de fine-tuning.
Resumen
- El fine-tuning con la API de Mistral permite adaptar modelos de lenguaje a datos específicos para mejorar su rendimiento.
- La preparación del conjunto de datos implica cargar, dividir y reformatear los datos al formato
.jsonlrequerido por la API. - Los conjuntos de datos de entrenamiento y validación deben subirse a la API de Mistral antes de crear un trabajo de fine-tuning.
- La creación de un trabajo de fine-tuning requiere especificar el modelo base y los IDs de los archivos de datos subidos.
- Los modelos ajustados se pueden usar para generar texto y se pueden integrar con herramientas como Weights & Biases para monitoreo.