मूल स्पारस ध्यान (डीपसेक एनएसए)
Type: Build
Languages: Python (stdlib)
Prerequisites: Phase 7 · 12 (KV cache, flash-attention), Phase 7 · 15 (attention variants), Phase 10 · 16 (differential attention)
Time: ~60 minutes
सीखने के लक्ष्य
- तीन एनएसए ध्यान शाखाओं और क्या प्रत्येक कैप्चर बताओ.
- एनएसए को "स्वभाविक रूप से प्रशिक्षित" क्यों किया जाता है, जहां पहले के कम ध्यान देने वाले तरीके केवल निष्कर्ष के रूप में थे, इसकी व्याख्या करें।
- संपीड़न ब्लॉक आकार और चयन शीर्ष-के के फ़ंक्शन के रूप में एनएसए के ध्यान गणना बचत बनाम पूर्ण ध्यान के 64k संदर्भ पर गणना करें।
- stdlib पायथन में तीन शाखाओं के संयोजन को एक छोटे सिंथेटिक अनुक्रम पर लागू करें और गेटिंग वजन व्यवहार की जांच करें।
समस्या
अनुक्रम लंबाई N लागत पर पूर्ण ध्यान O(N^2)समय और O(N)KV कैश प्रति परत। 64k टोकन पर, गणना और मेमोरी बैंडविड्थ संख्या विनाशकारी हैं। एनएसए पेपर से मापा गया सैद्धांतिक अनुमानः ध्यान 64k पर कुल डिकोडिंग विलंबता का 70-80% है। सब कुछ डाउनस्ट्रीम TTFT, टोकन / सेकंड, प्रति मिलियन टोकन ध्यान लागत से हावी है।
कम ध्यान स्पष्ट उत्तर है। पहले के प्रयास दो बाल्टियों में गिर जाते हैं। फिक्स्ड-पैटर्न स्पायरिटी (स्लाइडिंग-विंडो, स्टेड्ड, ब्लॉक-लोकल) सूचना को फेंक देती है और लंबी दूरी के रिकॉल कार्यों में विफल होती है। इन्फेरेंस-टाइम स्पायरसिटी (केवी कैश कटिंग, एच2ओ, स्ट्रीमिंगएलएलएम) को घने ध्यान पर पूर्व-प्रशिक्षित मॉडल पर लागू किया जाता है और संभावित स्पीडअप का केवल एक अंश पुनर्प्राप्त करता है क्योंकि मॉडल से कभी भी स्पायर पैटर्न के माध्यम से जानकारी को रूट करने के लिए नहीं कहा गया था।
मूल स्पार्स ध्यान (युआन एट अल, डीपसेक + पीकेयू + यूडब्ल्यू, एसीएल 2025 सर्वश्रेष्ठ पेपर, आर्एक्सआईवीः 2502.11089) दोनों करता हैः एक स्पार्सता पैटर्न मॉडल प्री-ट्रेनिंग के दौरान सीखता है, एक कर्नेल-अनुसूचित एल्गोरिथ्म के रूप में लागू होता है जो वास्तव में निष्कर्ष पर गणना बचत प्रदान करता है। दो साल बाद, एनएसए या एक प्रत्यक्ष वंशज हर सीमा-लंबी संदर्भ मॉडल पर डिफ़ॉल्ट ध्यान है।
अवधारणा
तीन समानांतर शाखाएँ
प्रत्येक क्वेरी के लिए, एनएसए तीन बार ध्यान चलाता है, केवी कैश के तीन अलग-अलग दृश्यों के खिलाफः
- Compressed branch.टोकन आकार के ब्लॉक में समूहीकृत हैं
lप्रत्येक ब्लॉक को एक छोटे से सीखे गए MLP के माध्यम से एक एकल सारांश टोकन में संपीड़ित किया जाता है। क्वेरी इन संपीड़ित टोकन पर मौजूद होती है, जिससे पूरे अनुक्रम का एक मोटा-मोटा दृश्य मिलता है।
- Selected branch.संपीड़ित शाखा से ध्यान स्कोर का उपयोग करके, वर्तमान क्वेरी के लिए सबसे प्रासंगिक शीर्ष-के ब्लॉक की पहचान की जाती है। उन ब्लॉक से बारीक-बीज (अनसंपीड़ित) टोकन पढ़े जाते हैं और क्वेरी उन सभी पर उपस्थित होती है। चयन के लिए रूटिंग सिग्नल के रूप में संपीड़ित शाखा ध्यान के बारे में सोचें।
- Sliding-window branch.प्रश्न नवीनतम पर ध्यान देता है
Wस्थानीय संदर्भ के लिए टोकन (आमतौर पर 512) । यह शाखा संरचना-भारी लघु-रेंज पैटर्न (सिंटैक्स, स्थानीय कोरफेरेंस) को कैप्चर करती है जो अन्य दो को याद आ सकती है।
तीन शाखा आउटपुट एक सीखे गए प्रति-स्थिति गेट के माध्यम से संयुक्त होते हैंः
out = g_cmp * out_cmp + g_sel * out_sel + g_win * out_wing_cmp, g_sel, g_winवे 1 तक योग करने की जरूरत नहीं है वे स्वतंत्र रूप से शाखाओं वजन कर सकते हैं।
यह "स्वतः प्रशिक्षित" क्यों है?
चयन चरण (शीर्ष-के ब्लॉक) विवश है। विवश संचालन ग्रेडिएंट प्रवाह को तोड़ते हैं। पहले के दुर्लभ-ध्यान कार्य या तो चयन (सीमित प्रशिक्षण) के माध्यम से बैकप्रॉप को छोड़ दिया या निरंतर विश्राम का उपयोग किया गया जो निष्कर्ष पर वास्तविक विवशता नहीं देता था।
एनएसए इस पर ध्यान देता हैः संपीड़ित शाखा ध्यान पूरे अनुक्रम पर एक भेदभाव योग्य मोटा ध्यान है। शीर्ष-के ऑपरेशन केवल संपीड़ित शाखा से शीर्ष ध्यान स्कोर का उपयोग करता है जो बारीक-धान्य वाले ब्लॉक को लोड करने के लिए चुनने के लिए। संपीड़ित शाखा स्कोर (जो संपीड़ित आउटपुट और चयन तर्क दोनों को प्रभावित करते हैं) के माध्यम से ग्रेडिएंट्स बहते हैं, और अंतिम आउटपुट में चयनित ब्लॉकों का योगदान भी भिन्न होता है। गैर-विभेदक top_kऑपरेशन आगे की गणना ग्राफ पर एक नो-ऑप है यह केवल नियंत्रण करता है कि कौन से ब्लॉक स्मृति से लोड हो जाते हैं।
इसीलिए एनएसए का उपयोग पूर्व-प्रशिक्षण में अंत-अंत में किया जा सकता है। मॉडल तीन शाखाओं के माध्यम से जानकारी को संयुक्त रूप से मार्गदर्शित करना सीखता है, एक दुर्लभ पैटर्न का उत्पादन करता है जो निष्कर्ष पर वास्तव में वादा किए गए गति को वितरित करता है।
हार्डवेयर-अनुसूचित कर्नेल
एनएसए के कर्नेल को आधुनिक जीपीयू मेमोरी पदानुक्रम के लिए डिज़ाइन किया गया है। कर्नेल जीक्यूए समूहों (बाहरी लूप) द्वारा क्वेरी लोड करता है, प्रति समूह (आंतरिक लूप) के अनुरूप दुर्लभ केवी ब्लॉक लाता है, और एसआरएएम पर ध्यान केंद्रित करता है। क्योंकि प्रत्येक क्वेरी समूह एक ही चयनित ब्लॉक देखता है (वैकल्पिकता प्रति क्वेरी-ग्रुप है, प्रति क्वेरी-हेड नहीं), केवी भार पूरे समूह में कमी है। अंकगणितीय तीव्रता उच्च बनी रहती है।
पेपर में बताया गया है कि 64k डिकोड पर फ्लैशएटेंशन की तुलना में 9 गुना तेज ट्रिटन कर्नेल चल रहे हैं, क्रम की लंबाई के साथ गति अनुपात बढ़ रहा है। आगे और पीछे दोनों कर्नेल प्रदान किए जाते हैं।
कम्प्यूटिंग बजट
चलोNअनुक्रम की लंबाई हो, lसंपीड़न ब्लॉक का आकार, kशीर्ष-के चयन संख्या, wस्लाइडिंग विंडो, bचयनित ब्लॉक आकार (आमतौर पर बराबर l) ।
- संपीड़ित शाखा:
O(N/l)प्रति क्वेरी कुंजी, तोO(N * N / l)कुल। - चयनित शाखा:
O(k b)प्रति क्वेरी कुंजी, तोO(N k * b). . - स्लाइडिंग शाखा:
O(w)प्रति क्वेरी कुंजी, तोO(N * w). .
कुल: O(N (N/l + kb + w)). .
के साथN = 64k, l = 64, k = 16, b = 64, w = 512: प्रति क्वेरी लागत 1000 + 1024 + 512 = 2536 keys. . पूरा ध्यान है64000 keys. 25 गुना गणना में कमी.
के साथN = 128k, l = 64, k = 16, b = 64, w = 512: प्रति क्वेरी लागत 2000 + 1024 + 512 = 3536 keys. . पूरा ध्यान है128000 keysलाभ अनुक्रम की लंबाई के साथ बढ़ता है, जो कि पूरे बिंदु है।
यह तुलना कैसे करता है
| Method | Differentiable | Real inference speedup | Long-range recall |
|---|---|---|---|
| Sliding window only | yes | yes | fails |
| Strided / block-sparse | yes | yes | partial |
| KV pruning (H2O, StreamingLLM) | N/A (inference-time) | yes | partial |
| MoBA (Moonshot) | partial | yes | good |
| NSA | yes (natively) | yes (9x at 64k) | matches full attention |
MoBA (Moonshot, arXiv:2502.13189) एक साथ प्रकाशित किया गया था और एक से बेहतर तीन-से-एक दृष्टिकोण लेता है, ध्यान ब्लॉक के लिए MoE सिद्धांत को लागू करता है। एनएसए और MoBA 2026 के लिए लंबे संदर्भ पूर्व-प्रशिक्षण के लिए जानने के लिए दो वास्तुकला हैं।
इसे बनाओ
code/main.pyएक संक्षिप्त सिंथेटिक अनुक्रम पर तीन शाखाओं को लागू करता है और दिखाता हैः
- संपीड़न एमएलपी (शैक्षणिक स्पष्टता के लिए एक सरल औसत पूल बेसलाइन का उपयोग किया जाता है; वास्तविक एनएसए एक सीखे हुए एमएलपी का उपयोग करता है) ।
- संपीड़ित शाखा स्कोर द्वारा संचालित शीर्ष-के ब्लॉक चयन।
- स्लाइडिंग विंडो पर ध्यान दें
wटोकन. - बंद संयोजन.
- पूर्ण ध्यान की तुलना में एक गणना गणना प्रिंटआउट।
चरण 1: टोकन को ब्लॉक में संपीड़ित करें
pythondef compress(K, l):
n = len(K)
n_blocks = (n + l - 1) // l
out = []
for b in range(n_blocks):
start, end = b * l, min((b + 1) * l, n)
block = K[start:end]
summary = [sum(row[d] for row in block) / len(block) for d in range(len(K[0]))]
out.append(summary)
return outचरण 2: संपीड़ित शाखा ध्यान
संपीड़ित कुंजी के खिलाफ क्वेरी का softmax ध्यान चलाएं। संपीड़ित शाखा स्कोर शीर्ष-के चयन के लिए संकेत के रूप में दोगुना है।
चरण 3: शीर्ष-के ब्लॉक चयन
के सूचकांक चुनेंkसबसे अधिक स्कोर करने वाले संपीड़ित ब्लॉक. उन ब्लॉक से मूल असपीड़ित टोकन लोड करें और उन पर ध्यान दें.
चरण 4: स्लाइडिंग विंडो ध्यान
आखिरी ले लो wटोकन और उनके खिलाफ मानक ध्यान चलाएं।
चरण 5: गेट + संयोजन
क्वेरी पर एक छोटा MLP तीन गेट वजन उत्पन्न करता है। अंतिम आउटपुट तीन शाखा आउटपुट का एक भारित योग है।
चरण 6: गणना गणना
प्रत्येक शाखा के लिए प्रति क्वेरी में शामिल कुंजी की संख्या और कुल प्रिंट करें। तुलना करें N(पूरी ध्यान) एक 1024 टोकन के साथ सिंथेटिक परl = 32, k = 4, w = 128, एनएसए देखता है32 + 128 + 128 = 288प्रति क्वेरी के लिए कुंजी बनाम 1024 पूर्ण ध्यान के लिए 3.5 गुना कम।
इसका प्रयोग करें
एनएसए डीपसेक के अपने लंबे संदर्भ पूर्व-शिक्षण पाइपलाइन में शिपिंग कर रहा है। अप्रैल 2026 तक सार्वजनिक निष्कर्ष स्टैक में एकीकरण की स्थितिः
- DeepSeek internal: मूल, प्रकाशित वजन NSA या इसके उत्तराधिकारी DSA (Deepseek Sparse Attention) का उपयोग करते हैं।
- vLLM: डीपसेक-वी३.एक्स वजन के लिए प्रयोगात्मक एनएसए सहायता विकास में।
- SGLang: एनएसए बेंचमार्क प्रकाशित; उत्पादन पथ vLLM का अनुसरण करता है।
- llama.cpp / CPU: समर्थित नहीं; कर्नेल विघटन की ओवरहेड सीपीयू थ्रूपुट पर इसके लायक नहीं है।
एनएसए से संपर्क करने का समयः
- एक गंभीर गणना बजट के साथ 64k से अधिक संदर्भ को लक्षित पूर्व-शिक्षण या निरंतर प्रशिक्षण रन।
- डीपसेक के अपने लंबे संदर्भ के चेकपोस्ट का अनुमान लगाना। वजन एनएसए के मूल हैं।
कब नहीं करनाः
- आप निरंतर प्रशिक्षण के बिना एनएसए को अनुकूलित नहीं कर सकते।
- 16k से कम. तीन शाखाओं के ओवरहेड बचत पर हावी है.
- बैच-1 इंटरैक्टिव चैट. लटेंसी-संवेदनशील डिकोडिंग लाभ, लेकिन केवल लंबे संदर्भों में.
इसे भेजें
यह सबक हमें फल देता हैoutputs/skill-nsa-integrator.md. लंबे संदर्भ पूर्व प्रशिक्षण रन विनिर्देश को देखते हुए, यह एक एनएसए एकीकरण योजना उत्पन्न करता हैः संपीड़न ब्लॉक आकार, शीर्ष-के, स्लाइडिंग विंडो, गेट एमएलपी चौड़ाई, कर्नेल विकल्प, और विशिष्ट लंबे संदर्भ मूल्यांकन जो वास्तुकला परिवर्तन को सही ठहराएंगे।
व्यायाम
- दौड़ें
code/main.pyएक 1024 टोकन सिंथेटिक पर.(l, k, w)तीन पूर्वनिर्धारित और प्रिंट गणना गणनाओं के माध्यम से। उस पूर्वनिर्धारित को पहचानें जो सुई-इन-हेयस्टैक परीक्षण पर पूर्ण ध्यान के खिलाफ 95% याद रखने के साथ प्रति क्वेरी के लिए सबसे कम कुंजी संख्या प्राप्त करता है।
- औसत पूल कंप्रेसर को एक छोटे सीखे गए MLP (2-layer, hidden 32) से बदलें। इसे एक सिंथेटिक कार्य पर प्रशिक्षित करें जहां संकेत एक ब्लॉक का औसत है। बनाए गए डेटा पर औसत पूल बेसलाइन के साथ उलझन अंतर को मापें।
- गेट एमएलपी को लागू करें। यह क्वेरी को इनपुट के रूप में लेता है और तीन स्केलर आउटपुट करता है। दिखाएं कि गेट समझदारी से व्यवहार करता हैः यादृच्छिक क्वेरी पर लगभग समान वजन, जब क्वेरी एक दूर-बैक ब्लॉक को हिट करती है तो चयनित शाखा पर भारी वजन।
- एनएसए द्वारा सक्षम 70 बी मॉडल के लिए 128k संदर्भ पर केवी कैश मेमोरी बजट की गणना करें। केवी हेड 8 हैं, हेड 128, बीएफ 16। पूर्ण ध्यान और एमएलए की तुलना करें (चरण 10 · 14 में एमएलए के नंबर दिखाए गए हैं) । अनुक्रम की लंबाई की पहचान करें जहां एनएसए की बारीक-बीजा वाली शाखा केवी कैश पूर्ण ध्यान के बराबर है।
- एनएसए पेपर (arXiv:2502.11089) के सेक्शन 4 को पढ़ें और तीन वाक्य में समझाएं कि क्यों संपीड़ित शाखा के ध्यान स्कोर को अलग-अलग रूटिंग स्कोर की गणना के बजाय शीर्ष-के चयन के लिए पुनः उपयोग किया जाता है। उत्तर को ग्रेडिएंट प्रवाह से जोड़ें।
प्रमुख शर्तें
| Term | What people say | What it actually means |
|---|---|---|
| Compressed branch | "Coarse view" | Attention over block-averaged keys that provides global context in O(N/l) keys per query |
| Selected branch | "Top-k blocks" | Fine-grained attention over the k blocks with highest compressed-branch scores |
| Sliding window | "Local context" | Attention over the last W tokens for short-range patterns |
| Native trainability | "Pre-train with the sparsity on" | The sparsity pattern is learned during pre-training, not bolted on at inference |
| Compression block size l | "Group size for coarse view" | How many tokens get merged into one summary; 32-64 typical |
| Top-k | "Blocks to keep" | Number of compressed blocks whose uncompressed tokens get read; 16 typical |
| Sliding window W | "Local attention radius" | Typically 512; shorter hurts local coherence, longer wastes compute |
| Branch gate | "How to mix the three" | Per-position MLP output that weights the three branches' contributions |
| Hardware alignment | "Kernel-friendly sparsity" | Sparse pattern chosen so that the actual GPU kernel achieves the theoretical speedup |
| DSA | "NSA's successor" | Deepseek Sparse Attention, the architecture that followed NSA in DeepSeek's lineage |
आगे पढ़ना
- Yuan et al. — Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention (arXiv:2502.11089, ACL 2025 Best Paper) कागज
- DeepSeek-V3 Technical Report (arXiv:2412.19437) वास्तुकला परिवार NSA लक्ष्य
- Moonshot AI — MoBA: Mixture of Block Attention for Long-Context LLMs (arXiv:2502.13189) समवर्ती कार्य, ब्लॉक पर एमई शैली का ध्यान
- Beltagy et al. — Longformer: The Long-Document Transformer (arXiv:2004.05150) स्लाइडिंग विंडो मूल
- Xiao et al. — StreamingLLM: Efficient Streaming Language Models with Attention Sinks (arXiv:2309.17453) निष्कर्ष-समय की कमजोरी की आधार रेखा NSA में सुधार
- Dao et al. — FlashAttention-2 (arXiv:2307.08691) पूर्ण ध्यान के आधार लाइन एनएसए कर्नल 64k पर पीट
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.