REST API: मॉडल ट्यूनिंग

ai.google.dev पर देखें Google Colab में चलाएं GitHub पर सोर्स देखें

इस notebook में, आपको Gemini API को कॉल करने के लिए curl कमांड या Python request API का इस्तेमाल करके, Gemini API ट्यूनिंग सेवा शुरू करने का तरीका बताया जाएगा. यहां आपको Gemini API की टेक्स्ट जनरेट करने वाली सेवा के टेक्स्ट मॉडल को ट्यून करने का तरीका बताया जाएगा.

सेटअप

प्रमाणीकृत करें

Gemini API की मदद से, अपने डेटा के हिसाब से मॉडल बनाए जा सकते हैं. यह आपका डेटा है और आपके ट्यून किए गए मॉडल को एपीआई-कुंजी की तुलना में ज़्यादा सख्त ऐक्सेस कंट्रोल की ज़रूरत होती है.

यह ट्यूटोरियल चलाने से पहले, आपको अपने प्रोजेक्ट के लिए OAuth सेटअप करना होगा.

Colab में सबसे आसान तरीके से इसे सेटअप किया जा सकता है. इसके लिए, आपको अपनी client_secret.json फ़ाइल के कॉन्टेंट को Colab के "सीक्रेट मैनेजर" (बाएं पैनल में कुंजी आइकॉन के नीचे) में, सीक्रेट नाम CLIENT_SECRET के साथ कॉपी करना होगा.

यह gcloud निर्देश, client_secret.json फ़ाइल को क्रेडेंशियल में बदल देता है. इनका इस्तेमाल सेवा की पुष्टि करने के लिए किया जा सकता है.

try:
  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'
except ImportError:
  !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'
You are authorizing client libraries without access to a web browser. Please run the following command on a machine with a web browser and copy its output back here. Make sure the installed gcloud version is 372.0.0 or newer.

gcloud auth application-default login --remote-bootstrap="https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=87071151422-n1a3cb6c7fvkfg4gmhdtmn5ulol2l4be.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgenerative-language.tuning&state=QIyNibWSaTIsozjmvZEkVBo6EcoW0G&access_type=offline&code_challenge=76c1ZiGvKN8cvlYfj3BmbCwE4e7tvrlwaX3REUX25gY&code_challenge_method=S256&token_usage=remote"


Enter the output of the above command: https://localhost:8085/?state=QIyNibWSaTIsozjmvZEkVBo6EcoW0G&code=4/0AeaYSHBKrY911S466QjKQIFODoOPXlO1mWyTYYdrbELIDV6Hw2DKRAyro62BugroSvIWsA&scope=https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/generative-language.tuning

Credentials saved to file: [/content/.config/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

CURL की मदद से REST API को कॉल करना

यह सेक्शन REST API को कॉल करने के लिए, कर्ल स्टेटमेंट के उदाहरण देता है. आपको ट्यूनिंग जॉब बनाने का तरीका जाना जा सकता है और उसका स्टेटस देखा जा सकता है. इसके बाद, अनुमान कॉल किया जा सकता है.

वैरिएबल सेट करना

बाकी REST API कॉल के लिए, बार-बार होने वाली वैल्यू के लिए वैरिएबल सेट करें. यह कोड, Python os लाइब्रेरी का इस्तेमाल करके एनवायरमेंट वैरिएबल सेट करने के लिए काम कर रहा है. इस वैरिएबल को सभी कोड सेल में ऐक्सेस किया जा सकता है.

यह खास तौर पर Colab notebook के लिए है. अगले कोड सेल में मौजूद कोड, बैश टर्मिनल में इन कमांड को चलाने के बराबर है.

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'] = "[Enter your project-id here]"
os.environ['base_url'] = "https://generativelanguage.googleapis.com"

ट्यून किए गए मॉडल की सूची बनाएं

ट्यून किए गए मौजूदा मॉडल की सूची बनाकर, पुष्टि करने के सेटअप की पुष्टि करें.


curl -X GET ${base_url}/v1beta/tunedModels \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}"

ट्यून किया गया मॉडल बनाएं

ट्यून किया गया मॉडल बनाने के लिए, आपको training_data फ़ील्ड में मौजूद मॉडल को अपना डेटासेट पास करना होगा.

इस उदाहरण में, क्रम में अगली संख्या जनरेट करने के लिए आपको मॉडल ट्यून करना होगा. उदाहरण के लिए, अगर इनपुट 1 है, तो मॉडल को 2 का आउटपुट मिलना चाहिए. अगर इनपुट one hundred है, तो आउटपुट one hundred one होना चाहिए.


curl -X POST $base_url/v1beta/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/gemini-1.0-pro-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 2,
            "learning_rate": 0.001,
            "epoch_count":5,
          },
          "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-dzlmi0gswwqb/operations/bvl8dymw0fhw",
  "metadata": {
    "@type": "type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata",
    "totalSteps": 38,
    "tunedModel": "tunedModels/number-generator-model-dzlmi0gswwqb"
  }
}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2280    0   296  100  1984    611   4098 --:--:-- --:--:-- --:--:--  4720

ट्यून किए गए मॉडल की स्थिति पाएं

ट्रेनिंग के दौरान मॉडल की स्थिति को CREATING पर सेट किया गया है. ट्रेनिंग पूरी होने पर यह बदलकर ACTIVE हो जाएगी.

रिस्पॉन्स JSON से जनरेट किए गए मॉडल के नाम को पार्स करने के लिए, यहां थोड़ा Python कोड दिया गया है. अगर इसे टर्मिनल में चलाया जा रहा है, तो रिस्पॉन्स को पार्स करने के लिए, बैश JSON पार्सर का इस्तेमाल किया जा सकता है.

import json

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

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

मॉडल का मेटाडेटा पाने के लिए, मॉडल के नाम के साथ GET का एक और अनुरोध करें. इस मेटाडेटा में स्टेट फ़ील्ड भी शामिल होता है.


curl -X GET ${base_url}/v1beta/${modelname} \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" | grep state
"state": "ACTIVE",
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5921    0  5921    0     0  13164      0 --:--:-- --:--:-- --:--:-- 13157

अनुमान चलाएं

ट्यूनिंग का काम पूरा होने के बाद, इसका इस्तेमाल टेक्स्ट सेवा की मदद से टेक्स्ट जनरेट करने के लिए किया जा सकता है. कोई रोमन अंक डालने की कोशिश करें, जैसे कि 63 (LXIII)


curl -X POST $base_url/v1beta/$modelname:generateContent \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \
    -d '{
        "contents": [{
        "parts": [{
          "text": "LXIII"
          }]
        }]
        }' 2> /dev/null
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "LXIV"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE"
        }
      ]
    }
  ],
  "promptFeedback": {
    "safetyRatings": [
      {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HARASSMENT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "probability": "NEGLIGIBLE"
      }
    ]
  }
}

आपके मॉडल का आउटपुट सही हो भी सकता है और नहीं भी. अगर ट्यून किया गया मॉडल आपके ज़रूरी मानकों के मुताबिक परफ़ॉर्म नहीं कर रहा है, तो आपके पास ज़्यादा अच्छी क्वालिटी के उदाहरण जोड़ने, हाइपर पैरामीटर को बदलने या अपने उदाहरणों में शुरुआती जानकारी जोड़ने का विकल्प है. अपने पहले बनाए गए मॉडल के आधार पर, एक अन्य ट्यून किया गया मॉडल भी बनाया जा सकता है.

परफ़ॉर्मेंस को बेहतर बनाने के बारे में ज़्यादा जानकारी के लिए, ट्यूनिंग गाइड देखें.

Python अनुरोधों के साथ, REST API को कॉल करना

बाकी एपीआई को ऐसी किसी भी लाइब्रेरी से कॉल किया जा सकता है जो आपको एचटीटीपी अनुरोध भेजने की अनुमति देती है. उदाहरणों के अगले सेट में, Python के अनुरोधों की लाइब्रेरी का इस्तेमाल किया गया है. इसमें कुछ ज़्यादा बेहतर सुविधाओं के बारे में बताया गया है.

वैरिएबल सेट करना

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

project = '[Enter your project-id here]'
base_url = "https://generativelanguage.googleapis.com"

requests लाइब्रेरी इंपोर्ट करें.

import requests
import json

ट्यून किए गए मॉडल की सूची बनाएं

ट्यून किए गए मौजूदा मॉडल की सूची बनाकर, पुष्टि करने के सेटअप की पुष्टि करें.

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

result = requests.get(
  url=f'{base_url}/v1beta/tunedModels',
  headers = headers,
)
result.json()

ट्यून किया गया मॉडल बनाएं

कर्ल उदाहरण की तरह ही, आप डेटासेट को training_data फ़ील्ड से पास करते हैं.

operation = requests.post(
    url = f'{base_url}/v1beta/tunedModels',
    headers=headers,
    json= {
        "display_name": "number generator",
        "base_model": "models/gemini-1.0-pro-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 4,
            "learning_rate": 0.001,
            "epoch_count":5,
          },
          "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-wl1qr34x2py/operations/41vni3zk0a47',
 'metadata': {'@type': 'type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata',
  'totalSteps': 19,
  'tunedModel': 'tunedModels/number-generator-wl1qr34x2py'} }

बाकी कॉल के लिए इस्तेमाल करने के लिए, अपने ट्यून किए गए मॉडल के नाम के साथ एक वैरिएबल सेट करें.

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

ट्यून किए गए मॉडल की स्थिति पाएं

राज्य का फ़ील्ड देखकर, ट्यूनिंग जॉब की प्रोग्रेस देखी जा सकती है. CREATING का मतलब है कि ट्यूनिंग का काम अब भी जारी है. ACTIVE का मतलब है कि ट्रेनें पूरी हो गई हैं और ट्यून किया गया मॉडल इस्तेमाल के लिए तैयार है.

tuned_model = requests.get(
    url = f'{base_url}/v1beta/{name}',
    headers=headers,
)
tuned_model.json()

नीचे दिया गया कोड हर पांच सेकंड में स्टेट फ़ील्ड की जांच करता है, जब तक कि यह 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(5)

    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)
100.00% - {'step': 19, 'epoch': 5, 'meanLoss': 1.402067, 'computeTime': '2024-03-14T15:11:23.766989274Z'}

अनुमान चलाएं

ट्यूनिंग का काम पूरा हो जाने के बाद, इसका इस्तेमाल टेक्स्ट जनरेट करने के लिए ठीक उसी तरह किया जा सकता है जैसे बेस टेक्स्ट मॉडल में किया जाता है. जापानी अंक डालने की कोशिश करें, जैसे कि 6 (六).

import time

m = requests.post(
    url = f'{base_url}/v1beta/{name}:generateContent',
    headers=headers,
    json= {
         "contents": [{
             "parts": [{
                 "text": "六"
             }]
          }]
    })
import pprint
pprint.pprint(m.json())
{'candidates': [{'content': {'parts': [{'text': '七'}], 'role': 'model'},
                 'finishReason': 'STOP',
                 'index': 0,
                 'safetyRatings': [{'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
                                    'probability': 'NEGLIGIBLE'},
                                   {'category': 'HARM_CATEGORY_HATE_SPEECH',
                                    'probability': 'NEGLIGIBLE'},
                                   {'category': 'HARM_CATEGORY_HARASSMENT',
                                    'probability': 'LOW'},
                                   {'category': 'HARM_CATEGORY_DANGEROUS_CONTENT',
                                    'probability': 'NEGLIGIBLE'}]}],
 'promptFeedback': {'safetyRatings': [{'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
                                       'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_HATE_SPEECH',
                                       'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_HARASSMENT',
                                       'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_DANGEROUS_CONTENT',
                                       'probability': 'NEGLIGIBLE'}]} }

आपके मॉडल का आउटपुट सही हो भी सकता है और नहीं भी. अगर ट्यून किया गया मॉडल आपके ज़रूरी मानकों के मुताबिक परफ़ॉर्म नहीं कर रहा है, तो आपके पास ज़्यादा अच्छी क्वालिटी के उदाहरण जोड़ने, हाइपर पैरामीटर को बदलने या अपने उदाहरणों में शुरुआती जानकारी जोड़ने का विकल्प है.

नतीजा

ट्रेनिंग वाले डेटा में रोमन या जैपनीज़ अंकों का संदर्भ भले ही नहीं था, लेकिन इस मॉडल को फ़ाइन ट्यूनिंग के बाद पूरी तरह से सामान्य बना दिया गया. इस तरह, इस्तेमाल के उदाहरण के हिसाब से मॉडल को बेहतर बनाया जा सकता है.

अगले चरण

Gemini API के लिए Python SDK टूल की मदद से ट्यूनिंग सेवा इस्तेमाल करने का तरीका जानने के लिए, Python के साथ क्विकस्टार्ट ट्यूनिंग पर जाएं. Gemini API में दूसरी सेवाओं को इस्तेमाल करने का तरीका जानने के लिए, Python क्विकस्टार्ट पर जाएं.