Gemini API: تنظیم مدل با پایتون

مشاهده در ai.google.dev در Google Colab اجرا شود مشاهده منبع در GitHub

در این نوت بوک، نحوه شروع به کار با سرویس تنظیم با استفاده از کتابخانه کلاینت پایتون برای Gemini API را خواهید آموخت. در اینجا، نحوه تنظیم مدل متن پشت سرویس تولید متن Gemini API را یاد خواهید گرفت.

برپایی

تصدیق کردن

Gemini API به شما امکان می دهد مدل ها را بر اساس داده های خود تنظیم کنید. از آنجایی که داده‌های شما و مدل‌های تنظیم‌شده شما هستند، به کنترل‌های دسترسی دقیق‌تری نسبت به API-Keys نیاز دارد.

قبل از اینکه بتوانید این آموزش را اجرا کنید، باید OAuth را برای پروژه خود راه اندازی کنید .

در Colab ساده‌ترین راه برای راه‌اندازی این است که محتویات فایل client_secret.json خود را در "Secrets manager" 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

ایجاد مدل تنظیم شده

برای ایجاد یک مدل تنظیم شده، باید مجموعه داده خود را به روش 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'
'IV'
result = model.generate_content('III')    # Roman numeral 3
result.text                               # Roman numeral 4 is 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.