API de REST: Guía de inicio rápido de ajuste

Ver en ai.google.dev Ejecutar en Google Colab Ver código fuente en GitHub Descargar notebook

En este notebook, aprenderás cómo comenzar a usar el servicio de ajuste de la API de PaLM con comandos curl o la API de solicitud de Python para llamar a la API de REST de PaLM. Aquí, aprenderás a ajustar el modelo de texto detrás del servicio de generación de texto de la API de PaLM.

Configuración

Autenticar

La API de PaLM 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.

Si quieres ejecutar este notebook en Colab, comienza por subir el archivo client_secret*.json con la opción “Archivo > Subir”.

Mostrar la opción Archivo > Subir de Colab

cp client_secret*.json client_secret.json
ls
client_secret.json

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

Llamar a la API de REST con CURL

En esta sección, se proporcionan instrucciones curl de ejemplo para llamar a la API de REST. Aprenderás a crear un trabajo de ajuste, verificar su estado y, cuando se complete, hacer una llamada de inferencia.

Establece variables

Configura las variables para valores recurrentes que se usarán en el resto de las llamadas a la API de REST. El código usa la biblioteca os de Python para establecer variables de entorno a las que se puede acceder en todas las celdas del código.

Es específico para el entorno del notebook de Colab. El código de la siguiente celda de código es equivalente a ejecutar los siguientes comandos en una terminal Bash.

export access_token=$(gcloud auth application-default print-access-token)
export project_id=my-project-id
export base_url=https://generativelanguage.googleapis.com
import os

access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)

os.environ['access_token'] = access_token
os.environ['project_id'] = "project-id"
os.environ['base_url'] = "https://generativelanguage.googleapis.com"

Enumera modelos ajustados

Para verificar tu configuración de autenticación, enumera los modelos ajustados disponibles actualmente.


curl -X GET ${base_url}/v1beta3/tunedModels \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" | grep name
"name": "tunedModels/testnumbergenerator-fvitocr834l6",
      "name": "tunedModels/my-display-name-81-9wpmc1m920vq",
      "displayName": "my display name 81",
      "name": "tunedModels/number-generator-model-kctlevca1g3q",
      "name": "tunedModels/my-display-name-81-r9wcuda14lyy",
      "displayName": "my display name 81",
      "name": "tunedModels/number-generator-model-w1eabln5adwp",
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17583    0 17583    0     0  51600      0 --:--:-- --:--:-- --:--:-- 51563

Crear modelo ajustado

Para crear un modelo ajustado, debes pasar tu conjunto de datos al modelo en el campo training_data.

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.


curl -X POST ${base_url}/v1beta3/tunedModels \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \
    -d '
      {
        "display_name": "number generator model",
        "base_model": "models/text-bison-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 2,
            "learning_rate": 0.001,
            "epoch_count":3,
          },
          "training_data": {
            "examples": {
              "examples": [
                {
                    "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",
                }
              ]
            }
          }
        }
      }' | tee tunemodel.json
{
  "name": "tunedModels/number-generator-model-q2d0uism5ivd/operations/xvyx09sjxlmh",
  "metadata": {
    "@type": "type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata",
    "totalSteps": 23,
    "tunedModel": "tunedModels/number-generator-model-q2d0uism5ivd"
  }
}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2277    0   297  100  1980    146    975  0:00:02  0:00:02 --:--:--  1121

Obtén el estado del modelo ajustado

El estado del modelo se establece en CREATING durante el entrenamiento y cambiará a ACTIVE una vez que se complete.

A continuación, se muestra un poco de código de Python para analizar el nombre del modelo generado a partir del JSON de respuesta. Si estás ejecutando esto en una terminal, puedes intentar usar un analizador JSON de Bash para analizar la respuesta.

import json

first_page = json.load(open('tunemodel.json'))
os.environ['modelname'] = first_page['metadata']['tunedModel']

print(os.environ['modelname'])
tunedModels/number-generator-model-q2d0uism5ivd

Realiza otra solicitud GET con el nombre del modelo para obtener los metadatos del modelo, que incluyen el campo de estado.


curl -X GET ${base_url}/v1beta3/${modelname} \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \ | grep state
"state": "CREATING",
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   494    0   494    0     0    760      0 --:--:-- --:--:-- --:--:--   760
curl: (3) URL using bad/illegal format or missing URL

Ejecuta la inferencia

Cuando finalice tu trabajo de ajuste, puedes usarlo para generar texto con el servicio de texto.


curl -X POST ${base_url}/v1beta3/${modelname}:generateText \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \
    -d '{
        "prompt": {
              "text": "4"
              },
        "temperature": 1.0,
        "candidate_count": 2}' | grep output
"output": "3 2 1",
      "output": "3 2",
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1569    0  1447  100   122    183     15  0:00:08  0:00:07  0:00:01   310

El resultado del modelo puede ser correcto o no. Si el modelo ajustado no está a la altura de los estándares requeridos, puedes intentar agregar más ejemplos de alta calidad, ajustar los hiperparámetros o agregar un preámbulo a tus ejemplos. Incluso puedes crear otro modelo ajustado basado en el primero que creaste.

Consulta la guía de ajuste para obtener más información sobre cómo mejorar el rendimiento.

Llamar a la API de REST con solicitudes de Python

Puedes llamar a la API de REST con cualquier biblioteca que te permita enviar solicitudes HTTP. El siguiente conjunto de ejemplos usa la biblioteca de solicitudes de Python y demuestra algunas de las funciones más avanzadas.

Establece variables

access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)

project = 'project-id'
base_url = "https://generativelanguage.googleapis.com"

Importa la biblioteca requests.

import requests
import json

Enumera modelos ajustados

Para verificar tu configuración de autenticación, enumera los modelos ajustados disponibles actualmente.

headers={
  'Authorization': 'Bearer ' + access_token,
  'Content-Type': 'application/json',
  'x-goog-user-project': project
}

result = requests.get(
  url=f'{base_url}/v1beta3/tunedModels',
  headers = headers,
)
result.json()
{'tunedModels': [{'name': 'tunedModels/testnumbergenerator-fvitocr834l6',
   'baseModel': 'models/text-bison-001',
   'displayName': 'test_number_generator',
   'description': '{"description":"generates the  next number in the sequence given the input text","exampleInput":"input: 1","exampleOutput":"output: 2","datasourceUrl":"https://drive.google.com/open?id=11Pdm6GNom4vlBMUHwO6yFjGQT3t1yi44WVShXMFnkVA&authuser=0&resourcekey=0-2d17tccbdBoThXMkNDvtag","showedTuningComplete":false}',
   'state': 'ACTIVE',
   'createTime': '2023-09-18T11:06:39.092786Z',
   'updateTime': '2023-09-18T11:07:24.198359Z',
   'tuningTask': {'startTime': '2023-09-18T11:06:39.461814784Z',
    'completeTime': '2023-09-18T11:07:24.198359Z',
    'snapshots': [{'step': 1,
      'meanLoss': 16.613504,
      'computeTime': '2023-09-18T11:06:44.532937624Z'},
     {'step': 2,
      'epoch': 1,
      'meanLoss': 20.299532,
      'computeTime': '2023-09-18T11:06:47.825134421Z'},
     {'step': 3,
      'epoch': 1,
      'meanLoss': 8.169708,
      'computeTime': '2023-09-18T11:06:50.580344344Z'},
     {'step': 4,
      'epoch': 2,
      'meanLoss': 3.7588992,
      'computeTime': '2023-09-18T11:06:53.219133748Z'},
     {'step': 5,
      'epoch': 3,
      'meanLoss': 2.0643115,
      'computeTime': '2023-09-18T11:06:55.828458606Z'},
     {'step': 6,
      'epoch': 3,
      'meanLoss': 1.9765375,
      'computeTime': '2023-09-18T11:06:58.426053772Z'},
     {'step': 7,
      'epoch': 4,
      'meanLoss': 0.9276156,
      'computeTime': '2023-09-18T11:07:01.231832398Z'},
     {'step': 8,
      'epoch': 5,
      'meanLoss': 1.8424839,
      'computeTime': '2023-09-18T11:07:03.822710074Z'},
     {'step': 9,
      'epoch': 5,
      'meanLoss': 1.1747926,
      'computeTime': '2023-09-18T11:07:06.441685551Z'},
     {'step': 10,
      'epoch': 6,
      'meanLoss': 0.3079359,
      'computeTime': '2023-09-18T11:07:08.793491157Z'},
     {'step': 11,
      'epoch': 7,
      'meanLoss': 0.543368,
      'computeTime': '2023-09-18T11:07:11.393264892Z'},
     {'step': 12,
      'epoch': 7,
      'meanLoss': 0.35068464,
      'computeTime': '2023-09-18T11:07:13.808021238Z'},
     {'step': 13,
      'epoch': 8,
      'meanLoss': 0.026032856,
      'computeTime': '2023-09-18T11:07:16.295972078Z'},
     {'step': 14,
      'epoch': 8,
      'meanLoss': 0.108341046,
      'computeTime': '2023-09-18T11:07:18.941247488Z'},
     {'step': 15,
      'epoch': 9,
      'meanLoss': 0.016470395,
      'computeTime': '2023-09-18T11:07:21.607654306Z'},
     {'step': 16,
      'epoch': 10,
      'meanLoss': 0.063049875,
      'computeTime': '2023-09-18T11:07:24.077271307Z'}],
    'hyperparameters': {'epochCount': 10,
     'batchSize': 16,
     'learningRate': 0.02} },
   'temperature': 0.7,
   'topP': 0.95,
   'topK': 40},
  {'name': 'tunedModels/my-display-name-81-9wpmc1m920vq',
   'baseModel': 'models/text-bison-tuning-test',
   'displayName': 'my display name 81',
   'state': 'ACTIVE',
   'createTime': '2023-09-18T22:02:08.690991Z',
   'updateTime': '2023-09-18T22:02:28.806318Z',
   'tuningTask': {'startTime': '2023-09-18T22:02:09.161100369Z',
    'completeTime': '2023-09-18T22:02:28.806318Z',
    'snapshots': [{'step': 1,
      'meanLoss': 7.2774773,
      'computeTime': '2023-09-18T22:02:12.453056368Z'},
     {'step': 2,
      'meanLoss': 6.1902447,
      'computeTime': '2023-09-18T22:02:13.789508217Z'},
     {'step': 3,
      'meanLoss': 5.5545835,
      'computeTime': '2023-09-18T22:02:15.136220505Z'},
     {'step': 4,
      'epoch': 1,
      'meanLoss': 7.9237704,
      'computeTime': '2023-09-18T22:02:16.474358517Z'},
     {'step': 5,
      'epoch': 1,
      'meanLoss': 7.6770706,
      'computeTime': '2023-09-18T22:02:17.758261108Z'},
     {'step': 6,
      'epoch': 1,
      'meanLoss': 7.378622,
      'computeTime': '2023-09-18T22:02:19.114072224Z'},
     {'step': 7,
      'epoch': 1,
      'meanLoss': 4.485537,
      'computeTime': '2023-09-18T22:02:20.927434115Z'},
     {'step': 8,
      'epoch': 2,
      'meanLoss': 6.815181,
      'computeTime': '2023-09-18T22:02:22.267906011Z'},
     {'step': 9,
      'epoch': 2,
      'meanLoss': 6.411363,
      'computeTime': '2023-09-18T22:02:24.078114085Z'},
     {'step': 10,
      'epoch': 2,
      'meanLoss': 8.585093,
      'computeTime': '2023-09-18T22:02:25.441598938Z'},
     {'step': 11,
      'epoch': 2,
      'meanLoss': 4.901249,
      'computeTime': '2023-09-18T22:02:27.108985392Z'},
     {'step': 12,
      'epoch': 3,
      'meanLoss': 7.073003,
      'computeTime': '2023-09-18T22:02:28.441662034Z'}],
    'hyperparameters': {'epochCount': 3,
     'batchSize': 4,
     'learningRate': 0.001} },
   'temperature': 0.7,
   'topP': 0.95,
   'topK': 40},
  {'name': 'tunedModels/number-generator-model-kctlevca1g3q',
   'baseModel': 'models/text-bison-tuning-test',
   'displayName': 'number generator model',
   'state': 'ACTIVE',
   'createTime': '2023-09-18T23:43:21.461545Z',
   'updateTime': '2023-09-18T23:43:49.205493Z',
   'tuningTask': {'startTime': '2023-09-18T23:43:21.542403958Z',
    'completeTime': '2023-09-18T23:43:49.205493Z',
    'snapshots': [{'step': 1,
      'meanLoss': 7.342065,
      'computeTime': '2023-09-18T23:43:23.356271969Z'},
     {'step': 2,
      'meanLoss': 7.255807,
      'computeTime': '2023-09-18T23:43:24.620248223Z'},
     {'step': 3,
      'meanLoss': 5.4591417,
      'computeTime': '2023-09-18T23:43:25.854505395Z'},
     {'step': 4,
      'meanLoss': 6.968665,
      'computeTime': '2023-09-18T23:43:27.138260198Z'},
     {'step': 5,
      'meanLoss': 4.578809,
      'computeTime': '2023-09-18T23:43:28.404943274Z'},
     {'step': 6,
      'meanLoss': 6.4862137,
      'computeTime': '2023-09-18T23:43:29.631624883Z'},
     {'step': 7,
      'meanLoss': 9.781939,
      'computeTime': '2023-09-18T23:43:30.801341449Z'},
     {'step': 8,
      'epoch': 1,
      'meanLoss': 5.990006,
      'computeTime': '2023-09-18T23:43:31.854703315Z'},
     {'step': 9,
      'epoch': 1,
      'meanLoss': 8.846312,
      'computeTime': '2023-09-18T23:43:33.075785103Z'},
     {'step': 10,
      'epoch': 1,
      'meanLoss': 6.1585655,
      'computeTime': '2023-09-18T23:43:34.310432174Z'},
     {'step': 11,
      'epoch': 1,
      'meanLoss': 4.7877502,
      'computeTime': '2023-09-18T23:43:35.381582526Z'},
     {'step': 12,
      'epoch': 1,
      'meanLoss': 9.660514,
      'computeTime': '2023-09-18T23:43:36.445446408Z'},
     {'step': 13,
      'epoch': 1,
      'meanLoss': 5.6482882,
      'computeTime': '2023-09-18T23:43:37.603237821Z'},
     {'step': 14,
      'epoch': 1,
      'meanLoss': 3.162092,
      'computeTime': '2023-09-18T23:43:38.671463397Z'},
     {'step': 15,
      'epoch': 2,
      'meanLoss': 6.322996,
      'computeTime': '2023-09-18T23:43:39.769742201Z'},
     {'step': 16,
      'epoch': 2,
      'meanLoss': 6.781,
      'computeTime': '2023-09-18T23:43:40.985967994Z'},
     {'step': 17,
      'epoch': 2,
      'meanLoss': 5.136773,
      'computeTime': '2023-09-18T23:43:42.235469710Z'},
     {'step': 18,
      'epoch': 2,
      'meanLoss': 7.2091155,
      'computeTime': '2023-09-18T23:43:43.415178581Z'},
     {'step': 19,
      'epoch': 2,
      'meanLoss': 7.7508755,
      'computeTime': '2023-09-18T23:43:44.775221774Z'},
     {'step': 20,
      'epoch': 2,
      'meanLoss': 8.144815,
      'computeTime': '2023-09-18T23:43:45.788824334Z'},
     {'step': 21,
      'epoch': 2,
      'meanLoss': 5.485137,
      'computeTime': '2023-09-18T23:43:46.812663998Z'},
     {'step': 22,
      'epoch': 2,
      'meanLoss': 3.709197,
      'computeTime': '2023-09-18T23:43:47.971764087Z'},
     {'step': 23,
      'epoch': 3,
      'meanLoss': 6.0069466,
      'computeTime': '2023-09-18T23:43:49.004191079Z'}],
    'hyperparameters': {'epochCount': 3,
     'batchSize': 2,
     'learningRate': 0.001} },
   'temperature': 0.7,
   'topP': 0.95,
   'topK': 40},
  {'name': 'tunedModels/my-display-name-81-r9wcuda14lyy',
   'baseModel': 'models/text-bison-tuning-test',
   'displayName': 'my display name 81',
   'state': 'ACTIVE',
   'createTime': '2023-09-18T23:52:06.980185Z',
   'updateTime': '2023-09-18T23:52:26.679601Z',
   'tuningTask': {'startTime': '2023-09-18T23:52:07.616953503Z',
    'completeTime': '2023-09-18T23:52:26.679601Z',
    'snapshots': [{'step': 1,
      'meanLoss': 7.2774773,
      'computeTime': '2023-09-18T23:52:10.278936662Z'},
     {'step': 2,
      'meanLoss': 6.2793097,
      'computeTime': '2023-09-18T23:52:11.630844790Z'},
     {'step': 3,
      'meanLoss': 5.540499,
      'computeTime': '2023-09-18T23:52:13.027840389Z'},
     {'step': 4,
      'epoch': 1,
      'meanLoss': 7.977523,
      'computeTime': '2023-09-18T23:52:14.368199020Z'},
     {'step': 5,
      'epoch': 1,
      'meanLoss': 7.6197805,
      'computeTime': '2023-09-18T23:52:15.872428752Z'},
     {'step': 6,
      'epoch': 1,
      'meanLoss': 7.3851357,
      'computeTime': '2023-09-18T23:52:17.213094182Z'},
     {'step': 7,
      'epoch': 1,
      'meanLoss': 4.5342345,
      'computeTime': '2023-09-18T23:52:19.090698421Z'},
     {'step': 8,
      'epoch': 2,
      'meanLoss': 6.8603754,
      'computeTime': '2023-09-18T23:52:20.494844731Z'},
     {'step': 9,
      'epoch': 2,
      'meanLoss': 6.418575,
      'computeTime': '2023-09-18T23:52:21.815997555Z'},
     {'step': 10,
      'epoch': 2,
      'meanLoss': 8.659064,
      'computeTime': '2023-09-18T23:52:23.524287192Z'},
     {'step': 11,
      'epoch': 2,
      'meanLoss': 4.856765,
      'computeTime': '2023-09-18T23:52:24.864661291Z'},
     {'step': 12,
      'epoch': 3,
      'meanLoss': 7.1078596,
      'computeTime': '2023-09-18T23:52:26.225055381Z'}],
    'hyperparameters': {'epochCount': 3,
     'batchSize': 4,
     'learningRate': 0.001} },
   'temperature': 0.7,
   'topP': 0.95,
   'topK': 40},
  {'name': 'tunedModels/number-generator-model-w1eabln5adwp',
   'baseModel': 'models/text-bison-tuning-test',
   'displayName': 'number generator model',
   'state': 'ACTIVE',
   'createTime': '2023-09-19T19:29:08.622497Z',
   'updateTime': '2023-09-19T19:29:46.063853Z',
   'tuningTask': {'startTime': '2023-09-19T19:29:08.806930486Z',
    'completeTime': '2023-09-19T19:29:46.063853Z',
    'snapshots': [{'step': 1,
      'meanLoss': 7.342065,
      'computeTime': '2023-09-19T19:29:13.023811994Z'},
     {'step': 2,
      'meanLoss': 7.1960244,
      'computeTime': '2023-09-19T19:29:14.844046282Z'},
     {'step': 3,
      'meanLoss': 5.480289,
      'computeTime': '2023-09-19T19:29:16.596884354Z'},
     {'step': 4,
      'meanLoss': 6.851822,
      'computeTime': '2023-09-19T19:29:17.741735378Z'},
     {'step': 5,
      'meanLoss': 4.5535283,
      'computeTime': '2023-09-19T19:29:18.914760812Z'},
     {'step': 6,
      'meanLoss': 6.449012,
      'computeTime': '2023-09-19T19:29:20.053316042Z'},
     {'step': 7,
      'meanLoss': 9.842458,
      'computeTime': '2023-09-19T19:29:21.371286675Z'},
     {'step': 8,
      'epoch': 1,
      'meanLoss': 5.9831877,
      'computeTime': '2023-09-19T19:29:22.915277044Z'},
     {'step': 9,
      'epoch': 1,
      'meanLoss': 8.936815,
      'computeTime': '2023-09-19T19:29:24.666461680Z'},
     {'step': 10,
      'epoch': 1,
      'meanLoss': 6.14651,
      'computeTime': '2023-09-19T19:29:26.793310451Z'},
     {'step': 11,
      'epoch': 1,
      'meanLoss': 4.853589,
      'computeTime': '2023-09-19T19:29:28.328297535Z'},
     {'step': 12,
      'epoch': 1,
      'meanLoss': 9.6831045,
      'computeTime': '2023-09-19T19:29:29.501236840Z'},
     {'step': 13,
      'epoch': 1,
      'meanLoss': 5.706586,
      'computeTime': '2023-09-19T19:29:30.612807978Z'},
     {'step': 14,
      'epoch': 1,
      'meanLoss': 3.276942,
      'computeTime': '2023-09-19T19:29:31.928747103Z'},
     {'step': 15,
      'epoch': 2,
      'meanLoss': 6.1736736,
      'computeTime': '2023-09-19T19:29:33.588699180Z'},
     {'step': 16,
      'epoch': 2,
      'meanLoss': 6.857398,
      'computeTime': '2023-09-19T19:29:35.239083809Z'},
     {'step': 17,
      'epoch': 2,
      'meanLoss': 5.098094,
      'computeTime': '2023-09-19T19:29:37.000705047Z'},
     {'step': 18,
      'epoch': 2,
      'meanLoss': 7.27724,
      'computeTime': '2023-09-19T19:29:38.532313231Z'},
     {'step': 19,
      'epoch': 2,
      'meanLoss': 7.6310735,
      'computeTime': '2023-09-19T19:29:39.696034301Z'},
     {'step': 20,
      'epoch': 2,
      'meanLoss': 8.152623,
      'computeTime': '2023-09-19T19:29:40.803342042Z'},
     {'step': 21,
      'epoch': 2,
      'meanLoss': 5.451577,
      'computeTime': '2023-09-19T19:29:42.445788199Z'},
     {'step': 22,
      'epoch': 2,
      'meanLoss': 3.7990716,
      'computeTime': '2023-09-19T19:29:43.866737307Z'},
     {'step': 23,
      'epoch': 3,
      'meanLoss': 6.120624,
      'computeTime': '2023-09-19T19:29:45.599248553Z'}],
    'hyperparameters': {'epochCount': 3,
     'batchSize': 2,
     'learningRate': 0.001} },
   'temperature': 0.7,
   'topP': 0.95,
   'topK': 40}]}

Crear modelo ajustado

Al igual que en el ejemplo de Curl, pasa el conjunto de datos a través del campo training_data.

operation = requests.post(
    url = f'{base_url}/v1beta3/tunedModels',
    headers=headers,
    json= {
        "display_name": "number generator",
        "base_model": "models/text-bison-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 4,
            "learning_rate": 0.001,
            "epoch_count":3,
          },
          "training_data": {
            "examples": {
              "examples": [
                {
                    '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',
                }
              ]
            }
          }
        }
      }
)
operation
<Response [200]>
operation.json()
{'name': 'tunedModels/number-generator-ncqqnysl74dt/operations/qqlbwzfyzn0k',
 'metadata': {'@type': 'type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata',
  'totalSteps': 12,
  'tunedModel': 'tunedModels/number-generator-ncqqnysl74dt'} }

Establece una variable con el nombre de tu modelo ajustado para usar en el resto de las llamadas.

name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-ncqqnysl74dt'

Obtén el estado del modelo ajustado

Para verificar el progreso de tu trabajo de ajuste, verifica el campo de estado. CREATING significa que el trabajo de ajuste aún está en curso y ACTIVE significa que se completaron los entrenamientos y que el modelo ajustado está listo para usarse.

tuned_model = requests.get(
    url = f'{base_url}/v1beta3/{name}',
    headers=headers,
)
tuned_model.json()
{'name': 'tunedModels/number-generator-ncqqnysl74dt',
 'baseModel': 'models/text-bison-001',
 'displayName': 'number generator',
 'state': 'CREATING',
 'createTime': '2023-09-19T19:56:25.999303Z',
 'updateTime': '2023-09-19T19:56:25.999303Z',
 'tuningTask': {'startTime': '2023-09-19T19:56:26.297862545Z',
  'hyperparameters': {'epochCount': 3, 'batchSize': 4, 'learningRate': 0.001} },
 'temperature': 0.7,
 'topP': 0.95,
 'topK': 40}

El siguiente código verifica el campo de estado cada 5 segundos hasta que ya no se encuentre en el estado CREATING.

import time
import pprint

op_json = operation.json()
response = op_json.get('response')
error = op_json.get('error')

while response is None and error is None:
    time.sleep(31)

    operation = requests.get(
        url = f'{base_url}/v1/{op_json["name"]}',
        headers=headers,
    )

    op_json = operation.json()
    response = op_json.get('response')
    error = op_json.get('error')

    percent = op_json['metadata'].get('completedPercent')
    if percent is not None:
      print(f"{percent:.2f}% - {op_json['metadata']['snapshots'][-1]}")
      print()

if error is not None:
    raise Exception(error)
21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'}

21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'}

43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'}

43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'}

63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'}

63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'}

85.11% - {'step': 160, 'epoch': 42, 'meanLoss': -1.1145603e-06, 'computeTime': '2023-09-20T00:26:57.819011896Z'}

100.00% - {'step': 188, 'epoch': 50, 'meanLoss': 0.00040101097, 'computeTime': '2023-09-20T00:27:40.024132813Z'}

Ejecuta la inferencia

Cuando finalice el trabajo de ajuste, podrás usarlo para generar texto como lo harías con el modelo de texto base.

import time

m = requests.post(
    url = f'{base_url}/v1beta3/{name}:generateText',
    headers=headers,
    json= {
         "prompt": {
              "text": "9"
              },
    })
import pprint
print(m.json()['candidates'][0]['output'])
9

El resultado del modelo puede ser correcto o no. Si el modelo ajustado no está a la altura de los estándares requeridos, puedes intentar agregar más ejemplos de alta calidad, ajustar los hiperparámetros o agregar un preámbulo a tus ejemplos.

Próximos pasos