Gemini API: כוונון מודלים באמצעות Python

לצפייה ב-ai.google.dev הפעלה ב-Google Colab הצגת המקור ב-GitHub

ב-notebook הזה תלמדו איך להתחיל להשתמש בשירות הכוונון באמצעות ספריית הלקוח של Python ל-Gemini API. כאן תלמדו איך לכוונן את מודל הטקסט שמאחורי שירות יצירת הטקסט של Gemini API.

הגדרה

אמת

Gemini API מאפשר להתאים מודלים לפי הנתונים שלך. מכיוון שאלו הנתונים שלכם והמודלים המכווננים שלכם, הם זקוקים לבקרות גישה מחמירות יותר מאלה שמפתחות API יכולים לספק.

לפני שתוכלו להריץ את המדריך הזה, תצטרכו להגדיר OAuth לפרויקט.

ב-Colab, הדרך הקלה ביותר להגדרה היא להעתיק את תוכן הקובץ client_secret.json אל 'מנהל הסודות' של Colab (מתחת לסמל המפתח בחלונית הימנית) עם השם הסודי CLIENT_SECRET.

הפקודה הזו ב-gcloud הופכת את הקובץ client_secret.json לפרטי כניסה שבהם אפשר להשתמש לצורך אימות עם השירות.

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'

התקנת ספריית הלקוח

pip install -q google-generativeai

ייבוא ספריות

import google.generativeai as genai

אפשר לבדוק מודלים מכווננים קיימים באמצעות השיטה 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

יצירת מודל שעבר כוונון

כדי ליצור מודל מכוונן, צריך להעביר את מערך הנתונים למודל ב-method genai.create_tuned_model. אפשר לעשות זאת על ידי הגדרה ישירה של ערכי הקלט והפלט בקריאה או ייבוא מקובץ למסגרת נתונים שיועברו לשיטה.

בדוגמה הזו, תצטרכו לכוונן את המודל כדי לייצר את המספר הבא ברצף. לדוגמה, אם הקלט הוא 1, הפלט של המודל הוא 2. אם הקלט הוא one hundred, הפלט אמור להיות 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,
)

המודל המכוונן מתווסף מיד לרשימת המודלים המכווננים, אבל הסטטוס שלו מוגדר כ'יוצר' בזמן שהמודל מתבצע.

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>

בדיקת ההתקדמות בכוונון

משתמשים ב-metadata כדי לבדוק את המצב:

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

צריך להמתין שהאימון יסתיים באמצעות שימוש ב-operation.result() או ב-operation.wait_bar()

import time

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

ניתן לבטל את עבודת הכוונון בכל שלב באמצעות השיטה cancel(). מבטלים את הוספת ההערה לשורה שלמטה ומריצים את תא הקוד כדי לבטל את המשימה לפני שהיא מסתיימת.

# operation.cancel()

לאחר שהכוונון יסתיים, תוכל לראות את עקומת האובדן מתוך תוצאות הכוונון. עקומת אובדן מראה את מידת הסטייה של החיזויים של המודל מהפלטים האידיאליים.

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

הערכת המודל

אפשר להשתמש בשיטה genai.generate_text ולציין את שם המודל כדי לבדוק את ביצועי המודל.

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

נראה שהצלחתם לבצע את המשימה למרות מספר מוגבל של דוגמאות, אבל 'הבא' הוא קונספט פשוט. במדריך הכוונון תמצאו הנחיות נוספות לשיפור הביצועים.

עדכון התיאור

אפשר לעדכן את התיאור של המודל המכוונן בכל שלב באמצעות השיטה 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.'

מחיקת המודל

אפשר לנקות את רשימת המודלים המכווננים על ידי מחיקת מודלים שכבר אין בהם צורך. כדי למחוק מודל, משתמשים בשיטה genai.delete_tuned_model. אם ביטלתם משימות כוונון, כדאי למחוק אותן כי יכול להיות שהביצועים שלהן לא יהיו צפויים.

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

המודל לא קיים יותר:

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.