Tutoriel d'optimisation

Afficher sur ai.google.dev Exécuter dans Google Colab Consulter le code 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. Vous allez apprendre à régler le modèle de texte du service de génération de texte de l'API Gemini.

Avant de commencer: configurer votre projet et votre clé API

Avant d'appeler l'API Gemini, vous devez configurer votre projet et votre clé API.

Préparation

Configurer l'authentification

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 réglés, cela nécessite des contrôles d'accès plus stricts que ceux fournis par les clés API.

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

Le moyen le plus simple de se configurer dans Colab 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 de 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 vos modèles réglés existants avec 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 lui transmettre votre ensemble de données via la méthode genai.create_tuned_model. Pour ce faire, définissez directement les valeurs d'entrée et de sortie dans l'appel, ou importez 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 dans 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 passe à "création" pendant le réglage du modèle.

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 en utilisant 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 votre job 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 tâche avant qu'elle ne soit terminée.

# operation.cancel()

Une fois le réglage terminé, vous pouvez afficher 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

Vous pouvez utiliser la méthode genai.generate_text et spécifier le nom de votre modèle pour tester ses performances.

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 八!
'八'

Il semble que la tâche ait repris, malgré les exemples limités, mais "next" est un concept relativement simple. Consultez le guide de réglage pour obtenir plus de conseils sur l'amélioration des performances.

Mettre à jour la description

Vous pouvez mettre à jour 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 ceux dont vous n'avez plus besoin. Utilisez la méthode genai.delete_tuned_model pour supprimer un modèle. Si vous avez annulé des tâches 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.