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