Fine-tuning de un modelo con Azure Open AI Studio
Published: 2023-12-01 20:10:52

_Esta publicación forma parte del **Calendario de Adviento AI 2023**, una iniciativa liderada por Héctor Pérez, Alex Rostan, Pablo Piovano y Luis Beltrán. Consulta **[este enlace](https://dev.to/ppiova/adviento-inteligencia-artificial-48aj)** para obtener más artículos interesantes sobre IA creados por la comunidad._

En preparación para mi próxima participación en la **[Global AI Conference 2023](https://globalai.community/events/global-ai-conference-december-2023/)** con el tema _Fine-tuning de un modelo de Azure Open AI: Lecciones aprendidas_, veamos cómo personalizar un modelo con tus propios datos usando **Azure Open AI**.

## Antes que nada, una definición.
Me gusta la definición presentada [aquí](https://deeplizard.com/learn/video/5T-iXNNiwIs). **Fine-tuning es:** 

> _el proceso que toma un modelo que ya ha sido entrenado para una tarea determinada y luego ajusta o modifica el modelo para que realice una segunda tarea similar._

Es una forma de aplicar _transferencia de aprendizaje_, una técnica que utiliza el conocimiento adquirido al resolver un problema y lo aplica a un problema nuevo pero relacionado.

## Azure Open AI y fine-tuning
**Azure Open AI** es una plataforma basada en la nube que permite crear e implementar modelos de IA generativa de forma rápida y sencilla. Una de las capacidades de este servicio es el fine-tuning de modelos previamente entrenados con tus propios datasets. Algunas ventajas incluyen:

* Lograr mejores resultados que prompt-engineering.
* Requiere menos texto (por lo tanto, se procesan menos tokens en cada llamada API)
* Ahorro de costos, disminuyendo la latencia de las solicitudes.

## ¿Qué necesitas?

- Una **suscripción de Azure** con acceso a los servicios de **Azure Open AI**.
- Un **recurso** de Azure Open AI creado en una de las [regiones admitidas](https://learn.microsoft.com/es-mx/azure/ai-services/openai/concepts/models#fine-tuning-models-preview) para realizar fine-tuning, con un modelo compatible.
- El rol de **Cognitive Services OpenAI Contributor**.
- El elemento más importante a considerar: **¿Realmente necesitas afinar un modelo?** Lo discutiré durante mi charla la próxima semana, por el momento puedes leer sobre ello [aquí](https://learn.microsoft.com/es-mx/azure/ai-services/openai/concepts/fine-tuning-considerations).

Hagamos fine-tuning de un modelo con **Azure OpenAI Studio**.

## Pasos

1. Crea un recurso de Azure Open AI.
2. Prepara tus datos.
3. Utiliza el asistente Crear modelo personalizado de Azure OpenAI Studio.
4. Espera hasta que se entrene el modelo.
5. Implementa tu modelo personalizado para su uso.
6. Úsalo.

## ¡Vamos a hacerlo!

### Paso 1. Crear un recurso de Azure Open AI
Utiliza el asistente para crear un recurso de Azure Open AI. Sólo hay que tener cuidado con la región. Actualmente, solo _North Central US_ y _Sweden Central_ admiten la capacidad de fine-tuning, así que elige cualquiera de ellos.

![Recurso de Azure Open AI en la región centro-norte de EE. UU.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xespytqvfd0fabtlp7kg.png)

Una vez creado el recurso, accede a **Azure OpenAI Studio**.

### Paso 2. Prepara tus datos.
Debes preparar dos conjuntos de datos: uno para entrenamiento y otro para validación. Cada uno de ellos contiene muestras de entradas y su salida esperada en formato **JSONL** (JSON Lines). Sin embargo, según el modelo base que implementaste, necesitarás propiedades específicas para cada elemento:

* Si estás haciendo fine-tuning de modelos recientes, como **GPT 3.5 Turbo**, aquí tienes un ejemplo del formato de archivo.

```
{"messages": [{"role": "system", "content": "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."}, {"role": "user", "content": "Title: No-Bake Nut Cookies\n\nIngredients: [\"1 c. firmly packed brown sugar\", \"1/2 c. evaporated milk\", \"1/2 tsp. vanilla\", \"1/2 c. broken nuts (pecans)\", \"2 Tbsp. butter or margarine\", \"3 1/2 c. bite size shredded rice biscuits\"]\n\nGeneric ingredients: "}, {"role": "assistant", "content": "[\"brown sugar\", \"milk\", \"vanilla\", \"nuts\", \"butter\", \"bite size shredded rice biscuits\"]"}]}
{"messages": [{"role": "system", "content": "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."}, {"role": "user", "content": "Title: Jewell Ball'S Chicken\n\nIngredients: [\"1 small jar chipped beef, cut up\", \"4 boned chicken breasts\", \"1 can cream of mushroom soup\", \"1 carton sour cream\"]\n\nGeneric ingredients: "}, {"role": "assistant", "content": "[\"beef\", \"chicken breasts\", \"cream of mushroom soup\", \"sour cream\"]"}]}
```

Considera que para cada elemento (línea) se proporciona un elemento `messages` que contiene un arreglo de pares `rol-content` para `system` (el comportamiento), `user` (la entrada) y `assistant` (la salida).

* Por otro lado, si estás haciendo fine-tuning de modelos antiguos (como **Babbage** o **Davinci**), aquí tienes un formato de archivo de ejemplo que funciona con ambos:

```
{"prompt": "You guys are some of the best fans in the NHL", "completion": "hockey"}
{"prompt": "The Red Sox and the Yankees play tonight!", "completion": "baseball"}
{"prompt": "Pelé was one of the greatest", "completion": "soccer"}
```

Observa que cada elemento contiene un par `prompt-completion` que representa la entrada y la salida deseada que nos gustaría que genere el modelo personalizado.

Puedes encontrar más información sobre JSON Lines [aquí](https://jsonlines.org/).

Para generar un archivo JSONL, existen varios métodos:

* De forma manual: escribe una aplicación que crea un archivo de texto (con extensión `.jsonl`), luego itera tu dataset y serializa cada elemento en una cadena JSON (no olvides que necesitas propiedades específicas). Escribe cada cadena JSON en una nueva línea del archivo creado recientemente.

* Mediante librerías: dependiendo del lenguaje de programación que estés utilizando, es muy probable que existan algunas bibliotecas que puedan exportar tus datos en formato JSONL. Por ejemplo, [`jsonlines`](https://jsonlines.readthedocs.io/en/latest/) para Python.

* Mediante un sitio web: existen algunos sitios web que pueden convertir tus datos `Excel`, `SQL`, `CSV` (y otros) al formato JSONL, por ejemplo [Table Convert](https://tableconvert.com/sql-to-jsonlines) o [Code Beautify](https://codebeautify.org/json-to-jsonl-converter).


Por cierto, aquí tienes algunas características de JSONL:

- Cada línea es un elemento JSON válido
- Cada línea está separada por un carácter \n
- El archivo está codificado usando UTF-8

Además, para el uso de Azure Open AI, el archivo debe incluir una **marca de orden de bytes (BOM).**

### Paso 3. Utiliza el asistente para crear un modelo personalizado de Azure OpenAI Studio.

Sólo algunos modelos se pueden personalizar. A fecha de hoy, los modelos **babbage-002**, **davinci-002** y **gpt-35-turbo** admiten esta función.

En Azure Open AI Studio, haz clic en **Modelos** y luego en **Crear un modelo personalizado**.


![Creando un modelo personalizado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4rwm3m73r96ceve09kp5.png)


Aparece un asistente. En primer lugar, debes seleccionar uno de los [modelos admitidos para realizar fine-tuning](https://learn.microsoft.com/es-mx/azure/ai-services/openai/concepts/models#fine-tuning-models-preview), que se utilizará como base para la personalización.


![Modelos base compatibles para realizar ajustes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p6qv0b7xmy4bno7lcq1a.png)


Para este ejemplo, he seleccionado `gpt-35-turbo`. El sufijo es opcional, aunque facilita la identificación del modelo generado por lo que se recomienda proporcionarlo. Haz clic en Siguiente.


![Modelo base](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oezpexwqvyf7ca4ct5l1.png)



Ahora, debes proporcionar un archivo `JSONL`, que sirve como **conjunto de datos de entrenamiento**. Puedes seleccionar un archivo local o ingresar la dirección URL de un recurso público en línea (como un blob de Azure o una ubicación web).

Para este ejemplo, he elegido un archivo `JSONL` local que contiene ejemplos de un útil asistente virtual que extrae ingredientes genéricos de una receta proporcionada. Haz clic en Cargar archivo y una vez completada la tarea, haz clic en Siguiente.



![Datos de entrenamiento](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h5ex09w88m28ynja9ol3.png)



Ahora, debes proporcionar el archivo/recurso `JSONL` para el **conjunto de datos de validación**. Para este ejemplo, he elegido otro archivo `JSONL` local con ejemplos de un útil asistente virtual que extrae ingredientes genéricos de una receta proporcionada. Haz clic en Cargar archivo y luego en Siguiente una vez que finalice el proceso.



![Datos de validación](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2iixs6e9w9vep2agqft0.png)



Luego, puedes configurar opciones avanzadas, como el **número de épocas** para entrenar el modelo. Mantengamos el valor **Predeterminado** para este ejemplo y hagamos clic en Siguiente.


![Opciones avanzadas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xi64ieojiln2ylv3sepl.png)


Finalmente, se presenta un resumen con las opciones seleccionadas en los pasos anteriores. Haz clic en **Iniciar trabajo de entrenamiento**.



![Revisando las opciones seleccionadas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pu0jxjvgdpuzx9mwl8kp.png)




### Paso 4. Espera hasta que el proceso finalice.

Puedes comprobar el estado del trabajo de entrenamiento del modelo en la pestaña **Modelos personalizados** del menú **Modelos**.


![Se inició el trabajo de fine-tuning](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b8y1ibupw1842fstjsnv.png)



Haz clic en el botón **Actualizar** para ver el progreso actual de la tarea.


![Entrenamiento de un modelo, en proceso](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i8df94ogp5b4ax55rsm7.png)


Entrenar el modelo llevará algún tiempo dependiendo de la cantidad de datos proporcionados, la cantidad de épocas, el modelo base y otros parámetros seleccionados para la tarea. Además, dado que tu trabajo entra en una cola, es posible que el servidor esté manejando tareas de entrenamiento de otros usuarios, lo que provoca que el proceso se retrase.

Una vez que veas que el estado es `Success`, **significa que se ha creado tu modelo personalizado y ajustado**. ¡Bien hecho!


![Trabajo de entrenamiento completado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xe2zyf93zlhzv80qn8bp.png)

Sin embargo, se necesita un paso adicional antes de poder intentar usarlo.


### Paso 5. Implementa tu modelo personalizado para su uso.

Selecciona el modelo creado recientemente y luego haz clic en el botón **Implementar**.


![Implementación de un modelo personalizado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9fzlvad8ba6a92jtl4v2.png)


Luego, agrega un **nombre de implementación**. También puedes cambiar la versión del modelo en caso de que el modelo haya sido personalizado varias veces. Haz clic en **Crear**.


![Estableciendo opciones de implementación](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l018d4v695m3nx8oao6k.png)


Puedes monitorear el progreso de la implementación en el menú **Implementaciones**:


![Implementación de un modelo optimizado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t5i3ve6bac0v06x4vod8.png)



Cuando finalice el trabajo (_Estado = Success_), estarás listo para utilizar este modelo.


![Modelo personalizado implementado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvq9a525hc9shh3bgphr.png)




### Paso 6. Úsalo.

Puedes utilizar el modelo implementado para realizar inferencias en cualquier lugar: en una aplicación que desarrolles, en Playground, como parte de una solicitud de API, etc. Por ejemplo:


![Probando el modelo personalizado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lznghhcdo26tawrn8qqd.png)



Como puedes ver, el proceso para hacer fine-tuning de un modelo de Open AI utilizando Azure es bastante sencillo y ofrece varios beneficios. Sin embargo, también debes considerar si esta es la mejor solución para tus necesidades. Asiste a mi sesión en la [Global AI Conference](https://globalai.community/conference/) el 12 de diciembre para obtener más información al respecto.


![Fine-tuning de un modelo de Azure Open AI, lecciones aprendidas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eufi5vyosifdgie19a8f.png)

Bueno, esta fue una publicación larga pero espero que también te haya sido útil. Recuerda seguir el resto de publicaciones interesantes del [Calendario de Adviento AI 2023](https://dev.to/ppiova/adviento-inteligencia-artificial-48aj). También puedes seguir la conversación en Twitter con el hashtag #AdvientoAI.

Gracias por leer. ¡Hasta la proxima vez!

Luis