Gemini API: dostrajanie modeli w Pythonie

Zobacz na ai.google.dev Uruchom w Google Colab Wyświetl źródło na GitHubie

Z tego notatnika dowiesz się, jak zacząć korzystać z usługi dostrajania przy użyciu biblioteki klienta w języku Python na potrzeby interfejsu Gemini API. W tym artykule dowiesz się, jak dostroić model tekstowy odpowiedzialny za usługę generowania tekstu przez interfejs Gemini API.

Konfiguracja

Uwierzytelnij

Interfejs Gemini API umożliwia dostrajanie modeli na podstawie Twoich własnych danych. To Twoje dane i dostrojone modele, wymagają więc bardziej rygorystycznej kontroli dostępu niż klucz API.

Zanim uruchomisz ten samouczek, musisz skonfigurować OAuth w swoim projekcie.

W Colab najłatwiej skopiować zawartość pliku client_secret.json do „Menedżera obiektów tajnych” w Colab (pod ikoną klucza w panelu po lewej stronie) o nazwie CLIENT_SECRET.

To polecenie gcloud przekształca plik client_secret.json w dane logowania, których można używać do uwierzytelniania w usłudze.

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'

Instalowanie biblioteki klienta

pip install -q google-generativeai

Importuj biblioteki

import google.generativeai as genai

Istniejące dostrojone modele możesz sprawdzić za pomocą metody 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

Utwórz model dostrojony

Aby utworzyć model dostrojony, musisz przekazać mu zbiór danych w metodzie genai.create_tuned_model. Możesz to zrobić bezpośrednio przez definiowanie wartości wejściowych i wyjściowych w wywołaniu lub importować dane z pliku do ramki danych w celu przekazania tej metody do tej metody.

W tym przykładzie dostrojesz model tak, aby wygenerował kolejną liczbę w sekwencji. Jeśli np. dane wejściowe to 1, model powinien zwrócić wynik 2. Jeśli dane wejściowe to one hundred, dane wyjściowe powinny mieć postać 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,
)

Dostrojony model zostanie natychmiast dodany do listy dostrojonych modeli, ale jego stan będzie ustawiony na „tworzenie” podczas dostrajania.

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>

Sprawdzanie postępu dostrajania

Użyj narzędzia metadata, aby sprawdzić stan:

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

Poczekaj na zakończenie trenowania przy użyciu dodatku operation.result() lub operation.wait_bar()

import time

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

Zadanie dostrajania możesz w każdej chwili anulować, korzystając z metody cancel(). Usuń znacznik komentarza z wiersza poniżej i uruchom komórkę z kodem, aby anulować zadanie, zanim zostanie zakończone.

# operation.cancel()

Po zakończeniu dostrajania możesz zobaczyć krzywą straty w wynikach dostrajania. Krzywa straty pokazuje, w jakim stopniu prognozy modelu odbiegają od idealnych danych wyjściowych.

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

Ocenianie modelu

Aby przetestować wydajność modelu, możesz użyć metody genai.generate_text i podać nazwę modelu.

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

Wygląda na to, że pomimo nielicznych przykładów udało się wykonać zadanie, ale pojęcie „dalej” jest proste. Więcej informacji o poprawianiu skuteczności znajdziesz w przewodniku po dostrajaniu.

Zaktualizuj opis

Opis dostrojonego modelu możesz zaktualizować w dowolnym momencie, korzystając z metody 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.'

Usuwanie modelu

Listę dostrojonych modeli możesz wyczyścić, usuwając te, których już nie potrzebujesz. Aby usunąć model, użyj metody genai.delete_tuned_model. Jeśli anulujesz zadania dostrajania, możesz je usunąć, ponieważ ich wydajność może być nieprzewidywalna.

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

Model już nie istnieje:

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.