Gemini API: настройка модели с помощью Python

Посмотреть на ai.google.dev Запустить в Google Colab Посмотреть исходный код на GitHub

Из этой записной книжки вы узнаете, как начать работу со службой настройки с использованием клиентской библиотеки Python для API Gemini. Здесь вы узнаете, как настроить текстовую модель службы генерации текста Gemini API.

Настраивать

Аутентификация

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