Visualizza su ai.google.dev | Esegui in Google Colab | Visualizza il codice sorgente su GitHub |
In questo blocco note, imparerai a iniziare a utilizzare il servizio di ottimizzazione utilizzando la libreria client Python per l'API Gemini. Qui imparerai a ottimizzare il modello di testo alla base del servizio di generazione di testi dell'API Gemini.
Configurazione
Autentica
L'API Gemini ti consente di ottimizzare i modelli sulla base dei tuoi dati. Poiché si tratta dei tuoi dati e dei tuoi modelli ottimizzati, sono necessari controlli dell'accesso più rigidi di quelli offerti dalle chiavi API.
Prima di poter eseguire questo tutorial, dovrai configurare OAuth per il tuo progetto.
In Colab, il modo più semplice per configurare è copiare i contenuti del tuo file client_secret.json
nel "Secret manager " di Colab (sotto l'icona della chiave nel riquadro a sinistra) con il nome secret CLIENT_SECRET
.
Questo comando gcloud trasforma il file client_secret.json
in credenziali che possono essere utilizzate per l'autenticazione con il servizio.
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'
installa la libreria client
pip install -q google-generativeai
Importa librerie
import google.generativeai as genai
Puoi verificare i modelli ottimizzati esistenti con il metodo 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
Crea modello ottimizzato
Per creare un modello ottimizzato, devi passare il tuo set di dati al modello nel metodo genai.create_tuned_model
. Puoi definire direttamente i valori di input e output nella chiamata o importare da un file in un dataframe per passare al metodo.
Per questo esempio, ottimizzerai un modello per generare il numero successivo nella sequenza. Ad esempio, se l'input è 1
, il modello dovrebbe restituire 2
. Se l'input è one hundred
, l'output deve essere 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,
)
Il modello ottimizzato viene aggiunto immediatamente all'elenco dei modelli ottimizzati, ma il suo stato viene impostato su "creazione in corso" mentre il modello viene ottimizzato.
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>
Controlla l'avanzamento dell'ottimizzazione
Usa metadata
per controllare lo stato:
operation.metadata
total_steps: 375 tuned_model: "tunedModels/generate-num-2946"
Attendi il completamento dell'addestramento 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]
Puoi annullare il job di ottimizzazione in qualsiasi momento utilizzando il metodo cancel()
. Rimuovi il commento dalla riga seguente ed esegui la cella di codice per annullare il job prima che termini.
# operation.cancel()
Una volta completata l'ottimizzazione, puoi visualizzare la curva di perdita dai risultati dell'ottimizzazione. La curva di perdita mostra la deviazione delle previsioni del modello dagli output ideali.
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'>
valuta il modello
Puoi usare il metodo genai.generate_text
e specificare il nome del modello per testarne le prestazioni.
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 八!
'八'
Sembra che abbia colto l'attività nonostante gli esempi limitati, ma "next" è un concetto semplice. Consulta la guida all'ottimizzazione per ulteriori indicazioni su come migliorare il rendimento.
Aggiorna la descrizione
Puoi aggiornare la descrizione del modello ottimizzato in qualsiasi momento utilizzando il metodo 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.'
Elimina il modello
Puoi ripulire l'elenco dei modelli ottimizzati eliminando quelli che non ti servono più. Usa il metodo genai.delete_tuned_model
per eliminare un modello. Se hai annullato dei job di ottimizzazione, ti consigliamo di eliminarli poiché le loro prestazioni potrebbero essere imprevedibili.
genai.delete_tuned_model(f'tunedModels/{name}')
Il modello non esiste più:
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.