API Gemini: réglage de modèle avec Python

Voir sur ai.google.dev Exécuter dans Google Colab Afficher la source sur GitHub

Dans ce notebook, vous allez apprendre à utiliser le service de réglage à l'aide de la bibliothèque cliente Python pour l'API Gemini. Ici, vous allez apprendre à régler le modèle de texte du service de génération de texte de l'API Gemini.

Préparation

Authentifier

L'API Gemini vous permet de régler des modèles à partir de vos propres données. Étant donné qu'il s'agit de vos données et de vos modèles ajustés, des contrôles d'accès plus stricts sont nécessaires que les clés API ne peuvent fournir.

Avant de pouvoir exécuter ce tutoriel, vous devez configurer OAuth pour votre projet.

Dans Colab, la méthode la plus simple pour configurer consiste à copier le contenu de votre fichier client_secret.json dans le "Gestionnaire de secrets " de Colab (sous l'icône en forme de clé dans le panneau de gauche) avec le nom du secret CLIENT_SECRET.

Cette commande gcloud transforme le fichier client_secret.json en identifiants permettant de s'authentifier auprès du service.

import os
if 'COLAB_RELEASE_TAG' in os.environ:
  from google.colab import userdata
  import pathlib
  pathlib.Path('client_secret.json').write_text(userdata.get('CLIENT_SECRET'))

  # Use `--no-browser` in colab
  !gcloud auth application-default login --no-browser --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
else:
  !gcloud auth application-default login --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'

Installer la bibliothèque cliente

pip install -q google-generativeai

Importer des bibliothèques

import google.generativeai as genai

Vous pouvez vérifier les modèles réglés existants à l'aide de la méthode genai.list_tuned_model.

for i, m in zip(range(5), genai.list_tuned_models()):
  print(m.name)
tunedModels/my-model-8527
tunedModels/my-model-7092
tunedModels/my-model-2778
tunedModels/my-model-1298
tunedModels/my-model-3883

Créer un modèle réglé

Pour créer un modèle réglé, vous devez transmettre votre ensemble de données au modèle dans la méthode genai.create_tuned_model. Vous pouvez le faire en définissant directement les valeurs d'entrée et de sortie dans l'appel ou en important à partir d'un fichier dans un DataFrame à transmettre à la méthode.

Dans cet exemple, vous allez régler un modèle pour générer le nombre suivant de la séquence. Par exemple, si l'entrée est 1, le modèle doit générer 2. Si l'entrée est one hundred, la sortie doit être one hundred one.

base_model = [
    m for m in genai.list_models()
    if "createTunedModel" in m.supported_generation_methods][0]
base_model
Model(name='models/gemini-1.0-pro-001',
      base_model_id='',
      version='001',
      display_name='Gemini 1.0 Pro',
      description=('The best model for scaling across a wide range of tasks. This is a stable '
                   'model that supports tuning.'),
      input_token_limit=30720,
      output_token_limit=2048,
      supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'],
      temperature=0.9,
      top_p=1.0,
      top_k=1)
import random

name = f'generate-num-{random.randint(0,10000)}'
operation = genai.create_tuned_model(
    # You can use a tuned model here too. Set `source_model="tunedModels/..."`
    source_model=base_model.name,
    training_data=[
        {
             'text_input': '1',
             'output': '2',
        },{
             'text_input': '3',
             'output': '4',
        },{
             'text_input': '-3',
             'output': '-2',
        },{
             'text_input': 'twenty two',
             'output': 'twenty three',
        },{
             'text_input': 'two hundred',
             'output': 'two hundred one',
        },{
             'text_input': 'ninety nine',
             'output': 'one hundred',
        },{
             'text_input': '8',
             'output': '9',
        },{
             'text_input': '-98',
             'output': '-97',
        },{
             'text_input': '1,000',
             'output': '1,001',
        },{
             'text_input': '10,100,000',
             'output': '10,100,001',
        },{
             'text_input': 'thirteen',
             'output': 'fourteen',
        },{
             'text_input': 'eighty',
             'output': 'eighty one',
        },{
             'text_input': 'one',
             'output': 'two',
        },{
             'text_input': 'three',
             'output': 'four',
        },{
             'text_input': 'seven',
             'output': 'eight',
        }
    ],
    id = name,
    epoch_count = 100,
    batch_size=4,
    learning_rate=0.001,
)

Votre modèle réglé est immédiatement ajouté à la liste des modèles réglés, mais son état est défini sur "Création" pendant le réglage.

model = genai.get_tuned_model(f'tunedModels/{name}')

model
TunedModel(name='tunedModels/generate-num-2946',
           source_model='models/gemini-1.0-pro-001',
           base_model='models/gemini-1.0-pro-001',
           display_name='',
           description='',
           temperature=0.9,
           top_p=1.0,
           top_k=1,
           state=<State.CREATING: 1>,
           create_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 448050, tzinfo=datetime.timezone.utc),
           update_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 448050, tzinfo=datetime.timezone.utc),
           tuning_task=TuningTask(start_time=datetime.datetime(2024, 2, 21, 20, 4, 16, 890698, tzinfo=datetime.timezone.utc),
                                  complete_time=None,
                                  snapshots=[],
                                  hyperparameters=Hyperparameters(epoch_count=100,
                                                                  batch_size=4,
                                                                  learning_rate=0.001)))
model.state
<State.CREATING: 1>

Vérifier la progression du réglage

Utilisez metadata pour vérifier l'état:

operation.metadata
total_steps: 375
tuned_model: "tunedModels/generate-num-2946"

Attendez la fin de l'entraînement avec operation.result() ou operation.wait_bar().

import time

for status in operation.wait_bar():
  time.sleep(30)
0%|          | 0/375 [00:00<?, ?it/s]

Vous pouvez annuler la tâche de réglage à tout moment à l'aide de la méthode cancel(). Annulez la mise en commentaire de la ligne ci-dessous et exécutez la cellule de code pour annuler votre job avant qu'il ne soit terminé.

# operation.cancel()

Une fois le réglage terminé, vous pouvez consulter la courbe de fonction de perte à partir des résultats du réglage. La courbe de perte indique dans quelle mesure les prédictions du modèle s'écartent des résultats idéaux.

import pandas as pd
import seaborn as sns

model = operation.result()

snapshots = pd.DataFrame(model.tuning_task.snapshots)

sns.lineplot(data=snapshots, x = 'epoch', y='mean_loss')
<Axes: xlabel='epoch', ylabel='mean_loss'>

png

Évaluer votre modèle

Pour tester les performances du modèle, vous pouvez utiliser la méthode genai.generate_text et spécifier le nom de votre modèle.

model = genai.GenerativeModel(model_name=f'tunedModels/{name}')
result = model.generate_content('55')
result.text
'56'
result = model.generate_content('123455')
result.text
'123456'
result = model.generate_content('four')
result.text
'five'
result = model.generate_content('quatre') # French 4
result.text                               # French 5 is "cinq"
'cinq'
result = model.generate_content('III')    # Roman numeral 3
result.text                               # Roman numeral 4 is IV
'IV'
result = model.generate_content('七')  # Japanese 7
result.text                            # Japanese 8 is 八!
'八'

Même si le nombre d'exemples est limité, la tâche s'est réellement acquittée, mais le concept "suivant" est simple. Consultez le guide de réglages pour savoir comment améliorer vos performances.

Mettre à jour la description

Vous pouvez modifier la description de votre modèle réglé à tout moment à l'aide de la méthode genai.update_tuned_model.

genai.update_tuned_model(f'tunedModels/{name}', {"description":"This is my model."});
model = genai.get_tuned_model(f'tunedModels/{name}')

model.description
'This is my model.'

Supprimer le modèle

Vous pouvez nettoyer votre liste de modèles réglés en supprimant les modèles dont vous n'avez plus besoin. Utilisez la méthode genai.delete_tuned_model pour supprimer un modèle. Si vous avez annulé des jobs de réglage, vous pouvez les supprimer, car leurs performances peuvent être imprévisibles.

genai.delete_tuned_model(f'tunedModels/{name}')

Le modèle n'existe plus:

try:
  m = genai.get_tuned_model(f'tunedModels/{name}')
  print(m)
except Exception as e:
  print(f"{type(e)}: {e}")
<class 'google.api_core.exceptions.NotFound'>: 404 Tuned model tunedModels/generate-num-2946 does not exist.