- mamba-minimal एक प्रोजेक्ट है जो Mamba को PyTorch की एक ही फ़ाइल में सरल और न्यूनतम रूप में इम्प्लीमेंट करता है
- इसका लक्ष्य आधिकारिक इम्प्लीमेंटेशन के साथ forward/backward pass में समान numerical output देना है
- कोड को सरल बनाया गया है और पढ़ने में आसान रखने के लिए comments सहित तैयार किया गया है
- इसमें आधिकारिक इम्प्लीमेंटेशन की मुख्य optimizations शामिल नहीं हैं, इसलिए यह speed प्रदान नहीं करता, और न ही इसमें उचित parameter initialization शामिल है
- डेमो
state-spaces/mamba-370mऔरEleutherAI/gpt-neox-20btokenizer का उपयोग करके prompt completion का उदाहरण चलाता है
प्रोजेक्ट का अवलोकन
- mamba-minimal Mamba का PyTorch की एक फ़ाइल में बना एक सरल न्यूनतम इम्प्लीमेंटेशन है
- लक्ष्य है कि आधिकारिक इम्प्लीमेंटेशन जैसा व्यवहार अधिक पढ़ने योग्य कोड में दिखाया जाए
- मुख्य विशेषताएँ:
- आधिकारिक इम्प्लीमेंटेशन के forward pass और backward pass में समकक्ष numerical output
- सरल किया गया कोड
- पढ़ने में आसान और comments वाला इम्प्लीमेंटेशन
इसमें शामिल नहीं है
- speed इसका लक्ष्य नहीं है
- आधिकारिक इम्प्लीमेंटेशन काफ़ी अधिक optimized है
- यह optimization Mamba पेपर के मुख्य योगदानों में शामिल है
- यह इम्प्लीमेंटेशन readability के लिए अधिकांश भागों को सरल रखता है
- उचित parameter initialization शामिल नहीं है
- इसे ऐसी चीज़ के रूप में बताया गया है जिसे readability से समझौता किए बिना जोड़ा जा सकता है
डेमो उपयोग उदाहरण
demo.ipynbमें prompt completion का उदाहरण देखा जा सकता है- उदाहरण
model.Mambaऔर Hugging FacetransformersकेAutoTokenizerका उपयोग करता है - उपयोग किए गए model और tokenizer:
state-spaces/mamba-370mEleutherAI/gpt-neox-20b
- उदाहरण prompt
Mamba is theहै, और generated output में Mamba को एक venomous snake के रूप में वर्णित करने वाला वाक्य शामिल है
संदर्भ सामग्री
- Mamba architecture का परिचय Mamba: Linear-Time Sequence Modeling with Selective State Spaces में दिया गया है
- पेपर के लेखक Albert Gu और Tri Dao हैं
- आधिकारिक इम्प्लीमेंटेशन
state-spaces/mambarepository में है
1 टिप्पणियां
Hacker News की राय
पहले मैंने एक सहकर्मी के साथ मिलकर एक library बनाई थी, जिसमें shared model code का ज़्यादातर हिस्सा अलग कर दिया गया था; इसका इस्तेमाल करने पर कई models को Python import और comments को छोड़कर लगभग 100 lines में implement किया जा सकता है
BERT: https://github.com/explosion/curated-transformers/blob/main/...
Llama 1/2: https://github.com/explosion/curated-transformers/blob/main/...
MPT: https://github.com/explosion/curated-transformers/blob/main/...
TorchScript JIT, PyTorch flash attention जैसी सुविधाएँ भी support करती है
xformers भी मिलती-जुलती समस्या को address करता है, लेकिन Triton का इस्तेमाल करके high-performance Transformer modules देने पर उसका focus ज़्यादा है। हालांकि library के सिर्फ कुछ specific components निकालकर इस्तेमाल करना आसान नहीं था, और runtime errors लगातार आ रहे थे, इसलिए फिलहाल उसे टाल दिया। मैं BERT architecture पर आधारित कुछ बना रहा हूँ, इसलिए इसे reference के तौर पर देखूँगा
अगले project में इसे आज़माने का सोच रहा हूँ
मूल Mamba code में speed optimization और अन्य चीज़ें बहुत हैं, इसलिए उसे सीधे समझना मुश्किल है; यह implementation सीखने में मददगार लगती है
जब token-by-token inference करते हैं, तो सब कुछ काफ़ी सरल हो जाता है। मेरी अपनी बनाई Mamba inference implementation भी है: https://github.com/rbitr/llm.f90/tree/master/ssm
मुझे पता है कि यह लंबे समय से verified scientific computing code का आधार रहा है और अक्सर PyTorch या Numpy जैसी libraries से wrap करके इस्तेमाल किया जाता है, लेकिन आजकल यह popular language नहीं है। इसे चुनने की वजह जानना चाहूँगा
Mamba के बारे में कुछ बातें ऐसी हैं जिन्हें मैं चाहता/चाहती हूँ कि कोई non-ML researcher भी समझ सके इस तरह समझाए
Mamba की core insight state-space models की एक पुरानी समस्या हल करने में है। state-space models input context को compress करने में अच्छे होते हैं, लेकिन input को hidden state में compress करने की प्रक्रिया में वह जानकारी मिट जाती है जो Transformer की तरह context को प्रभावी ढंग से इस्तेमाल करने के लिए ज़रूरी होती है
समाधान यह है कि paper जिसे selection mechanism कहता है, उसे बनाया जाए। यह mechanism input-dependent है, इसलिए input बदलने पर model हर step के output को adjust कर सकता है। इसके लिए कुछ state-space variables को input-invariant के बजाय input-dependent बनाया जाता है, और हर time step के input को state-space variables में project करने के लिए linear layers आदि जोड़ी जाती हैं
लेकिन state-space variables को input-dependent बनाने से computational overhead आता है। इसे आधुनिक GPU memory structure का अधिकतम उपयोग करने वाले hardware-aware algorithm से हल किया गया, ताकि HBM के अंदर-बाहर data move करने से जितना हो सके बचा जा सके
Tri Dao वही व्यक्ति हैं जिन्होंने Flash Attention बनाया था, और वह भी Transformer में hardware को ज़्यादा efficiently इस्तेमाल करने का तरीका था। यह सचमुच उनकी विशेषज्ञता का क्षेत्र है
NeurIPS 2023 से ठीक पहले आए Mamba और Based में multi-query associative recall (MQAR) और multi-head Attention से प्रेरित gating/selection की data-dependency शामिल थी। ये दोनों वे key elements थे जो Hyena और पहले के state-space architectures में नहीं थे, और नए models associative recall tasks में Attention जितने अच्छे हो गए हैं; lookup के अलावा दूसरे tasks में शायद Attention से थोड़ा बेहतर होने की संभावना भी दिखती है
बेशक Mamba की बड़ी detail उसका efficient CUDA implementation है। उसके बिना, जहाँ Transformer पहले से fit बैठता है उन tasks में इस architecture का महत्व कम हो सकता है
context length की बहुत चिंता न भी करें, तब भी कई नए areas खुलते हैं। DNA sequence analysis लंबी dependencies वाला linear task है, और images, videos, high-dimensional information को token streams के रूप में देखने का तरीका भी सोचा जा सकता है। यह पुराने CRT monitors की तरह pixels को scan करने जैसा है
AI के शुरुआती सपनों में से एक यह था कि environment के साथ लगातार interact करने वाले agent की single learning trajectory लगातार evolve होती रहे, और ऐसे infinite context length models शायद उस सपने को आसान बना सकते हैं
हालांकि अभी के लिए, ऐसे models के महत्वपूर्ण real-world tasks पर downstream applications, Attention-based mature applications की तुलना में आम तौर पर कम validated और tuned हैं। पुराने recurrent neural networks से analogy कुछ हद तक मदद करती है, लेकिन पिछले 5 वर्षों में लोग Attention और Transformer के लिए बहुत ज़्यादा specialized हो गए हैं, इसलिए Transformer की inertia बहुत बड़ी है
original paper बताता है कि parameters transform होने के बाद model को linear recurrence या global convolution, दोनों तरीकों से compute किया जा सकता है। सामान्य तौर पर training में, जहाँ पूरी input sequence पहले से देखी जा सकती है, parallelize करना आसान होने के कारण convolution mode इस्तेमाल होता है; और autoregressive inference में, जहाँ input एक time step करके देखा जाता है, efficient recurrent mode में switch किया जाता है
इसलिए training RetNet के parallel forward-pass mode की तरह parallelizable है। basic inference लंबे से लंबा context पाने के लिए recurrent mode में किया जाता है, और chunking न होने के कारण inference के दौरान RAM और VRAM कितना खाएगा, यह आंकना मुश्किल है
यह paper समझाते हुए भी big picture में वह कहाँ fit होता है, इस पर काफ़ी context देता है। इसकी progression सुनना काफ़ी दिलचस्प है
https://youtu.be/ouF-H35atOY?si=y2Ckp9MCFd7ulLL3
quadratic Attention के बजाय, जहाँ calculate किया जाता है कि हर token बाकी सभी tokens पर कितना ध्यान देता है, किसी तरह input जितनी लंबाई का long convolution kernel calculate किया जाता है और फिर conv1d apply किया जाता है
मेरी सीमित समझ के हिसाब से इसका FFT apply करने, matrix multiplication करने, और फिर IFFT से वापस लौटने से थोड़ा संबंध है। पता है कि यह काम करता है, लेकिन धीमा है। FFT compute करने के कई तरीके हैं, और उनमें से एक butterfly matrix है। शायद यह सिर्फ़ approximation है, लेकिन काफी अच्छा है और current hardware पर बहुत fast और efficient लगता है
quadratic complexity सुनने में खराब लगती है, लेकिन असल में hardware constraints के कारण sub-quadratic algorithms कई बार ज़्यादा slow होते हैं। इसलिए state-space models से बड़ी उम्मीदें होने के बावजूद यह कहना आसान नहीं है कि Llama खत्म हो गया। Mamba scale बढ़ाने पर भी अच्छा चलेगा या नहीं, यह भी अभी नहीं पता, और यह जानने के लिए सचमुच training पर millions of dollars खर्च करने होंगे। फिर भी मैं optimistic हूँ
sub-quadratic family का एक और दिलचस्प model RWKV है। देखने लायक है, लेकिन शायद podcast में इसे पहले ही cover किया गया होगा
मैंने self-study की है और paper भी पहले बस roughly skim किया था, इसलिए बहुत कुछ गलत हो सकता है। साथ ही Attention में आम तौर पर KV cache होता है जो performance में बहुत मदद करता है, लेकिन मुझे लगता है Mamba में वह नहीं किया जा सकता
“Mamba दुनिया का सबसे लंबा विषैला सांप है, जिसकी अनुमानित लंबाई 150m से ज़्यादा है” वाले वाक्य पर हंसी आ गई
फिर भी यह वाकई शानदार था, और arXiv पेपर का संदर्भ देने से मेरे जैसे लोग, जो पेपर को सीधे समझने के बजाय ऐसे लेख पढ़ते हैं, अंदर की चीज़ों की थोड़ी झलक पा सके—यह अच्छा लगा
अगर बाद में उस वाक्य पर सुधार जारी करना पड़े, तो मज़ेदार होगा
मैंने सोचा था कि एल्गोरिदम का मूल parallel prefix scan होगा। मुझे लगता है Mamba की बात ही वही है
for i in range(l):x = deltaA[:, :, i] * x + deltaB_u[:, :, i]y = einsum(x, C[:, i, :], 'b d_in n , b n -> b d_in')ys.append(y)यह मूर्खतापूर्ण सवाल हो सकता है, लेकिन Hugging Face पर मौजूद Mamba model को train करना कितना कठिन है, यह जानना चाहता हूं
सबसे बड़ा model 2.8B का दिखता है; The Pile जैसे dataset पर train करने के लिए कितने GPU चाहिए होंगे और कितना समय लगेगा?
inference भी RAM की आधी खपत के साथ 3~5 गुना तेज़ होने की उम्मीद है
आधिकारिक CUDA version को समझने की कोशिश की थी, लेकिन पहली कोशिश नाकाम होने के बाद आखिरकार छोड़ दिया; यह implementation कहीं बेहतर लगती है
एक और single-file PyTorch implementation, सच में शानदार। उम्मीद है कि पहले के hlb-CIFAR10 और संबंधित projects, और minGPT या DawnBench जैसे पूर्व प्रभावों ने simple single-file format को थोड़ा भी आगे बढ़ाने में मदद की होगी
ऐसा काम efficient machine learning research के लिए महत्वपूर्ण है, और इस क्षेत्र के लिए अभी किए जा सकने वाले सबसे महत्वपूर्ण कामों में से एक हो सकता है
research innovation की गति से आगे बढ़ती है, और innovation प्रयोगों के execution time के inverse के अनुपात में तेज़ होती है; यह research या simple hacking उद्देश्यों के लिए code की Kolmogorov complexity से स्पष्ट रूप से जुड़ा है
ऐसे tools research के लिए कितने महत्वपूर्ण हैं, और व्यक्तिगत रूप से उन्होंने knowledge discovery process को कितना तेज़ किया है, इसे जितना भी कहें कम है। किसी idea को कुछ मिनटों में जल्दी sketch करना और तुरंत high signal-to-noise ratio वाले results पाना research progress के लिए अनिवार्य तत्व बन गया है
knowledge distillation और MDL(https://en.wikipedia.org/wiki/Minimum_description_length) मेरे हिसाब से अनावश्यक सजावट, clutter, और अत्यधिक घने “पीछे न छूटने” वाले कम-मूल्य topic competition को उलटने के लिए बहुत महत्वपूर्ण हैं, जिन्हें मौजूदा paper submission-review process बढ़ावा देता दिखता है
हाल में, इस समस्या से बचने और थोड़ा बेहतर scaling solution की ओर जाने के लिए, मैंने code को 1-file self-contained छोटी gist वाले “code sketch” के रूप में release करना शुरू किया है। इससे development time घटता है, और concepts को समेटे rough, unpolished working code सीधे लोगों तक पहुंच सकता है। अब तक यह काफ़ी अच्छा काम करता दिख रहा है और मैं इसे जारी रखना चाहता हूं
ऐसा code और ज़्यादा देखना चाहता हूं। अगर बड़े scale पर data सीखने वाले researchers हैं, तो उन्हें information फैलाने के तरीके में भी data-efficient होना चाहिए
शायद मानवता ने इतनी complexity वाली किसी चीज़ को इतनी तेज़ी से पहले कभी विकसित नहीं किया
मिलती-जुलती रफ़्तार जहां दिखती है, वह शायद SpaceX है, जिसने इस साल भी दो cutting-edge rockets launch किए। 2024 में क्या निकलेगा, यह देखना दिलचस्प होगा
x_projमें bias नहीं है, इसलिए लगता है कि x_proj और dt_proj weights को combine किया जा सकता हैअगर weight adjustment की requirement हो तो runtime पर शायद इसे सरलता से किया जा सकता है, और single kernel और bias अंततः तेज़ होंगे। पक्का नहीं
सोच रहा हूं कि original paper पर discussion हुआ था या नहीं। लगता है मुझसे छूट गया, लेकिन यह काफ़ी दिलचस्प है
“efficient implementation की कमी के कारण memory shortage या अव्यावहारिक compute requirement पैदा हुई, इसलिए SSM के रूप में भी व्याख्यायित किए जा सकने वाले पहले के मजबूत recurrent models RWKV और RetNet baselines के context length 8k के पूरे results गायब हैं” वाला हिस्सा मुझे ठीक से समझ नहीं आया
RetNet ज़्यादा memory नहीं खाता, और chunk-wise forward implementation इस्तेमाल करने पर VRAM usage chunk size तक सीमित रहता है। context length test करने में यही बात मुख्य है
सोच रहा हूं कि क्या किसी ने original Mamba model test किया है। parallel forward mode वाले RetNet की तुलना में training speed कैसी होगी?
https://openreview.net/forum?id=AL1fq05o7H
जटिल चीज़ को सिर्फ़ core बचाकर साफ़ करने वाला implementation हमेशा अच्छा लगता है