एआई मॉडल और प्लेटफ़ॉर्म
बड़े भाषा मॉडल के लिए मेमोरी का अनुकूलन और मेमोरी आवश्यकताओं का अनुमान
बड़े भाषा मॉडल (LLM) जैसे GPT-4, Bloom, और LLaMA ने अरबों पैरामीटर तक स्केल करने के बाद उल्लेखनीय क्षमताएं हासिल की हैं। हालांकि, इन विशाल मॉडलों को अनुमान या फाइन-ट्यूनिंग के लिए तैनात करना उनकी विशाल मेमोरी आवश्यकताओं के कारण चुनौतीपूर्ण है। इस तकनीकी ब्लॉग में, हम LLM अनुमान और फाइन-ट्यूनिंग के दौरान मेमोरी खपत को अनुमानित करने और विभिन्न हार्डवेयर सेटअप में मेमोरी की खपत को अनुकूलित करने के लिए तकनीकों का अन्वेषण करेंगे।
मेमोरी आवश्यकताओं को समझना
एक LLM को लोड करने के लिए आवश्यक मेमोरी मुख्य रूप से पैरामीटर की संख्या और पैरामीटर को संग्रहीत करने के लिए उपयोग की जाने वाली संख्यात्मक सटीकता द्वारा निर्धारित की जाती है। एक सरल नियम यह है:
- एक मॉडल को X अरब पैरामीटर के साथ लोड करने के लिए लगभग 4X जीबी वीआरएएम की आवश्यकता होती है 32-बिट फ्लोट सटीकता में
- एक मॉडल को X अरब पैरामीटर के साथ लोड करने के लिए लगभग 2X जीबी वीआरएएम की आवश्यकता होती है 16-बिट बफ्लोट16/फ्लोट16 सटीकता में
उदाहरण के लिए, 175B पैरामीटर GPT-3 मॉडल को लोड करने के लिए लगभग 350GB वीआरएएम की आवश्यकता होगी बफ्लोट16 सटीकता में। आज, सबसे बड़े व्यावसायिक रूप से उपलब्ध जीपीयू जैसे एनवीडिया ए100 और एच100 केवल 80GB वीआरएएम प्रदान करते हैं, जिससे टेंसर समांतरवाद और मॉडल समांतरवाद जैसी तकनीकों की आवश्यकता होती है।
अनुमान के दौरान, मेमोरी फुटप्रिंट मॉडल पैरामीटर और अस्थायी एक्टिवेशन टेंसर द्वारा प्रबलित होता है। अनुमान के दौरान शीर्ष मेमोरी उपयोग के लिए एक उच्च-स्तरीय अनुमान मॉडल पैरामीटर और एक्टिवेशन के लिए आवश्यक मेमोरी के योग के रूप में है।
अनुमान मेमोरी को मात्रा निर्धारित करना
आइए OctoCode मॉडल का उपयोग करके अनुमान मेमोरी आवश्यकताओं को मात्रा निर्धारित करें, जिसमें बफ्लोट16 प्रारूप (~ 31GB) में लगभग 15 अरब पैरामीटर हैं। हम ट्रांसफॉर्मर लाइब्रेरी का उपयोग करके मॉडल को लोड करेंगे और पाठ उत्पन्न करेंगे:
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch <p>model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", torch_dtype=torch.bfloat16, device_map="auto", pad_token_id=0) tokenizer = AutoTokenizer.from_pretrained("bigcode/octocoder") pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)</p> <p>prompt = "प्रश्न: पाइथन में बाइट्स को गीगाबाइट में बदलने के लिए एक फ़ंक्शन लिखें।\n\nउत्तर:" result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):]</p> <p>def bytes_to_gigabytes(bytes): return bytes / 1024 / 1024 / 1024</p> <p>bytes_to_gigabytes(torch.cuda.max_memory_allocated())
आउटपुट:
29.0260648727417शीर्ष जीपीयू मेमोरी उपयोग लगभग 29GB है, जो हमारे 31GB के अनुमान के साथ मेल खाता है बफ्लोट16 प्रारूप में मॉडल पैरामीटर को लोड करने के लिए।
अनुमान मेमोरी को क्वांटाइजेशन के साथ अनुकूलित करना
जबकि बफ्लोट16 LLM को प्रशिक्षित करने के लिए सामान्य सटीकता है, शोधकर्ताओं ने पाया है कि मॉडल वजन को कम सटीकता वाले डेटा प्रकारों जैसे 8-बिट पूर्णांक (int8) या 4-बिट पूर्णांक में क्वांटाइज़ करने से मेमोरी उपयोग में काफी कमी आ सकती है अनुमान कार्यों जैसे पाठ उत्पन्न के लिए न्यूनतम सटीकता हानि के साथ।
आइए OctoCode मॉडल के लिए 8-बिट और 4-बिट क्वांटाइजेशन से मेमोरी बचत देखें:
&lt;/div&gt; # 8-बिट क्वांटाइजेशन model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_8bit=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())</pre>
आउटपुट:
15.219234466552734# 4-बिट क्वांटाइजेशन model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_4bit=True, low_cpu_mem_usage=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())
आउटपुट:
9.5435743331909188-बिट क्वांटाइजेशन के साथ, मेमोरी आवश्यकता 31GB से 15GB तक कम हो जाती है, जबकि 4-बिट क्वांटाइजेशन इसे और 9.5GB तक कम कर देता है! यह 15B पैरामीटर वाले OctoCode मॉडल को RTX 3090 (24GB वीआरएएम) जैसे उपभोक्ता जीपीयू पर चलाने की अनुमति देता है।
हालांकि, ध्यान दें कि 4-बिट जैसी अधिक आक्रामक क्वांटाइजेशन कभी-कभी 8-बिट या बफ्लोट16 सटीकता की तुलना में सटीकता में कमी का कारण बन सकती है। उपयोगकर्ताओं को अपने उपयोग के मामले के लिए मेमोरी बचत और सटीकता के बीच व्यापार का मूल्यांकन करना चाहिए।
क्वांटाइजेशन एक शक्तिशाली तकनीक है जो बादल उदाहरण, एज डिवाइस या यहां तक कि मोबाइल फोन जैसे संसाधन-सीमित वातावरण में एलएलएम तैनाती को सक्षम बना सकती है मेमोरी फुटप्रिंट को काफी कम करके।
फाइन-ट्यूनिंग के लिए मेमोरी का अनुमान
जबकि क्वांटाइजेशन मुख्य रूप से कुशल अनुमान के लिए उपयोग किया जाता है, टेंसर समांतरवाद और मॉडल समांतरवाद जैसी तकनीकें बड़े भाषा मॉडल के प्रशिक्षण या फाइन-ट्यूनिंग के दौरान मेमोरी आवश्यकताओं को प्रबंधित करने के लिए महत्वपूर्ण हैं।
फाइन-ट्यूनिंग के दौरान शीर्ष मेमोरी उपयोग आमतौर पर अनुमान से 3-4 गुना अधिक होता है क्योंकि ग्रेडिएंट, ऑप्टिमाइज़र राज्य और बैकप्रोपेगेशन के लिए आगे बढ़ने वाले पास से एक्टिवेशन जैसे अतिरिक्त मेमोरी आवश्यकताओं के कारण:
- ग्रेडिएंट
- ऑप्टिमाइज़र राज्य
- बैकप्रोपेगेशन के लिए आगे बढ़ने वाले पास से एक्टिवेशन
एक रूढ़िवादी अनुमान यह है कि एक एलएलएम को एक्स अरब पैरामीटर के साथ फाइन-ट्यून करने के लिए लगभग 4 * (2X) = 8X जीबी वीआरएएम की आवश्यकता होती है बफ्लोट16 सटीकता में।
उदाहरण के लिए, 7B पैरामीटर वाले एलएलएमए मॉडल को फाइन-ट्यून करने के लिए लगभग 7 * 8 = 56GB वीआरएएम की आवश्यकता होगी प्रति जीपीयू बफ्लोट16 सटीकता में। यह वर्तमान जीपीयू की मेमोरी क्षमता से अधिक है, जिससे वितरित फाइन-ट्यूनिंग तकनीकों की आवश्यकता होती है।
वितरित फाइन-ट्यूनिंग तकनीक
जीपीयू मेमोरी प्रतिबंधों को पार करने के लिए बड़े मॉडल के लिए कई वितरित फाइन-ट्यूनिंग विधियों का प्रस्ताव किया गया है:
- डेटा समांतरवाद: डेटा समांतरवाद का क्लासिक दृष्टिकोण पूरे मॉडल को कई जीपीयू में दोहराता है जबकि प्रशिक्षण डेटा बैच को विभाजित और वितरित करता है। यह प्रशिक्षण समय को जीपीयू की संख्या के साथ रैखिक रूप से कम करता है लेकिन प्रत्येक जीपीयू पर शीर्ष मेमोरी आवश्यकता को कम नहीं करता है।
- जीरो स्टेज 3: डेटा समांतरवाद का एक उन्नत रूप जो मॉडल पैरामीटर, ग्रेडिएंट और ऑप्टिमाइज़र राज्य को जीपीयू में विभाजित करता है। यह क्लासिक डेटा समांतरवाद की तुलना में मेमोरी को कम करता है क्योंकि यह प्रत्येक जीपीयू पर विभिन्न प्रशिक्षण चरणों के दौरान केवल विभाजित डेटा को रखता है।
- टेंसर समांतरवाद: टेंसर समांतरवाद के बजाय मॉडल को दोहराने के बजाय, टेंसर समांतरवाद मॉडल पैरामीटर को पंक्तियों या स्तंभों में विभाजित करता है और उन्हें जीपीयू में वितरित करता है। प्रत्येक जीपीयू एक विभाजित सेट पैरामीटर, ग्रेडिएंट और ऑप्टिमाइज़र राज्य पर कार्य करता है, जिससे महत्वपूर्ण मेमोरी बचत होती है।
- पाइपलाइन समांतरवाद: इस तकनीक में मॉडल परतों को विभिन्न जीपीयू/वर्करों में विभाजित किया जाता है, प्रत्येक डिवाइस एक सब्सेट परतों को निष्पादित करता है। एक्टिवेशन वर्करों के बीच पारित किए जाते हैं, जिससे शीर्ष मेमोरी कम हो जाती है लेकिन संचार ओवरहेड बढ़ जाता है।
इन वितरित विधियों के लिए मेमोरी उपयोग का अनुमान लगाना गैर-मामूली है क्योंकि पैरामीटर, ग्रेडिएंट, एक्टिवेशन और ऑप्टिमाइज़र राज्य का वितरण तकनीकों में भिन्न होता है। इसके अलावा, ट्रांसफॉर्मर बॉडी और भाषा मॉडलिंग हेड जैसे विभिन्न घटक अलग-अलग मेमोरी आवंटन व्यवहार प्रदर्शित कर सकते हैं।
एलएलएमेम समाधान
शोधकर्ताओं ने हाल ही में एलएलएमेम का प्रस्ताव किया है, जो एक समाधान है जो एलएलएम के लिए जीपीयू मेमोरी खपत का सटीक अनुमान लगाता है जब वितरित फाइन-ट्यूनिंग विधियों को कई जीपीयू पर लागू किया जाता है।
एलएलएमेम जीरो स्टेज 3 में गणना से पहले पैरामीटर को पुनः संयोजित करने और टेंसर समांतरवाद में बैकवर्ड पास में आउटपुट एकत्रीकरण जैसे कारकों पर विचार करता है।
प्रायोगिक परिणाम दिखाते हैं कि एलएलएमेम एक जीपीयू पर एलएलएम के लिए शीर्ष जीपीयू मेमोरी उपयोग का अनुमान 1.6% की त्रुटि दर के साथ लगा सकता है, जो राज्य-ऑफ-द-आर्ट डीएनएनमेम की 42.6% की औसत त्रुटि दर से बेहतर है। जब एलएलएम को एक अरब से अधिक पैरामीटर के साथ कई जीपीयू पर वितरित फाइन-ट्यूनिंग विधियों को लागू किया जाता है, तो एलएलएमेम 3.0% की औसत त्रुटि दर प्राप्त करता है।













