Tutorial sul perfezionamento

Visualizza su ai.google.dev Esegui in Google Colab Visualizza il codice sorgente su GitHub

In questo blocco note imparerai come iniziare a utilizzare il servizio di ottimizzazione utilizzando la libreria client Python per l'API Gemini. Imparerai come ottimizzare il modello di testo alla base del servizio di generazione del testo dell'API Gemini.

Prima di iniziare: configura il progetto e la chiave API

Prima di chiamare l'API Gemini, devi impostare il progetto e configurare la chiave API.

Imposta

Configura l'autenticazione

L'API Gemini ti consente di ottimizzare i modelli in base ai tuoi dati. Poiché si tratta dei tuoi dati e dei tuoi modelli ottimizzati, ciò richiede controlli di accesso più rigidi di quelli forniti dalle chiavi API.

Prima di poter eseguire questo tutorial, dovrai configurare OAuth per il tuo progetto.

Il modo più semplice per effettuare la configurazione in Colab è copiare i contenuti del tuo file client_secret.json in "Secret Manager " di Colab (sotto l'icona della chiave nel riquadro a sinistra) con il nome del secret CLIENT_SECRET.

Questo comando gcloud trasforma il file client_secret.json in credenziali da utilizzare 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 tuoi 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. A tale scopo, puoi definire direttamente i valori di input e output nella chiamata o importarli da un file in un dataframe per passare al metodo.

In 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 dovrebbe 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 lo stato è impostato su "creazione" mentre il modello è 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 utilizzando operation.result() oppure 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 finisca.

# operation.cancel()

Una volta completata l'ottimizzazione, puoi visualizzare la curva di perdita dai risultati dell'ottimizzazione. La curva di perdita mostra in che misura le previsioni del modello si discostano 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'>

png

valuta il modello

Puoi utilizzare il metodo genai.generate_text e specificare il nome del tuo 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 già iniziato l'attività nonostante gli esempi limitati, ma "next" è un concetto relativamente semplice. Consulta la guida all'ottimizzazione per ulteriori indicazioni su come migliorare le prestazioni.

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 ottimizzato eliminando i modelli che non ti servono più. Utilizza il metodo genai.delete_tuned_model per eliminare un modello. Se hai annullato 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.