Anleitung zur Optimierung

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

In diesem Notebook erfahren Sie, wie Sie den Abstimmungsdienst mithilfe der Python-Clientbibliothek für die Gemini API starten. Hier erfahren Sie, wie Sie das Textmodell hinter dem Textgenerierungsdienst der Gemini API abstimmen.

Hinweis: Projekt und API-Schlüssel einrichten

Bevor Sie die Gemini API aufrufen, müssen Sie Ihr Projekt einrichten und Ihren API-Schlüssel konfigurieren.

Einrichtung

Authentifizierung einrichten

Mit der Gemini API können Sie Modelle anhand Ihrer eigenen Daten abstimmen. Da es sich um Ihre Daten und Ihre abgestimmten Modelle handelt, sind dafür strengere Zugriffskontrollen erforderlich, als API-Schlüssel bieten können.

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

Die einfachste Möglichkeit, Colab einzurichten, besteht darin, den Inhalt Ihrer client_secret.json-Datei mit dem Secret-Namen CLIENT_SECRET in den „Secrets Manager“ von Colab (unter dem Schlüsselsymbol im linken Bereich) zu kopieren.

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 Ihre vorhandenen abgestimmten 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 das Dataset in der Methode genai.create_tuned_model an das Modell übergeben. Dazu können Sie die Eingabe- und Ausgabewerte im Aufruf direkt definieren oder aus einer Datei in einen DataFrame importieren, der an die Methode übergeben wird.

In diesem Beispiel stimmen Sie ein Modell ab, um die nächste Zahl in der Sequenz zu generieren. 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 der Liste der abgestimmten Modelle hinzugefügt. Sein Status wird jedoch während der Feinabstimmung auf "Wird erstellt" gesetzt.

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(), bis das Training abgeschlossen ist, oder operation.wait_bar()

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 der folgenden Zeile 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 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

Sie können die Methode genai.generate_text verwenden und den Namen Ihres Modells angeben, um die Modellleistung zu testen.

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 wenigen Beispiele scheint die Aufgabe erledigt zu sein, aber „Weiter“ ist ein relativ einfaches Konzept. Weitere Informationen zur Verbesserung der Leistung finden Sie im Leitfaden zur Abstimmung.

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 die Liste der abgestimmten Modelle bereinigen, indem Sie nicht mehr benötigte Modelle löschen. 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 die Leistung nicht vorhersehbar ist.

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.