Acerca de este codelab
1. Introducción
Por qué es importante el ajuste fino
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 indicaciones. En estos casos, puedes usar el ajuste de modelos para mejorar el rendimiento de un modelo en tareas específicas. El ajuste del modelo también puede ayudar a cumplir con requisitos de salida específicos cuando las instrucciones no son suficientes. Los modelos de lenguaje extensos (LLM) pueden tener una gran cantidad de información y realizar muchas tareas, pero solo se destacan cuando se les proporciona un entrenamiento especializado. El ajuste fino puede entrenar un LLM, lo que te permite adaptar un LLM previamente entrenado para tus necesidades específicas.
En este codelab, aprenderás a realizar un ajuste fino 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 (instrucción) 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: Generar títulos para artículos de noticias
Supongamos que deseas generar títulos automáticamente para artículos de noticias. Con Vertex AI, puedes ajustar un LLM que genere un título resumido adecuado en un estilo específico y lo personalice según los lineamientos del canal de noticias.
En este codelab, realizarás las siguientes tareas:
- Usa
BBC FULLTEXT DATA
(que pone a disposición el conjunto de datos públicos de BigQuerybigquery-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. Hay un archivo JSONL de muestra disponible para este codelab en el repositorio. Puedes subir el archivo a tu bucket de Cloud Storage y ejecutar los siguientes pasos de ajuste fino: - Prepara tus datos: Comienza con un conjunto de datos de artículos de noticias y sus títulos correspondientes, como el conjunto de datos de BBC News que se usa en el código de ejemplo.
- Ajusta un modelo previamente entrenado: Elige un modelo base, como "
text-bison@002
", y ajústalo con tus datos de noticias con 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 títulos.
- Implementa y usa tu modelo: Haz que tu modelo optimizado esté disponible a través de un extremo de API y comienza a generar títulos para artículos nuevos automáticamente.
2. Antes de comenzar
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
- 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.
- Abre Colab Notebook y accede a la misma cuenta que tu cuenta activa actual de Google Cloud.
3. Ajusta un modelo de lenguaje extenso
En este codelab, se usa el SDK de Vertex AI para Python para ajustar el modelo. También puedes realizar ajustes finos 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 e importa dependencias
!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components
Sigue el resto de los pasos que se muestran 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 TU_BUCKET por tu bucket y sube el archivo de datos de entrenamiento de muestra TRAIN.jsonl a él. 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 generar lo siguiente:
6. Paso 3: Ajusta un modelo de lenguaje extenso
En este punto, puedes ajustar cualquier modelo de lenguaje grande (según la disponibilidad de asistencia) . Sin embargo, en este fragmento, ajustamos el modelo previamente entrenado "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 fino 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 fino, podrás realizar predicciones con tu modelo nuevo. Para realizar predicciones con tu nuevo modelo ajustado, sigue estos pasos:
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:
Para realizar predicciones con el modelo base (text-bison@002
) a modo de 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:
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.
Cómo cargar el modelo ajustado
Puede ser más fácil cargar un modelo que acabas de ajustar. Pero 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 quieres 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 de ENDPOINT completa del modelo ajustado implementado desde Vertex AI Model Registry. Ten en cuenta que, en este caso, ingresas PROJECT_NUMBER y MODEL_NUMBER en lugar de sus respectivos IDs.
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 relevancia de la respuesta generada. Implica examinar el resultado de un modelo de lenguaje generativo para determinar su coherencia, precisión y alineación con la instrucción proporcionada. 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 de calidad y utilidad deseados. 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 compararlo con el modelo base.
- Carga el conjunto de datos de EVALUACIÓN:
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
- 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. Cuando termine, deberías ver el siguiente resultado de la evaluación:
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. Para calcularlo, se toma la subsecuencia común más larga (LCS) entre los dos resúmenes y se divide por la longitud del resumen de referencia.
La puntuación de 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 nombre del archivo es 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 Registro de modelos de Vertex AI.
9. Consideraciones importantes
- Compatibilidad con modelos: Siempre consulta la documentación del modelo para conocer 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 tener un mejor rendimiento que un modelo ajustado creado en una base más antigua. La buena noticia es que puedes aplicar estas técnicas de ajuste fino a modelos más nuevos cuando la función esté disponible.
- LoRA: LoRA es una técnica para ajustar con precisión los LLM de manera eficiente. Para ello, introduce matrices de descomposición de baja clasificación entrenables en las capas del modelo previamente entrenado 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 o multiplican con las matrices de pesos del modelo original. Esto reduce significativamente la cantidad de parámetros adicionales que se introducen durante el ajuste fino.
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:
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
- 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 fino es una técnica potente que te permite personalizar los LLM para tu dominio y tus tareas. Con Vertex AI, tienes las herramientas y los recursos que necesitas para ajustar tus modelos de forma eficiente y eficaz.
Explora los repositorios de GitHub y experimenta con el código de muestra para experimentar el ajuste fino y la evaluación de primera mano. Considera cómo los LLM ajustados pueden abordar tus necesidades específicas, desde la generación de un texto de marketing segmentado hasta el resumen de documentos complejos o la traducción de idiomas con matices culturales. Utiliza el paquete integral de herramientas y servicios que ofrece Vertex AI para compilar, entrenar, evaluar e implementar tus modelos optimizados con facilidad.