<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Long-Context — Inferownia</title><link>https://inferownia.pl/tags/long-context/</link><description>Inferownia — polski hub wiedzy o lokalnym AI: uruchamianie modeli językowych na własnym sprzęcie, kwantyzacja, inferencja, małe modele, fine-tuning i RAG.</description><language>pl-PL</language><copyright>&#169; 2026 Inferownia</copyright><lastBuildDate>Tue, 07 Jul 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://inferownia.pl/tags/long-context/index.xml" rel="self" type="application/rss+xml"/><item><title>Mamba: co potrafią modele przestrzeni stanów</title><link>https://inferownia.pl/naukowy/mamba-ssm/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0200</pubDate><author>Albert Gu</author><author>Tri Dao</author><category>inferencja</category><guid>https://inferownia.pl/naukowy/mamba-ssm/</guid><description>Transformer płaci za każdy token kwadratem, a jego KV-cache puchnie z długością rozmowy jak balon. Mamba mówi: da się liniowo i przy stałym stanie. Rozkładamy na części, co potrafią selektywne modele przestrzeni stanów.</description><content:encoded><![CDATA[<p>Jest taki sposób czytania, który brzmi jak kara: przy każdym kolejnym słowie wracasz na
początek i przebiegasz wzrokiem wszystko, co już przeczytałeś. Zdanie dalej — znowu od zera.
Brzmi absurdalnie, a mniej więcej tak właśnie zwykły transformer obchodzi się z długim
tekstem. Im dłuższy kontekst wrzucasz, tym więcej pamięci schodzi, i to nie po
równo, tylko coraz szybciej. Wśród ludzi, co odpalają to w domu, wraca to jak natrętny wątek: „mam 24 GB, czemu przy
32k kontekstu i tak leci OOM?&quot;. Odpowiedź brzmi zawsze tak samo — bo attention, ta sama
uwaga, która zrobiła z transformerów króla, ma pewien brzydki nawyk. Za każdy token płaci
kwadratem.</p>
<p>I przez lata żyliśmy z tym jak z hałaśliwym sąsiadem: da się, tylko trzeba akceptować.
Aż w grudniu 2023 Albert Gu i Tri Dao wrzucili na arXiv pracę o wdzięcznej nazwie
<em>Mamba</em>, w której powiedzieli coś w stylu „a gdyby tak w ogóle wyrzucić attention?&quot;.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>
Nie ograniczyć, nie zoptymalizować — wyrzucić. Cały mechanizm uwagi, a przy okazji i bloki
MLP, i zastąpić je czymś, co skaluje się liniowo, a przy generowaniu trzyma stan o stałym
rozmiarze. Brzmi jak sprzedażowa bajka. A jednak papier ma liczby.</p>
<h2 id="skąd-w-ogóle-ten-kwadrat-w-attention">Skąd w ogóle ten kwadrat w attention</h2>
<p>Zanim zachwycimy się Mambą, warto wiedzieć, od czego ona ucieka. Uwaga w transformerze
działa tak, że każdy token patrzy na każdy inny token w sekwencji. Masz 1000 tokenów?
To milion par do policzenia. Masz 10 000? Sto milionów. Rośnie z kwadratem długości —
stąd to słynne O(n²), które przy długim kontekście robi się głównym żłobem na pamięć i czas.</p>
<p>Do tego dochodzi druga rzecz, boleśnie znajoma każdemu, kto odpala model lokalnie:
KV-cache. Żeby przy generowaniu nie liczyć uwagi od zera dla każdego nowego tokenu,
transformer trzyma w pamięci klucze i wartości wszystkich dotychczasowych tokenów. I ten
bufor rośnie <strong>liniowo z długością rozmowy</strong> — im dłużej gadasz, tym więcej VRAM-u zjada
sam cache, niezależnie od wag modelu. Rozgryzaliśmy ten mechanizm bliżej
<a href="/poradniki/kv-cache-vram/">tutaj</a>, ale sedno jest proste: transformer ma pamięć, która
puchnie. Zawsze puchnie.</p>
<p>Mamba wychodzi z zupełnie innej rodziny — z <strong>modeli przestrzeni stanów</strong> (SSM, <em>state
space models</em>).<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> To pomysł stary jak teoria sterowania: zamiast patrzeć na wszystko
naraz, przesuwasz się przez sekwencję krok po kroku i utrzymujesz jeden <strong>stan</strong> — wektor
o stałym rozmiarze, który streszcza wszystko, co do tej pory widziałeś. Nowy token wpada,
aktualizuje stan, idziesz dalej. Trochę jak RNN, tylko policzony sprytniej.</p>
<h2 id="dlaczego-wcześniejsze-ssm-nie-zabiły-transformera">Dlaczego wcześniejsze SSM nie zabiły transformera</h2>
<p>Bo miały jedną wadę, przez którą były głupsze niż attention. Klasyczny SSM — jak S4,
poprzednik Mamby od tych samych autorów — ma stałe parametry. Te same macierze przetwarzają
każdy token identycznie, bez względu na to, co ten token właściwie mówi. To pozwala policzyć
całość jako jeden wielki splot (konwolucję), błyskawicznie i równolegle — ale odbiera
modelowi zdolność, którą attention ma za darmo: <strong>rozumowanie oparte na treści</strong>.</p>
<p>Wyobraź sobie zdanie, w którym ważne jest jedno słowo gdzieś na początku, a reszta to
wypełniacz. Attention po prostu skupi się na tym jednym słowie. Stary SSM nie umie — traktuje
wypełniacz tak samo poważnie jak sedno, bo nie potrafi wybrać. Nie umie powiedzieć „to
zapamiętaj, a tamto olej&quot;.</p>
<h2 id="na-czym-polega-selekcja-cały-myk-mamby">Na czym polega „selekcja&quot;, cały myk Mamby</h2>
<p>I tu wchodzi jedna zmiana, która robi całą różnicę — <strong>selekcja</strong>. Gu i Dao uzależnili
parametry SSM od wejścia. Krok dyskretyzacji Δ oraz macierze B i C przestają być stałe
i stają się <strong>funkcjami aktualnego tokenu</strong>.<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Innymi słowy: model przy każdym kroku
sam decyduje, ile z nowej informacji wpuścić do stanu, a ile ze starego stanu zapomnieć —
w zależności od tego, co właśnie czyta.</p>
<p>To jest ten moment „aha&quot;. Selektywny SSM potrafi zrobić to, czego stary nie umiał:
przepuścić ważny token dalej wzdłuż sekwencji, a nieważny wygasić. Dostaje content-based
reasoning, którym attention się chwalił — tylko bez płacenia kwadratem.</p>
<div class="callout">
  <span class="callout__label">Dlaczego to ważne dla lokalnego LLM</span>
<p>Dla ciebie, odpalającego model pod biurkiem, sedno jest takie: Mamba przy generowaniu
utrzymuje stan rekurencyjny o <strong>stałym rozmiarze</strong>. Nie ma analogu KV-cache, który rośnie
z długością rozmowy. Piąta godzina konwersacji zjada tyle samo pamięci co pierwsza minuta.
Uwaga tylko — to nie znaczy „brak stanu&quot;. Stan wciąż jest, ukryty wektor sobie siedzi
i pracuje; on po prostu nie puchnie z kontekstem. To różnica między plecakiem o stałej
pojemności a workiem, do którego dorzucasz kamień za każdym tokenem.</p>
</div>
<h2 id="cena-selekcji-znika-droga-na-skróty">Cena selekcji: znika droga na skróty</h2>
<p>Tyle że za wszystko się płaci. Uzależnienie parametrów od wejścia ma paskudny efekt
uboczny: <strong>zabija formę splotową</strong>. Skoro macierze zmieniają się z każdym tokenem, nie
policzysz już całości jednym szybkim splotem, jak w S4. Musisz wrócić do trybu
rekurencyjnego — krok po kroku — a to na GPU brzmi jak przepis na wolny, sekwencyjny
dramat.</p>
<p>Autorzy rozwiązali to algorytmem, który nazwali <strong>selective scan</strong>, i zaprojektowali go
„świadomie sprzętowo&quot; (<em>hardware-aware</em>), czerpiąc wprost z pomysłów, które znasz z
<a href="/naukowy/flashattention/">FlashAttention</a>.<sup id="fnref3:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Cały trik siedzi w tym, gdzie na GPU
lądują dane. Karta graficzna ma pamięć szybką i małą (SRAM) oraz wolną i dużą (HBM) —
a wąskim gardłem prawie zawsze jest przepychanie danych między nimi, nie samo liczenie.</p>
<p>Selective scan robi trzy rzeczy, żeby to obejść:<sup id="fnref4:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<ul>
<li><strong>Nie materializuje</strong> rozdmuchanego stanu w wolnej pamięci HBM — dyskretyzację i rekurencję
liczy w szybkim SRAM.</li>
<li><strong>Zlepia operacje w jeden kernel</strong> (kernel fusion), zamiast latać z wynikami tam i z powrotem.</li>
<li>Przy propagacji wstecznej <strong>przelicza stany od nowa</strong>, zamiast trzymać je w pamięci
(recomputation) — bo na nowoczesnym GPU policzyć jest taniej niż odczytać.</li>
</ul>
<p>Efekt? Model, który w teorii jest rekurencyjny i „powinien&quot; być wolny, w praktyce śmiga.
To ta sama filozofia, co przy flash attention: nie zmieniaj matematyki, zmień to, jak dane
wędrują przez poziomy pamięci karty.</p>
<h2 id="co-z-tego-wychodzi-w-liczbach">Co z tego wychodzi w liczbach</h2>
<p>Papier nie owija w bawełnę. Kilka twardych wyników:<sup id="fnref5:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<table>
	<thead>
			<tr>
					<th>Cecha</th>
					<th>Transformer</th>
					<th>Mamba</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Skalowanie z długością sekwencji</td>
					<td>O(n²)</td>
					<td>O(n) — liniowe</td>
			</tr>
			<tr>
					<td>Stan przy generowaniu</td>
					<td>KV-cache rośnie z kontekstem</td>
					<td>stały rozmiar</td>
			</tr>
			<tr>
					<td>Przepustowość generowania</td>
					<td>punkt odniesienia</td>
					<td><strong>5× wyższa</strong></td>
			</tr>
			<tr>
					<td>Jakość (language modeling)</td>
					<td>model 2× większy dorównuje</td>
					<td>Mamba-3B dorównuje</td>
			</tr>
	</tbody>
</table>
<p>To „5× higher throughput&quot; to nie chochlik — Mamba generuje tokeny pięć razy szybciej niż
transformer podobnej klasy, właśnie dzięki temu, że nie musi za każdym krokiem przemielać
rosnącego cache&rsquo;u.<sup id="fnref6:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> A jakościowo Mamba-3B dorównuje transformerom <strong>dwukrotnie
większym</strong> i bije te swojej wielkości — zarówno w pretreningu, jak i w ewaluacji downstream.</p>
<p>I jedna rzecz, która dla długiego kontekstu jest najsmaczniejsza: wydajność na realnych
danych <strong>poprawia się aż do sekwencji rzędu milionów tokenów</strong>.<sup id="fnref7:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Nie „nie psuje się&quot; —
poprawia. Tam, gdzie transformer się dusi, Mamba dopiero się rozkręca. Do tego papier
pokazuje wyniki state-of-the-art nie tylko dla języka, ale i dla audio oraz genomiki —
jako ogólny backbone sekwencyjny, nie wąska sztuczka do jednej modalności.</p>
<h2 id="zrób-to-sam-a-przynajmniej-dotknij">Zrób to sam (a przynajmniej dotknij)</h2>
<p>To nie jest zamknięty papier z ładnym wykresem. Kod i checkpointy leżą w oficjalnym repo
<code>state-spaces/mamba</code> — z gotowymi modelami od 130M do 2.8B parametrów, trenowanymi między
innymi na 300 miliardach tokenów (wariant SlimPajama na 600 mld).<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Model z abstraktu
opisywany jako „Mamba-3B&quot; to na Hugging Face ten sam checkpoint co <code>mamba-2.8b</code> — nazewnictwo
się rozjeżdża, liczba parametrów ta sama.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Jak chcesz zajrzeć pod maskę bloku Mamba, warto znać trzy pokrętła z implementacji:<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># kluczowe hiperparametry modułu Mamba (Mamba-1)</span>
</span></span><span class="line"><span class="cl"><span class="nv">d_state</span> <span class="o">=</span> <span class="m">16</span>   <span class="c1"># rozmiar stanu SSM — ile &#34;pamięci&#34; trzyma ukryty wektor</span>
</span></span><span class="line"><span class="cl"><span class="nv">d_conv</span>  <span class="o">=</span> <span class="m">4</span>    <span class="c1"># szerokość lokalnej konwolucji przed SSM</span>
</span></span><span class="line"><span class="cl"><span class="nv">expand</span>  <span class="o">=</span> <span class="m">2</span>    <span class="c1"># o ile blok rozszerza wymiar wewnętrzny</span>
</span></span></code></pre></div><p><code>d_state</code> to wielkość tego stałego stanu, o którym cała gadka — domyślnie 16 dla Mamby-1.
<code>d_conv</code> to szerokość krótkiej lokalnej konwolucji (Mamba wciąż lubi lokalny kontekst
tuż-tuż), a <code>expand</code> mówi, o ile blok pompuje wymiar wewnętrzny. Trzy liczby, a definiują
charakter całej architektury.</p>
<p>Jedno zastrzeżenie na koniec, żeby nie wpaść w hype: Mamba <strong>nie</strong> wysyła transformerów na
emeryturę. Papier pokazuje przewagę na modelowaniu języka, audio i genomice — nie ogłasza,
że uwaga jest bezużyteczna wszędzie. Późniejsze prace tych samych autorów (Mamba-2 i tak
zwane <em>structured state space duality</em>) pokazują wręcz, że SSM i attention są matematycznie
spokrewnione bliżej, niż się na pierwszy rzut oka wydaje — to nie dwa wrogie plemiona,
raczej dwie gałęzie tego samego drzewa.</p>
<p>I może właśnie o to chodzi. Przez kilka lat myśleliśmy, że długi kontekst to podatek, który
płaci się kwadratem i pęczniejącym cache&rsquo;em — po prostu prawo natury lokalnego LLM-owania.
Mamba przyszła i pokazała, że to była tylko jedna droga przez las, nie jedyna. Ten sam
worek, do którego dorzucałeś kamień za każdym tokenem, nagle okazał się plecakiem o stałej
wadze — i można iść dalej, aż po horyzont milionów tokenów, bez zaciskania zębów przy
liczniku VRAM-u.</p>
<h2 id="przypisy--źródła">Przypisy · źródła</h2>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Albert Gu, Tri Dao, <em>Mamba: Linear-Time Sequence Modeling with Selective State Spaces</em>, arXiv:2312.00752 (v1: 1 grudnia 2023, v2: 31 maja 2024) — <a href="https://arxiv.org/abs/2312.00752">arxiv.org/abs/2312.00752</a>. Abstrakt i sekcja 3 (hardware-aware selective scan): brak attention/MLP, selekcja parametrów Δ/B/C jako funkcji wejścia, liniowe skalowanie, 5× throughput, poprawa do sekwencji milionowej długości, wyniki Mamba-3B oraz modalności język/audio/genomika. Pełny tekst: <a href="https://arxiv.org/pdf/2312.00752">arxiv.org/pdf/2312.00752</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref2:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref3:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref4:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref5:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref6:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref7:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Oficjalna implementacja i checkpointy, GitHub — <a href="https://github.com/state-spaces/mamba">github.com/state-spaces/mamba</a>. Kernel <code>selective_scan_cuda</code>, hiperparametry modułu (<code>d_state</code>, <code>d_conv</code>, <code>expand</code>), pretrenowane modele 130M–2.8B (Mamba/Mamba-2), dane treningowe 300B/600B tokenów, odniesienie do Mamba-2 i structured state space duality.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Karta modelu <code>state-spaces/mamba-2.8b</code>, Hugging Face — <a href="https://huggingface.co/state-spaces/mamba-2.8b">huggingface.co/state-spaces/mamba-2.8b</a>. Potwierdzenie checkpointu ~2.8B (3B) parametrów, zgodnego z modelem „Mamba-3B&quot; z abstraktu.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>