ফাইন-টিউনিং টিউটোরিয়াল

এই টিউটোরিয়ালটি আপনাকে পাইথন SDK বা কার্ল ব্যবহার করে REST API ব্যবহার করে Gemini API টিউনিং পরিষেবা শুরু করতে সাহায্য করবে। উদাহরণগুলি দেখায় কিভাবে Gemini API টেক্সট জেনারেশন পরিষেবার পিছনে টেক্সট মডেল টিউন করা যায়।

ai.google.dev-এ দেখুন একটি Colab নোটবুক ব্যবহার করে দেখুন GitHub এ নোটবুক দেখুন

সীমাবদ্ধতা

একটি মডেল টিউন করার আগে, আপনার নিম্নলিখিত সীমাবদ্ধতা সম্পর্কে সচেতন হওয়া উচিত:

ফাইন-টিউনিং ডেটাসেট

জেমিনি 1.5 ফ্ল্যাশের জন্য ফাইন-টিউনিং ডেটাসেটগুলির নিম্নলিখিত সীমাবদ্ধতা রয়েছে:

  • উদাহরণ প্রতি সর্বোচ্চ ইনপুট আকার 40,000 অক্ষর।
  • উদাহরণ প্রতি সর্বোচ্চ আউটপুট আকার হল 5,000 অক্ষর।
  • শুধুমাত্র ইনপুট-আউটপুট জোড়া উদাহরণ সমর্থিত। চ্যাট-স্টাইল মাল্টি-টার্ন কথোপকথন সমর্থিত নয়।

টিউন করা মডেল

টিউন করা মডেলগুলির নিম্নলিখিত সীমাবদ্ধতা রয়েছে:

  • একটি টিউন করা জেমিনি 1.5 ফ্ল্যাশ মডেলের ইনপুট সীমা হল 40,000 অক্ষর৷
  • JSON মোড টিউন করা মডেলগুলির সাথে সমর্থিত নয়৷
  • শুধুমাত্র টেক্সট ইনপুট সমর্থিত.

প্রমাণীকরণ সেট আপ করুন

জেমিনি API আপনাকে আপনার নিজস্ব ডেটাতে মডেলগুলি টিউন করতে দেয়৷ যেহেতু এটি আপনার ডেটা এবং আপনার টিউন করা মডেলগুলির জন্য এপিআই কীগুলি সরবরাহ করতে পারে তার চেয়ে কঠোর অ্যাক্সেস নিয়ন্ত্রণের প্রয়োজন৷ আপনি এই টিউটোরিয়ালটি চালানোর আগে, আপনাকে আপনার প্রকল্পের জন্য OAuth সেট আপ করতে হবে এবং তারপর "ক্লায়েন্ট_secret.json" হিসাবে "OAuth ক্লায়েন্ট আইডি" ডাউনলোড করতে হবে। যাইহোক, টিউন করা মডেল ব্যবহার করার জন্য আপনার OAuth শংসাপত্রের প্রয়োজন নেই। আপনি OAuth ব্যবহার করে একটি মডেল টিউন করার পরে, আপনি আপনার API কী ব্যবহার করে এটি অ্যাক্সেস করতে পারেন।

এই gcloud কমান্ডটি client_secret.json ফাইলটিকে শংসাপত্রে পরিণত করে যা পরিষেবার সাথে প্রমাণীকরণের জন্য ব্যবহার করা যেতে পারে।

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'

ভেরিয়েবল সেট করুন

CURL

বাকি REST API কলগুলির জন্য ব্যবহার করার জন্য পুনরাবৃত্ত মানগুলির জন্য ভেরিয়েবল সেট করুন৷ কোডটি পরিবেশের ভেরিয়েবল সেট করতে পাইথন os লাইব্রেরি ব্যবহার করছে যা সমস্ত কোড কক্ষে অ্যাক্সেসযোগ্য।

এটি Colab নোটবুকের পরিবেশের জন্য নির্দিষ্ট। পরবর্তী কোড সেলের কোডটি একটি ব্যাশ টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালানোর সমতুল্য।

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"

পাইথন

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

টিউন করা মডেলের তালিকা করুন

উপলব্ধ টিউন করা মডেলগুলি তালিকাভুক্ত করে আপনার প্রমাণীকরণ সেটআপ যাচাই করুন৷

CURL


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

পাইথন

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 ক্ষেত্রের মডেলটিতে আপনার ডেটাসেট পাস করতে হবে।

এই উদাহরণের জন্য, আপনি ক্রমানুসারে পরবর্তী সংখ্যা তৈরি করতে একটি মডেল টিউন করবেন। উদাহরণস্বরূপ, যদি ইনপুট 1 হয়, তাহলে মডেলটি 2 আউটপুট করবে। ইনপুট one hundred হলে আউটপুট one hundred one হতে হবে।

CURL


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

পাইথন

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 হয়ে যাবে৷

CURL

JSON প্রতিক্রিয়া থেকে জেনারেট করা মডেলের নাম পার্স করার জন্য নীচে পাইথন কোডের একটি বিট রয়েছে। আপনি যদি এটি একটি টার্মিনালে চালান তবে আপনি প্রতিক্রিয়া বিশ্লেষণ করতে একটি bash 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

পাইথন

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

নিচের কোডটি প্রতি 5 সেকেন্ডে স্টেট ফিল্ড চেক করে যতক্ষণ না এটি আর 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'}

অনুমান চালান

আপনার টিউনিং কাজ শেষ হয়ে গেলে, আপনি পাঠ্য পরিষেবার সাথে পাঠ্য তৈরি করতে এটি ব্যবহার করতে পারেন।

CURL

একটি রোমান সংখ্যা ইনপুট করার চেষ্টা করুন, বলুন, 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"
    }
  ]
}
}

মডেল থেকে আউটপুট সঠিক হতে পারে বা নাও হতে পারে। যদি টিউন করা মডেলটি আপনার প্রয়োজনীয় মান অনুযায়ী কাজ না করে, আপনি আরও উচ্চ মানের উদাহরণ যোগ করার চেষ্টা করতে পারেন, হাইপারপ্যারামিটারগুলিকে টুইক করে বা আপনার উদাহরণগুলিতে একটি প্রস্তাবনা যোগ করার চেষ্টা করতে পারেন৷ আপনি এমনকি আপনার তৈরি করা প্রথমটির উপর ভিত্তি করে আরেকটি টিউন করা মডেল তৈরি করতে পারেন।

পারফরম্যান্সের উন্নতির বিষয়ে আরও নির্দেশনার জন্য টিউনিং গাইড দেখুন।

পাইথন

একটি জাপানি সংখ্যা ইনপুট করার চেষ্টা করুন, বলুন, 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'}]} }

মডেল থেকে আউটপুট সঠিক হতে পারে বা নাও হতে পারে। যদি টিউন করা মডেলটি আপনার প্রয়োজনীয় মান অনুযায়ী কাজ না করে, আপনি আরও উচ্চ মানের উদাহরণ যোগ করার চেষ্টা করতে পারেন, হাইপারপ্যারামিটারগুলিকে টুইক করে বা আপনার উদাহরণগুলিতে একটি প্রস্তাবনা যোগ করার চেষ্টা করতে পারেন৷

উপসংহার

যদিও প্রশিক্ষণের ডেটাতে রোমান বা জাপানি সংখ্যার কোনো উল্লেখ ছিল না, মডেলটি সূক্ষ্ম-টিউনিংয়ের পরে ভালভাবে সাধারণীকরণ করতে সক্ষম হয়েছিল। এইভাবে, আপনি আপনার ব্যবহারের কেসগুলি পূরণ করতে মডেলগুলিকে সূক্ষ্ম-টিউন করতে পারেন।

পরবর্তী পদক্ষেপ

জেমিনি API-এর জন্য পাইথন SDK-এর সাহায্যে টিউনিং পরিষেবাটি কীভাবে ব্যবহার করবেন তা শিখতে, পাইথনের সাথে টিউনিং কুইকস্টার্ট দেখুন। Gemini API-এ অন্যান্য পরিষেবাগুলি কীভাবে ব্যবহার করবেন তা শিখতে, REST geting start টিউটোরিয়াল দেখুন।