API de Gemini: Ajuste de modelos con Python

Ver en ai.google.dev Ejecutar en Google Colab Ver código fuente en GitHub

En este notebook, aprenderás a comenzar a usar el servicio de ajuste con la biblioteca cliente de Python para la API de Gemini. Aquí, aprenderás a ajustar el modelo de texto detrás del servicio de generación de texto de la API de Gemini.

Configuración

Autenticar

La API de Gemini te permite ajustar modelos en función de tus propios datos. Dado que son tus datos y tus modelos ajustados, se necesitan controles de acceso más estrictos que los que pueden proporcionar las claves de API.

Antes de que puedas ejecutar este instructivo, deberás configurar OAuth en tu proyecto.

En Colab, la forma más fácil de configurar es copiar el contenido de tu archivo client_secret.json en el "Administrador de secretos" de Colab (debajo del ícono de clave en el panel izquierdo) con el nombre del secreto CLIENT_SECRET.

Este comando de gcloud convierte el archivo client_secret.json en credenciales que se pueden usar para autenticarse con el servicio.

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'

Instala la biblioteca cliente

pip install -q google-generativeai

Importa las bibliotecas

import google.generativeai as genai

Puedes verificar tus modelos ajustados existentes con el método 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

Crear modelo ajustado

Para crear un modelo ajustado, debes pasar tu conjunto de datos al modelo en el método genai.create_tuned_model. Puedes hacerlo definiendo directamente los valores de entrada y salida en la llamada, o importando desde un archivo a un marco de datos para pasar al método.

Para este ejemplo, ajustarás un modelo para generar el siguiente número en la secuencia. Por ejemplo, si la entrada es 1, el modelo debería generar 2. Si la entrada es one hundred, el resultado debe ser 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,
)

Tu modelo ajustado se agrega inmediatamente a la lista de modelos ajustados, pero su estado se establece en “Creando” mientras el modelo se ajusta.

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>

Cómo verificar el progreso del ajuste

Usa metadata para verificar el estado:

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

Espera a que finalice el entrenamiento con operation.result() o operation.wait_bar().

import time

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

Puedes cancelar tu trabajo de ajuste en cualquier momento con el método cancel(). Quita el comentario de la siguiente línea y ejecuta la celda de código para cancelar el trabajo antes de que finalice.

# operation.cancel()

Una vez que se complete el ajuste, podrás ver la curva de pérdida desde los resultados del ajuste. La curva de pérdida muestra en qué medida las predicciones del modelo se desvían de los resultados ideales.

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

Evalúa tu modelo

Puedes usar el método genai.generate_text y especificar el nombre de tu modelo para probar su rendimiento.

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

Parece que se retomó la tarea a pesar de los pocos ejemplos, pero “siguiente” es un concepto simple. Consulta la guía de ajuste para obtener más información sobre cómo mejorar el rendimiento.

Actualiza la descripción

Puedes actualizar la descripción de tu modelo ajustado en cualquier momento con el método 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.'

Borrar el modelo

Puedes limpiar tu lista de modelos ajustados si borras los modelos que ya no necesitas. Usa el método genai.delete_tuned_model para borrar un modelo. Si cancelaste algún trabajo de ajuste, te recomendamos borrarlo, ya que su rendimiento puede ser impredecible.

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

El modelo ya no existe:

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.