English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

ग्रेडिएंट स्पाइक्स कहाँ से आते हैं

एक शांत मिनी-बैच और एक झटकेदार

अधिकांश मिनी-बैच उचित परिमाण के ग्रेडिएंट्स उत्पन्न करते हैं। एक मॉडल के लिए क्रॉस-एंट्रॉपी लॉस जो पहले से ही डेटा को लगभग फिट करता है, एक संकुचित बैंड में रहता है; बैकप्रॉप उस सिग्नल को समान आकार के ग्रेडिएंट्स के रूप में पीछे ले जाता है।


कुछ मिनी-बैच ऐसा नहीं करते। ग्रेडिएंट स्पाइक्स के तीन स्रोत:


1. आउटलायर उदाहरण। एक एकल अनुक्रम जिसमें अत्यंत दुर्लभ टोकन संयोजन होता है, वह औसत से बहुत दूर हानि और औसत से बहुत दूर ग्रेडिएंट उत्पन्न करता है।

2. संख्यात्मक एज केस। नर-शून्य सॉफ्टमैक्स denominator, NaN उत्पन्न करने वाला layernorm, FP16 overflow। प्रत्येक सामान्य से कई गुना बड़े ग्रेडिएंट उत्पन्न कर सकता है।

3. वितरण परिवर्तन। एक ही प्रशिक्षण रन के दौरान डेटा स्रोतों को स्विच करना मॉडल को नई वितरण से झटका देता है। ANDREA का bandit हर 7 से 42 स्टेप्स पर स्रोत वजन reshuffles करता है। प्रत्येक स्विच एक छोटा वितरण परिवर्तन है।


ANDREA-120M v1: स्पाइक कैस्केड

v1 में कोई gradient clipping नहीं था। bandit से हर 7 से 42 स्टेप्स पर स्रोत transitions ने मॉडल को repo-docs (list-structured) के संक्षिप्त bursts, फिर gutenberg (long prose), फिर hermes3-general (Q&A) प्रदान किए। प्रत्येक transition ने gradient spikes उत्पन्न किए: प्रत्येक spike ने 120M scale पर weights को degenerate attractors में धकेल दिया।


मुख्य अनुभवजन्य तथ्य। ANDREA-12M ने क्लिपिंग के बिना उसी बैंडिट को सहन किया। छोटे वजन मैट्रिक्स ग्रेडिएंट शॉक्स के प्रति मजबूत रहते हैं; एक खराब बैच 12M पैरामीटर्स को रनअवे एट्रैक्टर में नहीं धकेल सकता जैसा कि 120M को धकेल सकता है। स्केलिंग के साथ क्लिपिंग अधिक महत्वपूर्ण हो जाती है।

ग्लोबल L2 नॉर्म क्लिपिंग

दो विकल्प: प्रति-टेंसर या ग्लोबल

ग्रेडिएंट परिमाणों को बांधने के दो तरीके:


प्रति-टेंसर क्लिपिंग। प्रत्येक ग्रेडिएंट टेंसर को स्वतंत्र रूप से क्लिप करें। एम्बेडिंग ग्रेडिएंट को अपनी नॉर्म तक क्लिप किया जाता है; अटेंशन ग्रेडिएंट को अपनी नॉर्म तक क्लिप किया जाता है। सरल, लेकिन सापेक्ष स्केलों को विकृत करता है: एक टेंसर में छोटा स्पाइक (अब शून्य ग्रेडिएंट) दूसरे में विशाल ग्रेडिएंट (अस्पृश्य) के साथ जोड़ता है।


ग्लोबल L2 नॉर्म क्लिपिंग। सभी ग्रेडिएंट्स को एक बड़े वेक्टर के रूप में मानें। हर पैरामीटर पर कुल L2 नॉर्म की गणना करें। यदि नॉर्म max_norm से अधिक हो, तो हर ग्रेडिएंट को समान फैक्टर से स्केल करें। टेंसर्स के पार सापेक्ष परिमाणों को संरक्षित करता है।


एंड्रिया ग्लोबल का उपयोग करता है। पास्कानु एट अल. (2013) ने अनुभवजन्य रूप से प्रदर्शित किया कि ट्रांसफॉर्मर ट्रेनिंग के लिए ग्लोबल क्लिपिंग प्रति-टेंसर से बेहतर प्रदर्शन करता है।


गणित

ग्लोबल L2 नॉर्म की गणना करें:


norm = sqrt(sum over all params of g_i^2)


यदि norm <= max_norm, तो ग्रेडिएंट्स अपरिवर्तित रूप से गुजर जाते हैं। यदि norm > max_norm, तो हर ग्रेडिएंट को max_norm / norm से स्केल करें:


g_i_clipped = g_i * (max_norm / norm)


स्केलिंग के बाद, नया norm ठीक max_norm के बराबर हो जाता है। ANDREA max_norm = 1.0 का उपयोग करता है।

स्केल फैक्टर की गणना

मान लीजिए कि एक ट्रेनिंग स्टेप के दौरान, सभी ग्रेडिएंट्स का ग्लोबल L2 norm `3.5` निकलता है। ANDREA का `max_norm = 1.0` है। गणना करें (a) लागू होने वाला स्केल फैक्टर, (b) स्केलिंग के बाद नया ग्लोबल L2 norm क्या होगा, & (c) यदि अनक्लिप्ड norm `3.5` के बजाय `0.4` होता तो क्या होता। अपना अंकगणित दिखाएं।

ग्रेडिएंट नॉर्म कम्प्यूटेशन को तीन कर्नेल की क्यों जरूरत है

नॉइव एल्गोरिदम GPU पर नहीं चल सकता

ग्लोबल L2 नॉर्म कम्प्यूटेशन के लिए छद्मकोड:


कुल = 0
प्रत्येक पैरामीटर p के लिए:
प्रत्येक तत्व g में p.grad:
कुल += g * g
नॉर्म = sqrt(कुल)

GPU पर, यह सरल लूप दो कारणों से विफल हो जाता है:


1. क्रमिक संचय। एकल total संचयक हर थ्रेड को हर अन्य थ्रेड का इंतजार करने के लिए मजबूर करता है, जो GPU समानांतरता को विफल कर देता है।

2. विषम टेंसर। ANDREA-120M के टेंसर बहुत अलग आकारों के होते हैं: एम्बेडिंग (8449 x 768), ध्यान QKV (768 x 768), लेयरनॉर्म (768)। एक कर्नेल सभी आकारों पर कुशलता से पुनरावृति नहीं कर सकता।


ANDREA का तीन-कर्नेल पाइपलाइन

काम को microgpt_cuda.cu में तीन CUDA कर्नलों में विभाजित करें:


कर्नेल 1: k_grad_norm_partial प्रत्येक पैरामीटर टेंसर के लिए, वर्गों का आंशिक योग व्यय करें। प्रत्येक थ्रेड ब्लॉक टेंसर के एक चंक को कम करता है; परिणाम एक छोटे स्क्रैच बफर में लिखे जाते हैं। समानांतरता: चंक प्रति एक ब्लॉक, सभी टेंसर्स पर सैकड़ों ब्लॉक।


Kernel 2: k_grad_norm_final. स्क्रैच बफर को एकल स्केलर में कम करें। इसका वर्गमूल लें। एक छोटा kernel, माइक्रोसेकंड्स में चलता है।


Kernel 3: k_grad_scale. यदि norm > max_norm, तो scale = max_norm / norm की गणना करें & हर ग्रेडिएंट तत्व को scale से गुणा करें। हर ग्रेडिएंट टेंसर पर एक पास, शर्मनाक रूप से समानांतर।


क्रम महत्वपूर्ण है: Pre-Adam

क्लिपिंग पाइपलाइन AdamW द्वारा m, v, या किसी पैरामीटर को अपडेट करने से पहले चलती है। क्यों?


क्लिप्ड ग्रेडिएंट्स AdamW के एक्सपोनेंशियल मूविंग एवरेजेस को फीड करते हैं। यदि कोई स्पाइक m & v में फ्लो करने दिया जाए, तो यह उन रनिंग एवरेजेस को करप्ट कर देगा & स्पाइक के बाद कई स्टेप्स के लिए रिकवरी को धीमा कर देगा। क्लिपिंग pre-Adam रखना स्पाइक के प्रभाव को सिंगल बैड स्टेप तक सीमित रखता है।


Gradient Clipping with 3 CUDA Kernels

तीन कर्नेल्स क्यों, एक नहीं?

मान लीजिए कोई व्यक्ति `k_grad_norm_partial` & `k_grad_norm_final` को मर्ज करके एक सिंगल कर्नेल में बदलने का प्रस्ताव देता है जो एक पास में पूरा ग्लोबल नॉर्म कम्प्यूट करे। एक स्पेसिफिक कारण बताएं कि यह मर्जर GPU पर या तो फेल हो जाएगा या वर्स्ट परफॉर्म करेगा। GPU थ्रेड ब्लॉक्स कैसे मेमोरी शेयर करते हैं & सिंक्रोनाइज़ करते हैं, इसका रेफरेंस दें।

No-Clipping ने v1 को कैसे मार डाला

हर 7 से 42 स्टेप्स में बैंडिट सोर्स ट्रांज़िशन

ANDREA का बैंडिट चरणों में काम करता है। प्रत्येक चरण 7, 14, 21, 28, या 42 स्टेप्स (यादृच्छिक रूप से चुना गया) तक रहता है। प्रत्येक चरण की सीमा पर, सोर्स वेट्स शिफ्ट होते हैं: शायद repo-docs 0.1 से 0.6 पर कूद जाता है, gutenberg 0.4 से 0.1 पर गिर जाता है, hermes3-general 0.5 से 0.7 पर बढ़ जाता है।


प्रत्येक ट्रांज़िशन मॉडल के लिए एक डिस्ट्रीब्यूशन शॉक है। लॉस थोड़े समय के लिए स्पाइक करता है। ग्रेडिएंट्स उसके साथ स्पाइक करते हैं: एक मॉडल जो gutenberg-स्वाद वाली गद्य के खिलाफ लॉस को न्यूनतम कर रहा था, अब repo-docs-स्वाद वाली लिस्ट संरचनाओं को देखता है, & ग्रेडिएंट्स में सुधारक सिग्नल होता है जो सामान्य परिमाण का 10x या 100x हो सकता है।


v1 फेलियर मोड

क्लिपिंग के बिना, वे 10-100x ग्रेडिएंट स्पाइक्स AdamW के m & v औसत में बह गए। AdamW का स्मूथिंग का मतलब था कि स्पाइक प्रभाव वास्तविक खराब बैच के कई स्टेप्स बाद तक बना रहा। वैनिला Adam (v1 में) के साथ कोई वेट डिके (weight decay) न होने पर, स्पाइक-चालित वेट अपडेट्स चरणों में संचित होते गए जब तक वेट्स एक डिजेनरेट एट्रैक्टर में ड्रिफ्ट नहीं हो गए: एक टोकन का लॉजिट सॉफ्टमैक्स पर हावी हो गया, सैंपल्ड आउटपुट वह टोकन था, ट्रेनिंग कॉन्टेक्स्ट में वह टोकन था, ग्रेडिएंट ने उस टोकन को रीइनफोर्स किया। Repetition lock-in.


v2 स्थिरता

v2 ने max_norm = 1.0 के साथ क्लिपिंग जोड़ी, AdamW & LR warmup के साथ। m & v पर स्पाइक प्रभाव सीमित है; वेट्स lr max_norm = 0.0003 1.0 = 0.0003 से तेज ड्रिफ्ट नहीं कर सकते प्रति पैरामीटर प्रति स्टेप पीक पर। फेज ट्रांजिशन्स अभी भी स्पाइक्स पैदा करते हैं, लेकिन वे ऑप्टिमाइजर तक पहुंचने से पहले कैप हो जाते हैं।


परिणाम: v2 (डेटा फिल्टर v2.5 & v3 पॉलिश के बाद) ने तथ्यात्मक रिकॉल, मल्टी-पैराग्राफ कोहेरेंस, & बायोलॉजी & सिग्नल-प्रोसेसिंग सैंपल्स पर 9.5/10 बाहरी ग्रेड्स हासिल किए।


क्षमता-भंगुरता संयोजन

एक ही बैंडिट। एक ही डेटा। एक ही हाइपरपैरामीटर्स सिवाय क्लिपिंग के। 12M ने क्लिपिंग के बिना क्यों सर्वाइव किया जबकि 120M कोलैप्स हो गया?


दो संयुक्त कारक:


1. बड़े वेट मैट्रिक्स ज्यादा एट्रैक्टर्स स्टोर करते हैं। एक 768x768 अटेंशन प्रोजेक्शन में 590K पैरामीटर्स हैं; प्रति-पैरामीटर ड्रिफ्ट भी छोटा हो तो अटेंशन व्यवहार में सार्थक बदलाव आते हैं। एक 384x384 अटेंशन प्रोजेक्शन में 147K पैरामीटर्स हैं & यह अधिक सीमित सबस्पेस में रहता है।

2. ज्यादा लेयर्स का मतलब ज्यादा मल्टीप्लिकेटिव इंटरैक्शन्स। v3 में 12 ट्रांसफॉर्मर लेयर्स हैं (12M के 6 की तुलना में)। स्पाइक्स 12 लेयर्स की संयुक्त नॉनलाइनैरिटीज से गुजरते हैं; हर लेयर पिछले लेयर के ड्रिफ्ट को बढ़ा सकती है।


कपैसिटी के साथ ब्रिटलनेस बढ़ती है। कुछ स्केल थ्रेशोल्ड से ऊपर क्लिपिंग अनिवार्य हो जाती है; ANDREA उस थ्रेशोल्ड को 12M & 120M पैरामीटर्स के बीच रखता है।

v1 कैस्केड का निदान

मान लीजिए v1 ट्रेनिंग के चरण 50,000 पर, एक एकल मिनी-बैच ऐसा ग्रेडिएंट उत्पन्न करता है जिसका वैश्विक L2 मानक 50.0 है (सामान्य बैच ~0.5 उत्पन्न करते हैं)। यदि बाद के बैच सामान्य ग्रेडिएंट परिमाण पर लौट आएं, तो अगले 10 चरणों में AdamW के पहले क्षण `m` के साथ क्या होता है, इसका पता लगाएं। विचार करें कि `m = beta1 * m + (1 - beta1) * g` जिसमें beta1=0.9, स्पाइक को कैसे प्रचारित करता है।

क्लिपिंग कहाँ और लागू होती है?

ANDREA के बैंडिट-चालित पाठ्यक्रम से परे, एक अन्य ट्रेनिंग परिदृश्य का नाम बताएं जहाँ वैश्विक L2 ग्रेडिएंट क्लिपिंग समान रूप से महत्वपूर्ण होगी, एवं एक तंत्र बताएं जो इसे ऐसा बनाता है।

संबद्ध गतिविधियाँ

क्लिपिंग से जुड़े तीन भाई-बहन:


- गतिविधि 10: AdamW। क्लिपिंग AdamW के m & v को स्पाइक प्रदूषण से बचाता है। क्लिपिंग के बिना, एक खराब बैच ऑप्टिमाइज़र स्टेट को 50+ स्टेप्स के लिए भ्रष्ट करता है।

- गतिविधि 11: LR वार्मअप। वार्मअप lr को डैंप करता है; क्लिपिंग g को डैंप करता है। साथ में: स्टेप 1 पर, सबसे खराब स्थिति पैरामीटर अपडेट lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7 है, बनाम 0.0003 * 50 = 0.015 बिना किसी गार्ड के। सबसे खराब स्थिति प्रारंभिक अपडेट परिमाण में 100,000x कमी।

- गतिविधि 14: मल्टी-आर्म्ड बैंडिट्स। बैंडिट चरण की लंबाई (7 से 42 चरण) विशेष रूप से इसीलिए छोटी रखी गई है ताकि कोई एक स्रोत हावी न हो; क्लिपिंग ही वह है जो उन लगातार संक्रमणों को सुरक्षित बनाती है।


क्लिपिंग ट्रांसफॉर्मर ट्रेनिंग में सबसे सस्ती स्थिरता जीत है: 3 छोटे CUDA कर्नेल, प्रति चरण माइक्रोसेकंड, 120M+ मॉडल्स के अभिसरण या पतन पर निर्णायक प्रभाव।