Gemini API: Python ile model ayarlama

ai.google.dev'de görüntüleyin Google Colab'de çalıştır Kaynağı GitHub'da görüntüleyin

Bu not defterinde, Gemini API için Python istemci kitaplığını kullanarak ince ayar hizmetini nasıl kullanmaya başlayacağınızı öğreneceksiniz. Burada, Gemini API'nin metin oluşturma hizmetinin temelindeki metin modelini nasıl ayarlayabileceğinizi öğreneceksiniz.

Kurulum

Kimliği doğrula

Gemini API, modelleri kendi verilerinize göre ayarlamanıza olanak tanır. Söz konusu olan sizin verileriniz ve hassaslaştırılmış modelleriniz olduğu için bu, API Anahtarlarının sağlayabileceğinden daha sıkı erişim denetimleri gerektirir.

Bu eğiticiyi çalıştırmadan önce projeniz için OAuth'u kurmanız gerekir.

Colab'de kurulumun en kolay yolu, client_secret.json dosyanızın içeriğini CLIENT_SECRET gizli adıyla Colab'ın "Secrets Manager"ına (sol paneldeki anahtar simgesinin altında) kopyalamaktır.

Bu gcloud komutu, client_secret.json dosyasını hizmetle kimlik doğrulamak amacıyla kullanılabilecek kimlik bilgilerine dönüştürür.

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'

İstemci kitaplığını yükleme

pip install -q google-generativeai

Kitaplıkları içe aktar

import google.generativeai as genai

Mevcut hassaslaştırılmış modellerinizi genai.list_tuned_model yöntemini kullanarak kontrol edebilirsiniz.

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

Hassaslaştırılmış model oluşturun

Hassaslaştırılmış model oluşturmak için veri kümenizi genai.create_tuned_model yönteminde modele geçirmeniz gerekir. Bunu, çağrıdaki giriş ve çıkış değerlerini doğrudan tanımlayarak veya yönteme geçirmek üzere bir dosyadan veri çerçevesine içe aktararak yapabilirsiniz.

Bu örnekte, dizideki bir sonraki sayıyı oluşturmak için bir modeli ayarlayacaksınız. Örneğin, giriş 1 ise modelin çıkışı 2 olmalıdır. Giriş one hundred ise çıkış one hundred one olmalıdır.

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

Hassaslaştırılmış modeliniz, hassaslaştırılmış modeller listesine hemen eklenir, ancak model ayarlanırken durumu "oluşturuluyor" olarak ayarlanır.

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>

Ayarlama işleminin ilerleme durumunu kontrol etme

Durumu kontrol etmek için metadata öğesini kullanın:

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

operation.result() veya operation.wait_bar() ile eğitimin tamamlanmasını bekleyin.

import time

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

Ayarlama işinizi istediğiniz zaman cancel() yöntemini kullanarak iptal edebilirsiniz. Aşağıdaki satırın açıklamasını kaldırın ve tamamlanmadan önce işinizi iptal etmek için kod hücresini çalıştırın.

# operation.cancel()

Ayarlama tamamlandıktan sonra, ayarlama sonuçlarından kayıp eğrisini görüntüleyebilirsiniz. Kayıp eğrisi, modelin tahminlerinin ideal çıktılardan ne kadar farklı olduğunu gösterir.

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

Modelinizi değerlendirme

Model performansınızı test etmek için genai.generate_text yöntemini kullanabilir ve modelinizin adını belirtebilirsiniz.

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

Az sayıda örneğe rağmen, bu görevin üstesinden gelinmiş gibi görünüyor. Ancak "sonraki" basit bir kavramdır. Performansı artırmayla ilgili daha fazla yardım için ayarlama kılavuzuna bakın.

Açıklamayı güncelle

Hassaslaştırılmış modelinizin açıklamasını, genai.update_tuned_model yöntemini kullanarak istediğiniz zaman güncelleyebilirsiniz.

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

Modeli silin

Artık ihtiyacınız olmayan modelleri silerek hassaslaştırılmış model listenizi temizleyebilirsiniz. Bir modeli silmek için genai.delete_tuned_model yöntemini kullanın. Ayarlama işlerini iptal ettiyseniz performansları tahmin edilemeyeceği için bunları silmek isteyebilirsiniz.

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

Model artık mevcut değil:

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.