Affiner les grands modèles de langage: comment Vertex AI fait passer les LLM à la vitesse supérieure

1. Introduction

Pourquoi l'affinage est-il important ?

Les modèles de fondation sont entraînés à des fins générales et n'effectuent parfois pas les tâches comme vous le souhaitez. Cela peut être dû au fait que les tâches que vous souhaitez que le modèle exécute sont des tâches spécialisées difficiles à enseigner au modèle avec une conception de requête. Dans ce cas, vous pouvez utiliser les réglages de modèles afin d'améliorer les performances d'un modèle pour des tâches spécifiques. Le réglage du modèle peut aussi l'aider à respecter des exigences spécifiques de sortie lorsque les instructions sont insuffisantes. Les grands modèles de langage (LLM) peuvent contenir une grande quantité d'informations et effectuer de nombreuses tâches, mais ils n'excellent que lorsqu'ils bénéficient d'un entraînement spécialisé. L'affinage peut entraîner un LLM, ce qui vous permet d'adapter un LLM pré-entraîné à vos besoins spécifiques.

Dans cet atelier de programmation, vous découvrirez comment effectuer un affinage à l'aide de l'approche de réglage supervisé pour un modèle LLM.

Le réglage supervisé permet d'améliorer les performances d'un modèle en lui apprenant une nouvelle compétence. Des données contenant des centaines d'exemples étiquetés sont utilisées pour apprendre au modèle à simuler l'exécution d'une tâche ou un comportement souhaité. Nous allons fournir un ensemble de données étiquetées pour le texte d'entrée (requête) et le texte de sortie (réponse) afin d'apprendre au modèle à personnaliser les réponses pour notre cas d'utilisation spécifique.

Pour en savoir plus sur la personnalisation des modèles, cliquez ici.

Objectifs de l'atelier

Cas d'utilisation : générer des titres pour des articles de presse

Supposons que vous souhaitiez générer automatiquement des titres pour des articles de presse. À l'aide de Vertex AI, vous pouvez affiner un LLM qui génère un titre résumé approprié dans un style spécifique et le personnalise conformément aux consignes de la chaîne d'information.

Dans cet atelier de programmation, vous allez effectuer les opérations suivantes :

  • Utilisez BBC FULLTEXT DATA (mis à disposition par l'ensemble de données public BigQuery bigquery-public-data.bbc_news.fulltext).
  • Ajustez un LLM (text-bison@002) à un nouveau modèle affiné appelé "bbc-news-summary-tuned" et comparez le résultat à la réponse du modèle de base. Un exemple de fichier JSONL est disponible pour cet atelier de programmation dans le dépôt. Vous pouvez importer le fichier dans votre bucket Cloud Storage et exécuter les étapes d'affinage suivantes :
  • Préparez vos données : commencez par un ensemble de données d'articles de presse et de leurs titres correspondants, comme l'ensemble de données BBC News utilisé dans l'exemple de code.
  • Ajustez un modèle pré-entraîné : choisissez un modèle de base tel que "text-bison@002" et affinez-le avec vos données d'actualités à l'aide du SDK Vertex AI pour Python.
  • Évaluez les résultats : comparez les performances de votre modèle affiné avec celles du modèle de base pour voir l'amélioration de la qualité de la génération de titres.
  • Déployez et utilisez votre modèle : mettez votre modèle affiné à disposition via un point de terminaison d'API et commencez à générer automatiquement des titres pour de nouveaux articles.

2. Avant de commencer

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.
  3. Ouvrez Colab Notebook et connectez-vous au même compte que votre compte Google Cloud actif actuel.

3. Ajuster un grand modèle de langage

Cet atelier de programmation utilise le SDK Vertex AI pour Python afin d'affiner le modèle. Vous pouvez également effectuer un affinage à l'aide des autres options : HTTP, commande CURL, SDK Java, console.

Vous pouvez affiner et évaluer votre modèle pour obtenir des réponses personnalisées en cinq étapes. Vous pouvez consulter le code complet dans le fichier llm_fine_tuning_supervised.ipynb du dépôt.

4. Étape 1 : Installer et importer les dépendances

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

Suivez le reste des étapes comme indiqué dans le fichier .ipynb du dépôt. Veillez à remplacer PROJECT_ID et BUCKET_NAME par vos identifiants.

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. Étape 2 : Préparer et charger les données d'entraînement

Remplacez YOUR_BUCKET par votre bucket et importez-y l'exemple de fichier de données d'entraînement TRAIN.jsonl. Les exemples de données ont été provisionnés pour ce cas d'utilisation dans le lien mentionné ci-dessus.

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

Cette étape devrait donner le résultat suivant :

17274866af36a47c.png

6. Étape 3 : Ajuster un grand modèle de langage

Vous pouvez ajuster n'importe quel grand modèle de langage à ce stade (en fonction de la disponibilité de l'assistance) . Dans cet extrait, nous ajustons toutefois le modèle pré-entraîné "text-bison@002" avec le frame de données contenant les données d'entraînement que nous avons chargées à l'étape précédente :

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",
)

Cette étape prendra quelques heures. Vous pouvez suivre la progression de l'affinage à l'aide du lien du job de pipeline dans le résultat.

7. Étape 4 : Effectuer des prédictions avec le nouveau modèle affiné

Une fois le job d'affinage terminé, vous pourrez effectuer des prédictions avec votre nouveau modèle. Pour effectuer des prédictions avec votre nouveau modèle ajusté :

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)

Vous devriez obtenir le résultat suivant :

67061c36b7ba39b7.png

Pour effectuer des prédictions avec le modèle de base (text-bison@002) à des fins de comparaison, exécutez les commandes suivantes :

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)

Vous devriez obtenir le résultat suivant :

22ec58e4261405d6.png

Bien que les deux titres générés semblent appropriés, le premier (généré avec le modèle affiné) est plus conforme au style des titres utilisés dans l'ensemble de données en question.

Charger le modèle affiné

Il peut être plus facile de charger un modèle que vous venez d'affiner. Toutefois, n'oubliez pas qu'à l'étape 3, il est appelé dans le champ d'application du code lui-même. Il conserve donc le modèle ajusté dans la variable tuned_model. Mais que faire si vous souhaitez appeler un modèle qui a été ajusté dans le passé ?

Pour ce faire, vous pouvez appeler la méthode get_tuned_model() sur le LLM avec l'URL complète du point de terminaison du modèle affiné déployé à partir de Vertex AI Model Registry. Notez que dans ce cas, vous saisissez le PROJECT_NUMBER et le MODEL_NUMBER au lieu de leurs ID respectifs.

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

8. Étape 5 : Évaluer le nouveau modèle affiné

L'évaluation est un aspect essentiel de l'évaluation de la qualité et de la pertinence de la réponse générée. Elle consiste à examiner la sortie d'un modèle de langage génératif pour déterminer sa cohérence, sa précision et son alignement avec la requête fournie. L'évaluation du modèle permet d'identifier les points à améliorer, d'optimiser les performances du modèle et de s'assurer que le texte généré répond aux normes de qualité et d'utilité souhaitées. Pour en savoir plus, consultez la documentation. Pour l'instant, nous allons voir comment obtenir des métriques d'évaluation sur le modèle affiné et les comparer au modèle de base.

  1. Chargez l'ensemble de données d'ÉVALUATION :
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. Définissez la spécification d'évaluation pour une tâche de résumé de texte sur le modèle affiné.
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

Cette étape prendra quelques minutes. Vous pouvez suivre la progression à l'aide du lien du job de pipeline dans le résultat. Une fois l'opération terminée, vous devriez obtenir le résultat d'évaluation suivant :

387843d6c970e02.png

La métrique rougeLSum dans le résultat de l'évaluation spécifie le score ROUGE-L pour le résumé. ROUGE-L est une métrique basée sur le rappel qui mesure le chevauchement entre un résumé et un résumé de référence. Elle est calculée en prenant la plus longue sous-séquence commune (LCS) entre les deux résumés et en la divisant par la longueur du résumé de référence.

Le score rougeLSum dans l'expression fournie est de 0,36600753600753694, ce qui signifie que le résumé présente un chevauchement de 36,6% avec le résumé de référence.

Si vous exécutez l'étape d'évaluation sur le modèle de référence, vous constaterez que le score du résumé est relativement plus élevé pour le modèle affiné.

Vous pouvez trouver les résultats de l'évaluation dans le répertoire de sortie Cloud Storage que vous avez spécifié lors de la création du job d'évaluation. Le fichier est nommé evaluation_metrics.json. Pour les modèles ajustés, vous pouvez également afficher les résultats d'évaluation dans la console Google Cloud sur la page Vertex AI Model Registry.

9. Remarques importantes

  • Compatibilité des modèles : consultez toujours la documentation du modèle pour connaître la dernière compatibilité.
  • Développement rapide : le domaine des LLM progresse rapidement. Un modèle plus récent et plus puissant pourrait potentiellement surpasser un modèle affiné basé sur une base plus ancienne. La bonne nouvelle, c'est que vous pouvez appliquer ces techniques d'affinage aux modèles plus récents lorsque la fonctionnalité devient disponible.
  • LoRA : LoRA est une technique permettant d'affiner efficacement les LLM. Pour ce faire, elle introduit des matrices de décomposition de faible rang entraînables dans les couches du modèle pré-entraîné existant. Pour en savoir plus, cliquez ici. Au lieu de mettre à jour tous les paramètres d'un LLM massif, LoRA apprend des matrices plus petites qui sont ajoutées aux matrices de pondération du modèle d'origine ou multipliées par celles-ci. Cela réduit considérablement le nombre de paramètres supplémentaires introduits lors de l'affinage.

10. Libérer de l'espace

Pour éviter que les ressources utilisées dans cet atelier de programmation soient facturées sur votre compte Google Cloud, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
  4. Vous pouvez également accéder à Model Registry, puis à l'onglet "Déployer et tester le modèle", puis annuler le déploiement du point de terminaison et supprimer le modèle ajusté déployé.

11. Félicitations

Félicitations ! Vous avez utilisé Vertex AI pour affiner un modèle LLM. L'affinage est une technique puissante qui vous permet de personnaliser les LLM en fonction de votre domaine et de vos tâches. Avec Vertex AI, vous disposez des outils et des ressources dont vous avez besoin pour affiner vos modèles de manière efficace.

Explorez les dépôts GitHub et testez l'exemple de code pour découvrir l'affinage et l'évaluation par vous-même. Déterminez comment les LLM affinés peuvent répondre à vos besoins spécifiques, qu'il s'agisse de générer des textes marketing ciblés, de résumer des documents complexes ou de traduire des langues avec des nuances culturelles. Utilisez la suite complète d'outils et de services proposés par Vertex AI pour créer, entraîner, évaluer et déployer facilement vos modèles affinés.