Gemini API: Modellabstimmung mit Python

Auf ai.google.dev ansehen In Google Colab ausführen Quelle auf GitHub ansehen

In diesem Notebook lernen Sie die ersten Schritte mit dem Abstimmungsdienst mithilfe der Python-Clientbibliothek für die Gemini API kennen. Hier erfahren Sie, wie Sie das Textmodell hinter dem Textgenerierungsdienst der Gemini API abstimmen.

Einrichtung

Authentifizieren

Mit der Gemini API können Sie Modelle anhand Ihrer eigenen Daten abstimmen. Da es sich um Ihre Daten und Ihre abgestimmten Modelle handelt, ist eine strengere Zugriffssteuerung erforderlich als API-Schlüssel.

Bevor Sie diese Anleitung ausführen können, müssen Sie OAuth für Ihr Projekt einrichten.

Am einfachsten lässt sich die Einrichtung in Colab einrichten, indem Sie den Inhalt Ihrer client_secret.json-Datei in das Feld „Secrets Manager“ von Colab mit dem Secret-Namen CLIENT_SECRET kopieren (unter dem Schlüsselsymbol im linken Bereich).

Dieser gcloud-Befehl wandelt die Datei client_secret.json in Anmeldedaten um, die zur Authentifizierung beim Dienst verwendet werden können.

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'

Clientbibliothek installieren

pip install -q google-generativeai

Bibliotheken importieren

import google.generativeai as genai

Sie können vorhandene abgestimmte Modelle mit der Methode genai.list_tuned_model prüfen.

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

Abgestimmtes Modell erstellen

Zum Erstellen eines abgestimmten Modells müssen Sie Ihr Dataset in der Methode genai.create_tuned_model an das Modell übergeben. Dabei können Sie die Eingabe- und Ausgabewerte im Aufruf direkt definieren oder aus einer Datei in einen Dataframe importieren, um sie an die Methode zu übergeben.

In diesem Beispiel stimmen Sie ein Modell so ab, dass die nächste Zahl in der Sequenz generiert wird. Wenn die Eingabe beispielsweise 1 ist, sollte das Modell 2 ausgeben. Wenn die Eingabe one hundred ist, sollte die Ausgabe one hundred one sein.

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

Das abgestimmte Modell wird sofort in die Liste der abgestimmten Modelle aufgenommen. Der Status ist jedoch auf „Erstellen“ gesetzt, während das Modell abgestimmt ist.

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>

Fortschritt der Abstimmung prüfen

Verwenden Sie metadata, um den Status zu prüfen:

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

Warten Sie mit operation.result() oder operation.wait_bar(), bis das Training abgeschlossen ist

import time

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

Sie können den Abstimmungsjob jederzeit mit der Methode cancel() abbrechen. Entfernen Sie die Kommentarzeichen in der Zeile unten und führen Sie die Codezelle aus, um den Job abzubrechen, bevor er abgeschlossen ist.

# operation.cancel()

Sobald die Abstimmung abgeschlossen ist, können Sie sich die Verlustkurve in den Abstimmungsergebnissen ansehen. Die Verlustkurve zeigt, wie stark die Vorhersagen des Modells von den idealen Ausgaben abweichen.

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

Modell bewerten

Zum Testen der Modellleistung können Sie die Methode genai.generate_text verwenden und den Namen des Modells angeben.

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

Trotz der begrenzten Beispiele haben wir uns mit der Aufgabe beschäftigt, aber „Weiter“ ist ein einfaches Konzept. Weitere Informationen zur Leistungsverbesserung finden Sie im Leitfaden zur Optimierung.

Beschreibung aktualisieren

Sie können die Beschreibung Ihres abgestimmten Modells jederzeit mit der Methode genai.update_tuned_model aktualisieren.

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.'

Modell löschen

Sie können Ihre Liste mit abgestimmten Modellen bereinigen, indem Sie Modelle löschen, die Sie nicht mehr benötigen. Verwenden Sie die Methode genai.delete_tuned_model, um ein Modell zu löschen. Wenn Sie Abstimmungsjobs abgebrochen haben, sollten Sie diese löschen, da ihre Leistung unvorhersehbar sein kann.

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

Das Modell ist nicht mehr vorhanden:

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.