स्टेप 10 · इसे तेज़ बनाना
वही मॉडल, वही GPUs, तीन गुना थ्रूपुट। ज़्यादातर ट्रेनिंग रन इसका फ़ायदा उठाए बिना ही छूट जाते हैं।
60 सेकंड में
स्टेप 10 · इसे तेज़ बनाना
वही मॉडल, वही GPUs, तीन गुना थ्रूपुट। ज़्यादातर ट्रेनिंग रन इसका फ़ायदा उठाए बिना ही छूट जाते हैं।
रैंक की गई लिस्ट
| तकनीक | आमतौर पर मिलने वाला फ़ायदा | मेहनत (Effort) |
|---|---|---|
| bfloat16 मिक्स्ड प्रिसिजन | 2–3x | एक लाइन |
| torch.compile | 1.3–2x | एक लाइन |
| FlashAttention | लंबे कॉन्टेक्स्ट पर 1.5–3x | scaled_dot_product_attention के ज़रिए मुफ़्त |
| फ्यूज्ड ऑप्टिमाइज़र | 5–10% | एक आर्ग्यूमेंट |
| ग्रेडिएंट चेकपॉइंटिंग | बड़े बैच संभव बनाता है | एक लाइन, ~30% कंप्यूट का ख़र्च |
| सीक्वेंस पैकिंग | अलग-अलग लंबाई वाले डेटा पर 10–40% | मध्यम |
| बेहतर डेटा लोडिंग | कभी-कभी 2x | पहले से टोकनाइज़ (Pre-tokenise) और मेमोरी-मैप करें |
| नए हार्डवेयर पर FP8 | 1.3–1.8x | काफ़ी सावधानी की ज़रूरत |
FlashAttention इतना अहम क्यों है
सीक्वेंस पैकिंग
def pack(sequences, block_size, eos_id):
buf, out = [], []
for seq in sequences:
buf.extend(seq + [eos_id])
while len(buf) >= block_size:
out.append(buf[:block_size])
buf = buf[block_size:]
return out
# NOTE: pass document boundaries to the attention mask, or examples
# will attend across each other and quietly learn nonsense.ऑप्टिमाइज़ करने से पहले नापें
import time
torch.cuda.synchronize(); t0 = time.time()
for _ in range(20):
x, y = get_batch("train")
with torch.autocast("cuda", dtype=torch.bfloat16):
_, loss = model(x, y)
loss.backward(); opt.step(); opt.zero_grad(set_to_none=True)
torch.cuda.synchronize()
tok_per_s = 20 * x.numel() / (time.time() - t0)
flops = 6 * n_params * tok_per_s
print(f"{tok_per_s:,.0f} tok/s MFU {flops / peak_flops:.1%}")और देखें और पढ़ें
लैब
उसी हार्डवेयर पर 2x की स्पीड, स्टेप-बाय-स्टेप।
समस्या
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1अलग-अलग लंबाई वाले डेटा पर पैकिंग से आपको 35% फ़ायदा मिला। बताएं कि इससे कौन सा बग आता है और आप इसे कैसे पकड़ते हैं।दिखाएं
अक्सर पूछे जाने वाले सवाल
bf16 या fp16?
Ampere या उसके बाद के किसी भी हार्डवेयर पर bfloat16 इस्तेमाल करें। इसमें fp32 जितनी ही एक्सपोनेंट रेंज होती है, इसलिए यह ओवरफ्लो नहीं होता और इसमें लॉस स्केलिंग की ज़रूरत नहीं पड़ती। fp16 में मैन्टिसा प्रिसिजन ज़्यादा होता है लेकिन रेंज कम होती है, जिससे बड़े मॉडल की ट्रेनिंग नाज़ुक (fragile) हो जाती है।
क्या FP8 काम का है?
जो हार्डवेयर इसे सपोर्ट करता है, उस पर बड़े रन के लिए यह वाकई काम का है — लेकिन इसमें हर-टेन्सर स्केलिंग और नाज़ुक लेयर्स को बहुत सावधानी से संभालने की ज़रूरत होती है। यहाँ से शुरुआत न करें। पहले bf16 और compile को ठीक से काम करने दें।
मेरा GPU यूटिलाइज़ेशन ज़्यादा है लेकिन थ्रूपुट कम क्यों है?
यूटिलाइज़ेशन पर्सेंटेज सिर्फ़ यह बताता है कि GPU व्यस्त है, यह नहीं कि वह काम का हिसाब-किताब (arithmetic) कर रहा है। हो सकता है कि वह सिर्फ़ मेमोरी इधर-उधर करने में व्यस्त हो। MFU ही सही और सच्चा मीट्रिक है।
क्या torch.compile से कभी नुकसान हो सकता है?
यह पहली बार चलने पर कंपाइल होने में समय लेता है और हर नए इनपुट शेप पर दोबारा कंपाइल होता है। बहुत ज़्यादा बदलने वाले (dynamic) शेप्स के साथ आप कंप्यूट करने से ज़्यादा समय कंपाइल करने में बिता सकते हैं। फ़िक्स्ड शेप्स के साथ compile करना ही सबसे तेज़ तरीक़ा है।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।