Instructivo de ajuste

Ver en ai.google.dev Ejecutar en Google Colab Ver el 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. Aprenderás a ajustar el modelo de texto en el servicio de generación de texto de la API de Gemini.

Antes de comenzar: Configura tu proyecto y clave de API

Antes de llamar a la API de Gemini, debes configurar tu proyecto y la clave de API.

Configuración

Configura la autenticación

La API de Gemini te permite ajustar modelos con tus propios datos. Dado que se trata de tus datos y tus modelos ajustados, esto requiere controles de acceso más estrictos que los que pueden proporcionar las claves de API.

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

La forma más fácil de realizar la configuración en Colab es copiar el contenido del 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 los 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. Para ello, define directamente los valores de entrada y salida en la llamada o importa desde un archivo a un marco de datos para pasar al método.

En 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 está ajustado.

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>

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 de los resultados del ajuste. La curva de pérdida muestra cuánto se desvían las predicciones del modelo 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 八!
'八'

Realmente parece haber recogido la tarea a pesar de los ejemplos limitados, pero "siguiente" es un concepto relativamente 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.'

Borra el modelo

Para limpiar tu lista de modelos ajustados, puedes borrar 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 que lo borres, 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.