برنامج تعليمي حول التوليف الدقيق

العرض على ai.google.dev التنفيذ في Google Colab عرض المصدر على GitHub

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

قبل البدء: عليك إعداد مشروعك ومفتاح واجهة برمجة التطبيقات.

قبل طلب 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.