API Gemini: ottimizzazione del modello con Python

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

png

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.