Gemini API: Penyesuaian model dengan Python

Lihat di ai.google.dev Menjalankan di Google Colab Lihat sumber di GitHub

Di notebook ini, Anda akan mempelajari cara memulai layanan tuning menggunakan library klien Python untuk Gemini API. Di sini, Anda akan mempelajari cara menyesuaikan model teks di balik layanan pembuatan teks Gemini API.

Penyiapan

Autentikasikan

Gemini API memungkinkan Anda menyesuaikan model dengan data Anda sendiri. Karena data Anda adalah data Anda dan model yang telah disesuaikan, hal ini memerlukan kontrol akses yang lebih ketat daripada yang dapat diberikan oleh Kunci API.

Sebelum dapat menjalankan tutorial ini, Anda harus menyiapkan OAuth untuk project Anda.

Di Colab, langkah yang paling mudah untuk disiapkan adalah dengan menyalin konten file client_secret.json Anda ke "Secret Manager" Colab (di bawah ikon kunci di panel kiri) dengan nama rahasia CLIENT_SECRET.

Perintah gcloud ini mengubah file client_secret.json menjadi kredensial yang dapat digunakan untuk melakukan autentikasi dengan layanan.

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'

Menginstal library klien

pip install -q google-generativeai

Mengimpor library

import google.generativeai as genai

Anda dapat memeriksa model yang telah disesuaikan dengan metode 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

Membuat model yang di-tuning

Untuk membuat model yang disesuaikan, Anda harus meneruskan set data ke model dalam metode genai.create_tuned_model. Anda dapat melakukan ini dengan langsung menentukan nilai input dan output dalam panggilan atau mengimpor dari file ke dalam dataframe untuk diteruskan ke metode.

Untuk contoh ini, Anda akan men-tuning model untuk menghasilkan angka berikutnya dalam urutan tersebut. Misalnya, jika inputnya adalah 1, model akan menghasilkan 2. Jika inputnya adalah one hundred, outputnya harus 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 yang telah Anda sesuaikan akan langsung ditambahkan ke daftar model yang telah disesuaikan, tetapi statusnya ditetapkan ke "membuat" saat model tersebut di-tuning.

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>

Memeriksa progres tuning

Gunakan metadata untuk memeriksa status:

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

Tunggu hingga pelatihan selesai menggunakan operation.result(), atau operation.wait_bar()

import time

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

Anda dapat membatalkan tugas tuning kapan saja menggunakan metode cancel(). Hapus tanda komentar pada baris di bawah dan jalankan sel kode untuk membatalkan tugas sebelum tugas selesai.

# operation.cancel()

Setelah tuning selesai, Anda dapat melihat kurva kerugian dari hasil tuning. Kurva kerugian menunjukkan seberapa besar penyimpangan prediksi model dari output ideal.

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

Mengevaluasi model Anda

Anda dapat menggunakan metode genai.generate_text dan menentukan nama model untuk menguji performa model Anda.

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

Sepertinya tugas tersebut berhasil diterapkan meskipun contohnya terbatas, tetapi "berikutnya" adalah konsep yang sederhana. Lihat panduan penyesuaian untuk mendapatkan panduan lebih lanjut tentang cara meningkatkan performa.

Memperbarui deskripsi

Anda dapat memperbarui deskripsi model yang telah disesuaikan kapan saja menggunakan metode 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.'

Menghapus model

Anda dapat merapikan daftar model yang telah disesuaikan dengan menghapus model yang tidak lagi diperlukan. Gunakan metode genai.delete_tuned_model untuk menghapus model. Jika membatalkan tugas tuning, Anda dapat menghapusnya karena performanya mungkin tidak dapat diprediksi.

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

Model sudah tidak ada:

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.