Gemini API: ضبط النماذج باستخدام Python

العرض على ai.google.dev التشغيل في Google Colab الاطّلاع على المصدر على GitHub

ستتعلم في هذا الدفتر كيفية بدء خدمة الضبط باستخدام مكتبة عملاء بايثون في واجهة برمجة تطبيقات Gemini. ستتعرّف هنا على كيفية ضبط النموذج النصي من خلال خدمة إنشاء النصوص في Gemini API.

ضبط إعدادات الجهاز

مصادقة

تتيح لك واجهة Gemini 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

إنشاء نموذج تم ضبطه

لإنشاء نموذج تم ضبطه، عليك تمرير مجموعة البيانات إلى النموذج في طريقة 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.