Ajuste de modelos grandes de lenguaje: Cómo Vertex AI lleva los LLM al siguiente nivel

1. Introducción

Por qué es importante el ajuste

Los modelos de base se entrenan para usos generales y, a veces, no se realizan tareas como deseas. Esto puede deberse a que las tareas que deseas que realice el modelo son tareas especializadas que son difíciles de enseñar a un modelo solo con el diseño de prompts. En estos casos, puedes usar el ajuste de modelos para mejorar el rendimiento de un modelo en tareas específicas. El ajuste de modelos también puede ayudar a cumplir con requisitos de salida específicos cuando las instrucciones no son suficientes. Los modelos de lenguaje grandes (LLM) pueden tener una gran cantidad de información y realizar muchas tareas, pero solo se destacan cuando se les proporciona entrenamiento especializado. El ajuste preciso puede entrenar un LLM, lo que te permite adaptar un LLM entrenado previamente para tus necesidades específicas.

En este codelab, aprenderás a realizar el ajuste con el enfoque de ajuste supervisado para un modelo de LLM.

El ajuste supervisado mejora el rendimiento de un modelo, ya que le enseña una habilidad nueva. Los datos que contienen cientos de ejemplos etiquetados se usan para enseñarle al modelo a imitar un comportamiento o una tarea deseados. Proporcionaremos un conjunto de datos etiquetado para el texto de entrada (prompt) y el texto de salida (respuesta) para enseñarle al modelo a personalizar las respuestas para nuestro caso de uso específico.

Puedes encontrar más información sobre la personalización de modelos aquí.

Qué compilarás

Caso de uso: Genera titulares para artículos periodísticos

Supongamos que deseas generar automáticamente titulares para artículos periodísticos. Con Vertex AI, puedes ajustar un LLM que genere un título resumido adecuado en un estilo específico y personalizar el título según los lineamientos del canal de noticias.

En este codelab, harás lo siguiente:

  • Usa BBC FULLTEXT DATA (disponible en el conjunto de datos públicos de BigQuery bigquery-public-data.bbc_news.fulltext).
  • Ajusta un LLM (text-bison@002) a un nuevo modelo ajustado llamado "bbc-news-summary-tuned" y compara el resultado con la respuesta del modelo de base. Un archivo JSONL de muestra está disponible para este codelab en el repositorio. Puedes subir el archivo a tu bucket de Cloud Storage y ejecutar los siguientes pasos de ajuste:
  • Prepara tus datos: Comienza con un conjunto de datos de artículos periodísticos y sus titulares correspondientes, como el conjunto de datos de BBC News que se usa en el código de ejemplo.
  • Ajusta un modelo entrenado previamente: Elige un modelo de base como "text-bison@002" y ajústalo con tus datos de noticias usando el SDK de Vertex AI para Python.
  • Evalúa los resultados: Compara el rendimiento de tu modelo ajustado con el modelo de base para ver la mejora en la calidad de la generación de titulares.
  • Implementa y usa tu modelo: Haz que tu modelo ajustado esté disponible a través de un endpoint de API y comienza a generar titulares para artículos nuevos automáticamente.

2. Antes de comenzar

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
  3. Abre el cuaderno de Colab y accede a la misma cuenta que tu cuenta activa actual de Google Cloud.

3. Ajusta un modelo de lenguaje grande

En este codelab, se usa el SDK de Vertex AI para Python para ajustar el modelo. También puedes realizar el ajuste con las otras opciones: HTTP, comando CURL, SDK de Java y consola.

Puedes ajustar y evaluar tu modelo para obtener respuestas personalizadas en 5 pasos. Puedes consultar el código completo en el archivo llm_fine_tuning_supervised.ipynb del repositorio.

4. Paso 1: Instala y, luego, importa dependencias

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

Sigue el resto de los pasos como se muestra en el archivo .ipynb del repositorio. Asegúrate de reemplazar PROJECT_ID y BUCKET_NAME por tus credenciales.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. Paso 2: Prepara y carga los datos de entrenamiento

Reemplaza YOUR_BUCKET por tu bucket y sube el archivo de datos de entrenamiento de muestra TRAIN.jsonl. Los datos de muestra se aprovisionaron para este caso de uso en el vínculo mencionado anteriormente.

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

Este paso debería dar como resultado lo siguiente:

17274866af36a47c.png

6. Paso 3: Ajusta un modelo de lenguaje grande

En este punto, puedes ajustar cualquier modelo de lenguaje grande (según la disponibilidad de compatibilidad) . Sin embargo, en este fragmento, ajustamos el modelo preentrenado "text-bison@002" con el marco de datos que tiene los datos de entrenamiento que cargamos en el paso anterior:

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

Este paso tardará unas horas en completarse. Puedes hacer un seguimiento del progreso del ajuste con el vínculo del trabajo de canalización en el resultado.

7. Paso 4: Realiza predicciones con el nuevo modelo ajustado

Una vez que se complete el trabajo de ajuste, podrás realizar predicciones con tu modelo nuevo. Para realizar predicciones con tu nuevo modelo ajustado, haz lo siguiente:

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

Deberías ver el siguiente resultado:

67061c36b7ba39b7.png

Para realizar predicciones con el modelo de base (text-bison@002) para la comparación, ejecuta los siguientes comandos:

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

Deberías ver el siguiente resultado:

22ec58e4261405d6.png

Aunque ambos títulos generados parecen adecuados, el primero (generado con el modelo ajustado) está más en sintonía con el estilo de los títulos que se usan en el conjunto de datos en cuestión.

Carga el modelo ajustado

Puede ser más fácil cargar un modelo que acabas de ajustar. Sin embargo, recuerda que, en el paso 3, se invoca en el alcance del código en sí, por lo que aún contiene el modelo ajustado en la variable tuned_model. Pero ¿qué sucede si deseas invocar un modelo que se ajustó en el pasado?

Para ello, puedes invocar el método get_tuned_model() en el LLM con la URL completa del ENDPOINT del modelo ajustado implementado desde Vertex AI Model Registry. Ten en cuenta que, en este caso, ingresas el PROJECT_NUMBER y el MODEL_NUMBER en lugar de sus IDs respectivos.

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. Paso 5: Evalúa el nuevo modelo ajustado

La evaluación es un aspecto fundamental para evaluar la calidad y la pertinencia de la respuesta generada. Implica examinar el resultado de un modelo de lenguaje generativo para determinar su coherencia, exactitud y alineación con el prompt proporcionado. La evaluación de modelos ayuda a identificar áreas de mejora, optimizar el rendimiento del modelo y garantizar que el texto generado cumpla con los estándares deseados de calidad y utilidad. Obtén más información en la documentación. Por ahora, veremos cómo podemos obtener algunas métricas de evaluación en el modelo ajustado y compararlas con el modelo de base.

  1. Carga el conjunto de datos de EVALUATION:
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. Define la especificación de evaluación para una tarea de resumen de texto en el modelo ajustado.
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

Este paso tardará unos minutos en completarse. Puedes hacer un seguimiento del progreso con el vínculo del trabajo de canalización en el resultado. Una vez completado, deberías ver el siguiente resultado de la evaluación:

387843d6c970e02.png

La métrica rougeLSum en el resultado de la evaluación especifica la puntuación ROUGE-L para el resumen. ROUGE-L es una métrica basada en la recuperación que mide la superposición entre un resumen y un resumen de referencia. Se calcula tomando la subsecuencia común más larga (LCS) entre los dos resúmenes y dividiéndola por la longitud del resumen de referencia.

La puntuación rougeLSum en la expresión proporcionada es 0.36600753600753694, lo que significa que el resumen tiene una superposición del 36.6% con el resumen de referencia.

Si ejecutas el paso de evaluación en el modelo de referencia, observarás que la puntuación del resumen es relativamente más alta para el modelo ajustado.

Puedes encontrar los resultados de la evaluación en el directorio de salida de Cloud Storage que especificaste cuando creaste el trabajo de evaluación. El archivo se llama evaluation_metrics.json. En el caso de los modelos ajustados, también puedes ver los resultados de la evaluación en la consola de Google Cloud en la página Vertex AI Model Registry.

9. Consideraciones importantes

  • Compatibilidad con modelos: Siempre consulta la documentación del modelo para obtener la compatibilidad más reciente.
  • Desarrollo rápido: El campo de los LLM avanza rápidamente. Un modelo más nuevo y potente podría superar a un modelo ajustado basado en un modelo de base más antiguo. La buena noticia es que puedes aplicar estas técnicas de ajuste a modelos más nuevos cuando la capacidad esté disponible.
  • LoRA: LoRA es una técnica para ajustar LLM de manera eficiente. Para ello, introduce matrices de descomposición entrenables y de bajo rango en las capas del modelo preentrenado existente. Obtén más información aquí. En lugar de actualizar todos los parámetros de un LLM masivo, LoRA aprende matrices más pequeñas que se agregan a las matrices de pesos del modelo original o se multiplican por ellas. Esto reduce significativamente la cantidad de parámetros adicionales que se introducen durante el ajuste.

10. Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este codelab:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.
  2. En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
  4. Como alternativa, puedes ir a Model Registry, navegar a la pestaña de implementación y prueba del modelo, anular la implementación del extremo y borrar el modelo ajustado implementado.

11. Felicitaciones

¡Felicitaciones! Usaste Vertex AI de forma correcta para ajustar un modelo de LLM. El ajuste es una técnica potente que te permite personalizar LLM para tu dominio y tus tareas. Con Vertex AI, tienes las herramientas y los recursos que necesitas para ajustar tus modelos de manera eficiente y eficaz.

Explora los repositorios de GitHub y experimenta con el código de muestra para experimentar el ajuste y la evaluación de primera mano. Considera cómo los LLM ajustados pueden satisfacer tus necesidades específicas, desde generar texto de marketing segmentado hasta resumir documentos complejos o traducir idiomas con matices culturales. Utiliza el paquete integral de herramientas y servicios que ofrece Vertex AI para compilar, entrenar, evaluar y, luego, implementar tus modelos ajustados con facilidad.