फ़ाइन-ट्यून के बड़े लैंग्वेज मॉडल: 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" जैसे किसी बेस मॉडल को चुनें. इसके बाद, Vertex AI SDK for Python का इस्तेमाल करके, अपने समाचार डेटा के हिसाब से उसे बेहतर बनाएं.
  • नतीजों का आकलन करें: हेडलाइन जनरेट करने की क्वालिटी में हुए सुधार को देखने के लिए, फ़ाइन-ट्यून किए गए मॉडल की परफ़ॉर्मेंस की तुलना बेस मॉडल से करें.
  • अपने मॉडल को डिप्लॉय करें और उसका इस्तेमाल करें: फ़ाइन-ट्यून किए गए मॉडल को एपीआई एंडपॉइंट के ज़रिए उपलब्ध कराएं. साथ ही, नए लेखों के लिए अपने-आप हेडलाइन जनरेट करना शुरू करें.

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

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

3. लार्ज लैंग्वेज मॉडल को फ़ाइन-ट्यून करना

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

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

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

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

repo में मौजूद .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. चौथा चरण: फ़ाइन-ट्यून किए गए नए मॉडल से अनुमान लगाना

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

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

जनरेट किए गए दोनों टाइटल सही लग रहे हैं. हालांकि, पहले टाइटल (फ़ाइन-ट्यून किए गए मॉडल से जनरेट किया गया) की स्टाइल, सवाल के डेटासेट में इस्तेमाल किए गए टाइटल की स्टाइल से ज़्यादा मिलती-जुलती है.

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

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

इसके लिए, एलएलएम पर 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 है. ट्यून किए गए मॉडल के लिए, Google Cloud Console में Vertex AI के मॉडल रजिस्ट्री पेज पर जाकर भी आकलन के नतीजे देखे जा सकते हैं.

9. विचार करने वाली ज़रूरी बातें

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

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

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

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

11. बधाई हो

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

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