फ़ाइन-ट्यून के बड़े लैंग्वेज मॉडल: Vertex AI की मदद से, एलएलएम को बेहतर बनाने का तरीका

1. परिचय

बेहतर बनाना क्यों ज़रूरी है

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

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

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

मॉडल को पसंद के मुताबिक बनाने के बारे में ज़्यादा जानकारी यहां उपलब्ध है.

आपको क्या बनाना होगा

इस्तेमाल का उदाहरण: समाचार लेखों के लिए हेडलाइन जनरेट करना

मान लें कि आप समाचार लेखों के लिए अपने आप मुख्य समाचार जनरेट करना चाहते हैं. Vertex AI की मदद से, एलएलएम को बेहतर बनाया जा सकता है. यह एक खास स्टाइल वाले टाइटल को जनरेट करता है और इसे समाचार चैनल के दिशा-निर्देशों के मुताबिक बनाता है.

इस कोडलैब में, आपको ये काम करने होंगे:

  • BBC FULLTEXT DATA का इस्तेमाल करें (BigQuery के सार्वजनिक डेटासेट bigquery-public-data.bbc_news.fulltext से उपलब्ध कराया गया).
  • एलएलएम (text-bison@002) को "bbc-news-summary-tuned" नाम के बेहतर नए मॉडल में ऑप्टिमाइज़ करें और बेस मॉडल से मिले रिस्पॉन्स से नतीजे की तुलना करें. इस कोडलैब के लिए, JSONL फ़ाइल का एक सैंपल डेटा स्टोर करने की जगह में उपलब्ध है. फ़ाइल को अपने Cloud Storage बकेट में अपलोड किया जा सकता है और उसे बेहतर करने के लिए इन चरणों को पूरा किया जा सकता है:
  • अपना डेटा तैयार करें: सबसे पहले समाचार लेखों का डेटासेट और उनसे जुड़ी हेडलाइन लिखें, जैसे कि उदाहरण के कोड में इस्तेमाल किया गया BBC News का डेटासेट.
  • पहले से ट्रेन किए गए मॉडल को बेहतर बनाएं: "text-bison@002" जैसा कोई बेस मॉडल चुनें और Python के लिए Vertex AI SDK टूल का इस्तेमाल करके, इसे अपने ख़बरों से जुड़े डेटा के साथ बेहतर बनाएँ.
  • नतीजों का आकलन करें: हेडलाइन जनरेट करने की क्वालिटी में हुए सुधार को देखने के लिए, बेहतर बनाए गए मॉडल की परफ़ॉर्मेंस की तुलना बेस मॉडल से करें.
  • अपने मॉडल को डिप्लॉय करें और उसका इस्तेमाल करें: एपीआई एंडपॉइंट की मदद से, बेहतर बनाए गए मॉडल उपलब्ध कराएं और नए लेखों के लिए अपने-आप हेडलाइन जनरेट करना शुरू करें.

2. शुरू करने से पहले

  1. Google Cloud Console में, प्रोजेक्ट सिलेक्टर पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Google Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें.
  3. Colab Notebook खोलें और उसी खाते में लॉगिन करें जिससे आपने मौजूदा Google Cloud खाते में साइन इन किया है.

3. लार्ज लैंग्वेज मॉडल को बेहतर बनाना

यह कोडलैब, मॉडल को बेहतर बनाने के लिए Python के लिए Vertex AI SDK का इस्तेमाल करता है. अन्य विकल्पों का इस्तेमाल करके भी इसे बेहतर बनाया जा सकता है — एचटीटीपी, CURL कमांड, Java SDK, Console.

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

4. पहला चरण: डिपेंडेंसी इंस्टॉल और इंपोर्ट करना

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

रेपो में .ipynb फ़ाइल में बताए गए बाकी के चरण पूरे करें. PROJECT_ID और BUCKET_NAME को अपने क्रेडेंशियल से बदलना न भूलें.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. दूसरा चरण: ट्रेनिंग का डेटा तैयार करना और उसे लोड करना

YOUR_BUCKET को अपनी बकेट से बदलें और इसमें TRAIN.jsonl ट्रेनिंग डेटा फ़ाइल का नमूना अपलोड करें. इस्तेमाल के इस उदाहरण के लिए, सैंपल डेटा का प्रावधान ऊपर दिए गए लिंक में किया गया है.

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

इस चरण का यह नतीजा होना चाहिए:

17274866af36a47c.png

6. तीसरा चरण: बड़े लैंग्वेज मॉडल को बेहतर बनाना

अब किसी भी बड़े लैंग्वेज मॉडल को ट्यून किया जा सकता है. हालांकि, यह सुविधा सहायता की उपलब्धता पर निर्भर करती है. हालांकि, इस स्निपेट में हम पहले से ट्रेन किए गए मॉडल "text-bison@002" को ट्यून कर रहे हैं जिसमें ट्रेनिंग डेटा वाला वह डेटा फ़्रेम शामिल होगा जिसे हमने पिछले चरण में लोड किया था.:

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

इस चरण को पूरा होने में कुछ घंटे लगेंगे. नतीजे में दिए गए पाइपलाइन जॉब के लिंक का इस्तेमाल करके, फ़ाइन-ट्यूनिंग की प्रोग्रेस को ट्रैक किया जा सकता है.

7. चरण 4: फ़ाइन-ट्यून किए गए नए मॉडल की मदद से अनुमान लगाएं

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

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

आपको यह नतीजा दिखेगा:

67061c36b7ba39b7.png

अगर आपको तुलना के लिए बेस मॉडल (text-bison@002) की मदद से अनुमान लगाना है, तो इन निर्देशों का पालन करें:

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

आपको यह नतीजा दिखेगा:

22ec58e4261405d6.png

भले ही, जनरेट किए गए दोनों टाइटल सही लग रहे हों, लेकिन डेटासेट में इस्तेमाल किए गए टाइटल की स्टाइल के हिसाब से पहला टाइटल (बेहतर मॉडल के साथ जनरेट किया गया) ज़्यादा बेहतर है.

फ़ाइन ट्यून किए गए मॉडल को लोड करें

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

इसके लिए, एलएलएम पर get_tuned_model() तरीके को शुरू किया जा सकता है. इसके लिए, Vertex AI Model Registry के डिप्लॉय किए गए फ़ाइन ट्यून किए गए मॉडल के पूरे ENDPOINT यूआरएल के साथ, यह तरीका अपनाया जा सकता है. ध्यान दें कि इस मामले में, आप उनकी संबंधित आईडी के बजाय PROJECT_NUMBER और MODEL_NUMBER डाल रहे हैं.

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. पांचवां चरण: ऑप्टिमाइज़ किए गए नए मॉडल का आकलन करना

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

  1. EVALUATION डेटासेट लोड करें:
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. बेहतर सुविधा वाले मॉडल पर, टेक्स्ट की खास जानकारी देने वाले टास्क के लिए इवैलुएशन का स्पेसिफ़िकेशन तय करें.
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

इस चरण को पूरा होने में कुछ मिनट लगेंगे. नतीजे में दिए गए पाइपलाइन जॉब लिंक का इस्तेमाल करके, काम की प्रोग्रेस को ट्रैक किया जा सकता है. पूरा होने के बाद, आपको आकलन का यह नतीजा दिखेगा:

387843d6c970e02.png

आकलन के नतीजे में मौजूद rougeLSum मेट्रिक, जवाब के लिए ROUGE-L स्कोर तय करती है. ROUGE-L, रीकॉल पर आधारित एक मेट्रिक है. यह किसी जवाब और रेफ़रंस के बारे में दी गई खास जानकारी के बीच के ओवरलैप को मापता है. इसका हिसाब लगाने के लिए, दो जवाब के बीच सबसे लंबे सामान्य सबसीक्वेंस (एलसीएस) को कैलकुलेट किया जाता है. इसके बाद, इसमें रेफ़रंस के जवाब की लंबाई से भाग दिया जाता है.

दिए गए एक्सप्रेशन में rougeLSum स्कोर 0.36600753600753694 है. इसका मतलब है कि यह 36.6% और रेफ़रंस वाले जवाबों में ओवरलैप कर रहा है.

अगर बेसलाइन मॉडल पर आकलन किया जाता है, तो आपको दिखेगा कि बेहतर मॉडल की तुलना में समरी स्कोर करीब-करीब ज़्यादा है.

आकलन के नतीजे, Cloud Storage की उस आउटपुट डायरेक्ट्री में देखे जा सकते हैं जिसे आपने इवैलुएशन जॉब बनाते समय तय किया था. फ़ाइल का नाम evaluation_metrics.json है. ट्यून किए गए मॉडल के लिए, Vertex AI Model Registry पेज पर, Google Cloud Console में भी इवैलुएशन के नतीजे देखे जा सकते हैं.

9. ज़रूरी बातें

  • मॉडल के साथ काम करने की सुविधा: यह देखने के लिए कि मॉडल से जुड़ी नई सुविधा काम करती है या नहीं, हमेशा दस्तावेज़ देखें.
  • रैपिड डेवलपमेंट: एलएलएम का क्षेत्र तेज़ी से आगे बढ़ता है. एक नया, ज़्यादा शक्तिशाली मॉडल, पुराने बेस पर बने बेहतरीन मॉडल से बेहतर परफ़ॉर्म कर सकता है. अच्छी बात यह है कि नए मॉडल उपलब्ध होने पर, उन्हें बेहतर बनाने की इन तकनीकों का इस्तेमाल किया जा सकता है.
  • LoRA: LoRA एक ऐसी तकनीक है जिसकी मदद से एलएलएम को बेहतर तरीके से बेहतर बनाया जा सकता है. इसके लिए, ट्रेन किए जा सकने वाले और कम रैंक वाले डिकंपोज़िशन मैट्रिक्स को पहले से ट्रेन किए गए मौजूदा मॉडल की लेयर में पेश किया जाता है. इसके बारे में ज़्यादा जानने के लिए, यहां क्लिक करें. बहुत बड़े एलएलएम के सभी पैरामीटर अपडेट करने के बजाय, LoRA ऐसे छोटे मैट्रिक्स को सीखता है जिन्हें ओरिजनल मॉडल के वेट मैट्रिक्स में जोड़ा जाता है या उससे गुणा किया जाता है. इससे, फ़ाइन-ट्यून करने के दौरान शामिल किए गए अतिरिक्त पैरामीटर की संख्या बहुत कम हो जाती है.

10. व्यवस्थित करें

इस कोडलैब में इस्तेमाल किए जाने वाले संसाधनों के लिए, आपके Google Cloud खाते पर शुल्क न लगे, इसके लिए यह तरीका अपनाएं:

  1. Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  2. प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे मिटाना है. इसके बाद, मिटाएं पर क्लिक करें.
  3. डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए, शट डाउन करें पर क्लिक करें.
  4. इसके अलावा, Model Registry पर जाकर, मॉडल डिप्लॉय और टेस्ट टैब पर जाकर, एंडपॉइंट को डिप्लॉय नहीं किया जा सकता है. साथ ही, डिप्लॉय किए गए ट्यून किए गए मॉडल को मिटाया जा सकता है.

11. बधाई हो

बधाई हो! आपने एलएलएम मॉडल को बेहतर बनाने के लिए, Vertex AI का इस्तेमाल कर लिया है. फ़ाइन ट्यूनिंग एक बेहतरीन तकनीक है. इसकी मदद से, डोमेन और टास्क के मुताबिक एलएलएम को अपनी पसंद के मुताबिक बनाया जा सकता है. Vertex AI में, आपको वे टूल और संसाधन मिलते हैं जिनकी मदद से, अपने मॉडल को बेहतर और असरदार तरीके से बेहतर बनाया जा सकता है.

GitHub के डेटा स्टोर करने की जगहों के बारे में जानें और फ़ाइन-ट्यूनिंग और आकलन का अनुभव लेने के लिए, सैंपल कोड के साथ एक्सपेरिमेंट करें. इस बारे में सोचें कि बेहतरीन एलएलएम से आपकी खास ज़रूरतों को कैसे पूरा किया जा सकता है. इनमें, टारगेट की गई मार्केटिंग कॉपी जनरेट करना, मुश्किल दस्तावेज़ों की खास जानकारी तैयार करना या सांस्कृतिक बारीकियों के साथ भाषाओं का अनुवाद करना शामिल है. Vertex AI के टूल और सेवाओं के बेहतरीन सुइट का इस्तेमाल करके, आसानी से अपने मॉडल बनाए जा सकते हैं, ट्रेनिंग दी जा सकती हैं, उनका आकलन किया जा सकता है, और उन्हें डिप्लॉय किया जा सकता है.