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