<?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>Aktualności — Inferownia</title><link>https://inferownia.pl/aktualnosci/</link><description>Krótkie notki o tym, co nowego w ekosystemie lokalnego AI: narzędzia, modele, wydania.</description><language>pl-PL</language><copyright>&#169; 2026 Inferownia</copyright><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://inferownia.pl/aktualnosci/index.xml" rel="self" type="application/rss+xml"/><item><title>Backendy llama.cpp: świat poza CUDA</title><link>https://inferownia.pl/aktualnosci/backendy-llama-cpp/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0200</pubDate><category>inferencja</category><guid>https://inferownia.pl/aktualnosci/backendy-llama-cpp/</guid><description>Nie masz zielonej karty i już myślisz, że lokalne LLM-y nie są dla ciebie? llama.cpp liczy na CPU, Metalu, Vulkanie i całej reszcie sprzętu — CUDA to tylko jedna z opcji, nie bilet wstępu.</description><content:encoded><![CDATA[<p>Wchodzisz na r/LocalLLaMA, ktoś pyta „jaką kartę wziąć pod modele&quot;, i pod postem od razu
ta sama litania: 3090, 3090, może 4090 jak budżet pozwala, koniecznie NVIDIA, koniecznie
CUDA. Człowiek z Radeonem w obudowie albo z MacBookiem na biurku czyta to i po cichu
zakłada, że wsiadł nie do tego pociągu — że lokalne LLM-y to zabawa wyłącznie dla posiadaczy
zielonych kart, a on ma co najwyżej oglądać z peronu.</p>
<p>I to jest jedno z tych przekonań, które żyje własnym życiem, choć z prawdą ma niewiele
wspólnego. Bo <code>llama.cpp</code> — silnik, na którym stoi pół tego lokalnego światka — od samego
początku był pisany pod jedną obietnicę: odpalać modele „na szerokim zakresie sprzętu&quot;,
lokalnie i w chmurze, w czystym C/C++ bez ciężkich zależności.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> CUDA jest w tym
zestawie, jasne. Ale jest jedną z kilkunastu opcji, nie warunkiem wejścia.</p>
<h2 id="co-to-w-ogóle-jest-backend">Co to w ogóle jest „backend&quot;</h2>
<p>Zajrzyj pod maskę <code>llama.cpp</code>, a znajdziesz <code>ggml</code> — bibliotekę, która robi całą matematykę
modelu. I tu wchodzi słowo klucz: <strong>backend</strong>. To po prostu moduł <code>ggml</code>, który wie, jak
wykonać te wszystkie mnożenia macierzy na konkretnym rodzaju sprzętu. Jeden backend gada
z układem NVIDIA. Inny z GPU Apple. Jeszcze inny z byle czym, co ma sterownik Vulkana.</p>
<p>Domyślnym, zawsze dostępnym backendem jest <strong>CPU</strong>. Zwykły procesor, ten sam, na którym
odpalasz przeglądarkę. Zbudujesz <code>llama.cpp</code> bez ani jednej flagi akceleracji i model
i tak ruszy — wolniej niż na GPU, ale ruszy.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> To jest ta część, o której cała ta litania
zapomina wspomnieć: żeby cokolwiek pogadało lokalnie, karta graficzna nie jest
ci technicznie potrzebna. Jest ci potrzebna, żeby było <em>szybko</em>. A to już zupełnie inna rozmowa.</p>
<h2 id="ilu-tych-backendów-w-ogóle-jest">Ilu tych backendów w ogóle jest?</h2>
<p>Więcej, niż podejrzewasz. Oficjalna tabela w README ciągnie się przez kilkanaście pozycji:
Metal, BLAS, SYCL, CUDA, HIP, Vulkan, MUSA, CANN, OpenCL, ZenDNN, WebGPU, IBM zDNN,
Hexagon i jeszcze parę egzotów.<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Większości z nich w życiu nie dotkniesz — Ascend
NPU czy IBM Z &amp; LinuxONE to sprzęt, którego nie trzymasz pod biurkiem. Ale te, które
realnie decydują o tym, czy twój sprzęt załapie się na zabawę, dają się policzyć na palcach:</p>
<table>
	<thead>
			<tr>
					<th>Backend</th>
					<th>Sprzęt</th>
					<th>Flaga przy budowaniu</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>CPU</strong></td>
					<td>dowolny procesor</td>
					<td>żadna (domyślny)</td>
			</tr>
			<tr>
					<td><strong>CUDA</strong></td>
					<td>GPU NVIDIA</td>
					<td><code>-DGGML_CUDA=ON</code></td>
			</tr>
			<tr>
					<td><strong>Metal</strong></td>
					<td>Apple Silicon (M1–M4)</td>
					<td>domyślnie ON na macOS</td>
			</tr>
			<tr>
					<td><strong>Vulkan</strong></td>
					<td>GPU wielu producentów (AMD, Intel, NVIDIA)</td>
					<td><code>-DGGML_VULKAN=ON</code></td>
			</tr>
			<tr>
					<td><strong>HIP / ROCm</strong></td>
					<td>GPU AMD</td>
					<td><code>-DGGML_HIP=ON -DGPU_TARGETS=…</code></td>
			</tr>
			<tr>
					<td><strong>SYCL</strong></td>
					<td>GPU Intel</td>
					<td>osobna instrukcja</td>
			</tr>
			<tr>
					<td><strong>BLAS</strong></td>
					<td>CPU (przyspieszenie)</td>
					<td><code>-DGGML_BLAS=ON</code></td>
			</tr>
	</tbody>
</table>
<p>Zanim pójdziemy dalej — jedna rzecz, która lubi umykać, a jest w tym wszystkim kluczowa.
Te flagi z <code>-D</code> na przedzie to opcje <strong>budowania</strong>, czyli kompilacji. <code>llama.cpp</code> bierzesz
w postaci kodu źródłowego i raz zamieniasz go w gotowy program — tym właśnie jest
budowanie, a robi to <code>cmake</code>. I to na tym etapie, <em>przed</em> pierwszym uruchomieniem, mówisz,
jakie backendy wkompilować. Nie podajesz <code>-DGGML_CUDA=ON</code> przy odpalaniu modelu — podajesz
to raz, zanim plik wykonywalny w ogóle powstanie. Potem uruchamiasz już gotową binarkę,
a ona z góry wie, na czym ma liczyć.</p>
<p>Przejdźmy tę listę tak, jak się ją czyta w praktyce — od strony pytania „a co ja mam
w obudowie&quot;.</p>
<p><strong>Masz NVIDIA?</strong> No to CUDA, ta zamknięta platforma obliczeniowa NVIDIA, która działa
tylko na ich kartach. Włączasz ją flagą <code>-DGGML_CUDA=ON</code> przy budowaniu.<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> To ta
najbardziej wydeptana ścieżka, o której wszyscy piszą — i faktycznie działa jak trzeba.
Tylko że wydeptana nie znaczy jedyna.</p>
<p><strong>Masz MacBooka na Apple Silicon?</strong> Tu jest najlepszy żart całej układanki: nie musisz
robić absolutnie nic. Backend <strong>Metal</strong> — natywne API GPU Apple — jest na macOS włączony
domyślnie. Budujesz <code>llama.cpp</code> normalnie i twój M2 czy M3 od razu liczy na GPU. Chcesz
go z jakiegoś powodu wyłączyć? Musisz się wręcz postarać: <code>-DGGML_METAL=OFF</code>.<sup id="fnref2:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>
Zunifikowana pamięć w Makach robi tu robotę, o której właściciele osobnych kart mogą
tylko pomarzyć.</p>
<p><strong>Masz Radeona albo GPU Intela?</strong> I tu robi się najciekawiej, bo to dokładnie ci ludzie,
których ta litania odprawia z kwitkiem. A mają aż dwie drogi.</p>
<h2 id="vulkan-czyli-furtka-dla-całej-reszty">Vulkan, czyli furtka dla całej reszty</h2>
<p>Gdybym miał wskazać jeden backend, o którym za mało się mówi, to <strong>Vulkan</strong>. To otwarte,
wieloplatformowe API graficzno-obliczeniowe (ta sama Khronos, co od OpenGL-a), które
obsługuje mnóstwo sterowników GPU — NVIDIA, AMD, Intela. W <code>llama.cpp</code> włączasz je jedną
flagą, <code>-DGGML_VULKAN=ON</code>, i dostajesz akcelerację GPU działającą cross-platform, na
Windowsie, Linuksie i macOS naraz — bez instalowania dedykowanych, ciężkich stosów
producenta.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>I to jest sedno. Bo alternatywą dla AMD jest <strong>HIP/ROCm</strong> — cały software&rsquo;owy stos AMD do
liczenia na GPU (HIP to interfejs w jego ramach, pozwalający pisać kod zbliżony do CUDA;
to nie osobny produkt, tylko część tego samego ekosystemu). Bywa wydajniejszy od Vulkana,
ale kosztuje cię więcej zachodu przy konfiguracji i samym budowaniu. Zobacz, jak to wygląda:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">HIPCXX</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>hipconfig -l<span class="k">)</span><span class="s2">/clang&#34;</span> <span class="nv">HIP_PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>hipconfig -R<span class="k">)</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  cmake -S . -B build -DGGML_HIP<span class="o">=</span>ON -DGPU_TARGETS<span class="o">=</span>gfx1030 -DCMAKE_BUILD_TYPE<span class="o">=</span>Release
</span></span><span class="line"><span class="cl">cmake --build build --config Release
</span></span></code></pre></div><p><code>gfx1030</code> to nie ozdobnik — to kod architektury twojego konkretnego układu AMD, który
musisz najpierw poznać i podać ręcznie.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> U Intela jest podobnie: backend <strong>SYCL</strong>
(otwarty standard programowania heterogenicznego, którym Intel wozi swoje GPU przez oneAPI)
ma na tyle osobną drogę budowania, że w repo doczekał się własnego pliku dokumentacji, obok
głównego <code>build.md</code>.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> Nikt nie mówi, że to zabawa bez łzawienia. Ale że się da — da się.</p>
<div class="callout">
  <span class="callout__label">Dlaczego to ważne dla lokalnego LLM</span>
<p>Dla kogoś bez „zielonej karty&quot; Vulkan bywa najkrótszą drogą do sensownej akceleracji GPU:
jedna flaga <code>-DGGML_VULKAN=ON</code>, sterownik, który i tak masz do grania, i tyle — zamiast
przekopywania się przez cały ROCm czy oneAPI. Nie zawsze wyciśnie z Radeona ostatni token,
ale różnica między „liczę na GPU&quot; a „mielę na samym CPU&quot; jest odczuwalnie większa niż
różnica między dwoma backendami GPU. Najpierw w ogóle wejdź na GPU; to, który z nich
wyciska więcej, dostroisz później.</p>
</div>
<h2 id="a-jeśli-gpu-w-ogóle-nie-ma">A jeśli GPU w ogóle nie ma?</h2>
<p>Zostaje CPU — i wcale nie jesteś skazany na gołą, referencyjną implementację. Masz <strong>BLAS</strong>
(np. OpenBLAS), który przyspiesza obliczenia na procesorze i włącza się parą flag
<code>-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS</code>.<sup id="fnref3:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> A jak siedzisz na czymś bardziej
konkretnym, <code>llama.cpp</code> ma nawet backendy skrojone pod rodzinę procesora: <strong>ZenDNN</strong> pod
serwerowe CPU AMD EPYC i <strong>Arm KleidiAI</strong> pod układy Arm — obok generycznego CPU.<sup id="fnref4:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>
Mrówcza robota optymalizacyjna, o której mało kto wie, a która potrafi wycisnąć z krzemu,
który już masz, zaskakująco dużo.</p>
<h2 id="zrób-to-sam">Zrób to sam</h2>
<p>Powiedzmy, że budujesz <code>llama.cpp</code> sam (a warto — <a href="/poradniki/flagi-llama-cpp/">rozbieraliśmy jego flagi po
kolei</a>, bo to na nich jedzie pół ekosystemu, od Ollamy po
LM Studio). Najprostszy build, sam CPU, bez żadnych ozdobników:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cmake -B build
</span></span><span class="line"><span class="cl">cmake --build build --config Release
</span></span></code></pre></div><p>Chcesz akcelerację? Dokładasz jedną flagę pod swój sprzęt — <code>-DGGML_CUDA=ON</code>,
<code>-DGGML_VULKAN=ON</code>, <code>-DGGML_HIP=ON</code> — i tyle. Co więcej, backendy da się łączyć w jednym
buildzie (CUDA i Vulkan naraz to normalka), a którym urządzeniem policzysz, wybierasz już
w locie, przy odpalaniu:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">llama-cli --list-devices
</span></span><span class="line"><span class="cl">llama-cli -m model.gguf --device Vulkan0
</span></span><span class="line"><span class="cl">llama-cli -m model.gguf --device none
</span></span></code></pre></div><p><code>--list-devices</code> pokaże ci wszystkie akceleratory, które build widzi, <code>--device</code> wskaże
ten jeden, a <code>--device none</code> każe liczyć wyłącznie na CPU — wygodne, gdy chcesz zobaczyć,
ile tracisz bez GPU.<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup> I jedno, co warto rozdzielić w głowie raz na zawsze: wybór
backendu to nie to samo co kwantyzacja modelu. Format GGUF i to, czy bierzesz Q4 czy Q8
(<a href="/poradniki/nazwy-kwantyzacji-gguf/">nazwy rozbieraliśmy osobno</a>), to jedna decyzja —
<em>na czym</em> to policzysz to zupełnie druga. Ten sam plik <code>.gguf</code> pojedzie na CUDA, na
Vulkanie i na gołym procesorze. Nie mieszaj tych dwóch pokręteł, bo to niezależne osie.</p>
<p>Cała aktualna prawda o budowaniu siedzi w jednym pliku:
<a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md">docs/build.md</a> w repo
<code>ggml-org/llama.cpp</code>. Sekcja po sekcji, backend po backendzie.</p>
<p>Bo ta redditowa litania „NVIDIA albo nic&quot; to trochę jak stać przed budynkiem z jednymi
oszklonymi drzwiami frontowymi, na które wszyscy się pchają, i nie wiedzieć, że dookoła
jest jeszcze pięć wejść — węższych, gorzej oznaczonych, część z lekko zacinającą się klamką,
ale prowadzących do tego samego środka. Zielona karta to najwygodniejsze drzwi. Nie jedyne.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><code>ggml-org/llama.cpp</code> — README (deklaracja celu projektu: „a wide range of hardware — locally and in the cloud&quot; i tabela wspieranych backendów, m.in. Metal, BLAS, SYCL, CUDA, HIP, Vulkan, CANN, OpenCL, ZenDNN, IBM zDNN, Hexagon): <a href="https://github.com/ggml-org/llama.cpp#readme">github.com/ggml-org/llama.cpp</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></p>
</li>
<li id="fn:2">
<p><code>ggml-org/llama.cpp</code> — dokumentacja budowania (CPU jako backend domyślny, <code>-DGGML_CUDA=ON</code>, Metal domyślnie ON na macOS z <code>-DGGML_METAL=OFF</code>, <code>-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS</code>, sekcje ZenDNN i Arm KleidiAI): <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md">docs/build.md</a>.&#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>&#160;<a href="#fnref2:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref3:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref4:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><code>ggml-org/llama.cpp</code> — sekcja Vulkan (flaga <code>-DGGML_VULKAN=ON</code>, wieloplatformowy backend na GPU różnych producentów): <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md#vulkan">docs/build.md#vulkan</a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><code>ggml-org/llama.cpp</code> — sekcja HIP (zmienne <code>HIPCXX</code>/<code>HIP_PATH</code> z <code>hipconfig</code>, flagi <code>-DGGML_HIP=ON -DGPU_TARGETS=gfx1030</code>): <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md#hip">docs/build.md#hip</a>.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><code>ggml-org/llama.cpp</code> — osobna dokumentacja backendu SYCL dla GPU Intel: <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/backend/SYCL.md">docs/backend/SYCL.md</a>.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p><code>ggml-org/llama.cpp</code> — definicje flag CLI <code>--list-devices</code>, <code>--device</code> (z obsługą wartości <code>none</code> w <code>parse_device_list</code>): <a href="https://github.com/ggml-org/llama.cpp/blob/master/common/arg.cpp">common/arg.cpp</a>.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Nowy model? Na co patrzeć, zanim go ściągniesz</title><link>https://inferownia.pl/aktualnosci/nowy-model-na-co-patrzec/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0200</pubDate><category>małe-modele</category><guid>https://inferownia.pl/aktualnosci/nowy-model-na-co-patrzec/</guid><description>Świeży model wpada na Hugging Face, scena huczy, a ty już masz palec nad przyciskiem pobierania. Zanim klikniesz, przejdź tę krótką listę — oszczędzi ci wieczoru walki z czymś, co i tak nie chciało ruszyć.</description><content:encoded><![CDATA[<p>„NEW SOTA MODEL DROPPED&quot;. Wątek puchnie w oczach,
w komentarzach lawina wykrzykników, ktoś już pokazuje screena, jak model rozwiązuje
zagadkę o wilku, kozie i kapuście, a ty siedzisz i czujesz, że folder <code>models</code> zaraz
znowu spuchnie o kolejne kilka giga. Palec sam wędruje nad „Download&quot;. I to jest właśnie
ten moment, w którym warto na sekundę zdjąć rękę z myszki.</p>
<p>Bo entuzjazm sceny jest szczery, ale scena nie odpala tego modelu na twojej karcie. Ty
odpalasz. I między „premiera na Hugging Face&quot; a „gada u ciebie w terminalu tak, jak powinno&quot;
leży kilka pułapek, które regularnie kosztują ludzi wieczór. Dobra wiadomość: da się je
odhaczyć w pięć minut, jeszcze zanim cokolwiek pobierzesz. Zrobimy z tego listę — taką,
którą przejdziesz przy każdym kolejnym „SOTA&quot;, bo modeli będzie jeszcze wysyp.</p>
<h2 id="karta-modelu-czyli-tabliczka-znamionowa">Karta modelu, czyli tabliczka znamionowa</h2>
<p>Zanim cokolwiek zrobisz — otwórz kartę modelu. Na Hugging Face to nie żaden osobny dokument,
tylko plik <code>README.md</code> w repo, a na jego górze siedzi kawałek metadanych w YAML-u.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>
To jest tabliczka znamionowa: licencja, model bazowy, czasem gotowe wyniki ewaluacji.
Cała ta lista, którą zaraz przejdziemy, w dużej mierze czyta się właśnie stamtąd. Nauczysz
się rzucać okiem na te kilka pól i połowa niespodzianek znika, zanim się wydarzy.</p>
<h2 id="ile-ten-model-waży-i-w-jakim-wariancie">Ile ten model waży i w jakim wariancie?</h2>
<p>Pierwsze pytanie brutalnie praktyczne: czy to w ogóle wejdzie? Liczba parametrów (te 7B,
8B, 70B w nazwie) to grube przybliżenie apetytu na pamięć, ale w pełnej precyzji nawet
„mały&quot; 8B to kilkanaście giga. Dlatego naprawdę interesuje cię, czy istnieje wersja
skwantyzowana — a konkretnie, czy ktoś zrobił już pliki <strong>GGUF</strong>, format, którego używają
<code>llama.cpp</code> i Ollama.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Kwantyzacja to nic innego jak zapisanie tych miliardów wag ciaśniej: mniej bitów na liczbę,
mniejszy plik, mniejszy apetyt na VRAM, a jakość spada zaskakująco mało. Dokumentacja
<code>llama.cpp</code> podaje wprost skalę: Llama-3.1-8B w formacie F16 waży jakieś 14,96 GiB, a ta
sama w Q4_K_M — około 4,58 GiB.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Trzy razy mniej, a <code>Q4_K_M</code> to poziom, który regularnie
pada jako rozsądny kompromis rozmiar-jakość. Co znaczą wszystkie te literki i cyferki po
<code>Q</code>, rozgryzaliśmy osobno <a href="/poradniki/nazwy-kwantyzacji-gguf/">tutaj</a>.</p>
<p>Jedno małe ostrzeżenie, żeby nie pomylić pojęć: kwantyzacja po treningu (to, co dostajesz
w GGUF-ie) to nie to samo, co trenowanie modelu od zera w niskiej precyzji. Dwie różne
rzeczy, różny wpływ na jakość. Ktoś na scenie zawsze je pomiesza — nie bądź tym kimś.</p>
<h2 id="czy-w-ogóle-wolno-ci-go-użyć">Czy w ogóle wolno ci go użyć?</h2>
<p>To pole, które ludzie przewijają najszybciej, a które potrafi najbardziej zaboleć.
W metadanych karty jest <code>license:</code> — identyfikator licencji, po którym Hub nawet pozwala
filtrować modele.<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I tu jest haczyk: samo to, że repo jest otwarte i pliki leżą do
pobrania, nie znaczy, że wolno ci na tym modelu zbudować cokolwiek komercyjnego.</p>
<p>Część modeli jedzie na licencjach „społecznościowych&quot; albo „research only&quot;, które
uśmiechają się otwarcie, a w treści ograniczają użycie. Gdy w polu widzisz <code>license: other</code>,
to sygnał, żeby kliknąć w <code>license_link</code> i faktycznie przeczytać, na co się piszesz — bo
identyfikator sam z siebie nic ci nie gwarantuje.<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Nudne? Nudne. Ale to jedyny punkt
z tej listy, który może się skończyć rozmową z prawnikiem, a nie z terminalem.</p>
<h2 id="jak-długi-kontekst-realnie-dostaniesz">Jak długi kontekst realnie dostaniesz?</h2>
<p>Model w karcie chwali się 128k kontekstu, więc bierzesz go do przełykania całych PDF-ów —
i tu wpadasz w klasyczne nieporozumienie. Deklarowane maksimum modelu to jedno, a okno,
które faktycznie ustawi ci runtime, to drugie.</p>
<p>Ollama na przykład sama dobiera domyślną długość kontekstu do tego, ile masz VRAM-u: przy
mniej niż 24 GiB da ci 4k, a dopiero przy 48 GiB i więcej sięga nawet po 256k.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>
Czyli twój wypasiony 128k model może po cichu chodzić na czterech tysiącach tokenów, a ty
się dziwisz, czemu „zapomina&quot; początek dokumentu. Wymusisz to zmienną <code>OLLAMA_CONTEXT_LENGTH</code>
albo parametrem <code>num_ctx</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">OLLAMA_CONTEXT_LENGTH</span><span class="o">=</span><span class="m">64000</span> ollama serve
</span></span></code></pre></div><p>A ustawić to okno możesz na kilka sposobów i jest wśród nich hierarchia: <code>PARAMETER num_ctx</code>
w Modelfile ustala okno na stałe dla danego modelu, a opcje podane w locie w wywołaniu API
nadpisują to, co siedzi w Modelfile.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> Tylko pamiętaj o dwóch kosztach: większe okno
to znacznie więcej pamięci — dokumentacja Ollamy mówi to wprost — a siłą rzeczy także wolniejsze
liczenie.<sup id="fnref1:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> Do tego rozciąganie okna ponad długość, na jakiej model trenowano, potrafi
pogorszyć jakość odpowiedzi; dokładnie ten problem rozbraja mechanizm YaRN, który rozłożyliśmy
na części <a href="/naukowy/yarn-kontekst/">tu</a>. W <code>llama.cpp</code> tym samym oknem steruje flaga <code>-c</code>.</p>
<h2 id="czy-narzędzie-w-ogóle-to-obsłuży">Czy narzędzie w ogóle to obsłuży?</h2>
<p>Najboleśniejsza pułapka premierowa: model jest na Hugging Face, więc zakładasz, że od razu
odpalisz go w <code>llama.cpp</code> czy Ollamie. A to wcale nie jest automatyczne. <code>llama.cpp</code> wymaga
formatu GGUF, a jak model przychodzi w innym formacie, ktoś musi go najpierw skonwertować
skryptami <code>convert_*.py</code> z repo (Hugging Face udostępnia do tego nawet przestrzeń
„GGUF-my-repo&quot;).<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Gorzej, gdy model przynosi <strong>nową architekturę</strong>. Wtedy wsparcia po prostu nie ma, dopóki
ktoś go nie dopisze — a to nie jest jedna linijka. Trzeba ruszyć skrypty konwersji w Pythonie
(mapowanie tensorów, <code>constants.py</code>, <code>tensor_mapping.py</code>), potem kod C++ (<code>llama-arch</code>,
<code>llama-model-loader</code>, <code>llama-model</code>, obsługa RoPE), a na koniec przetestować to na CPU, CUDA
i Metalu.<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup> Dlatego dzień premiery modelu i dzień pierwszego działającego GGUF-a to
często dwie różne daty. Jak śledzisz świeżynkę, sprawdź najpierw, czy w issues repo ktoś już
nie ogarnia integracji — o tym, jak w ogóle działa ten cały ekosystem wokół GGUF-a, pisaliśmy
<a href="/aktualnosci/ekosystem-gguf/">osobno</a>.</p>
<h2 id="instruct-czy-base-sprawdź-zanim-się-zdziwisz">Instruct czy base? Sprawdź, zanim się zdziwisz</h2>
<p>Widzisz w nazwie samo „Llama-3-8B&quot; bez dopisku i myślisz, że pogadasz. Odpalasz, piszesz
pytanie, a model zamiast odpowiedzieć — dopisuje kolejne pytania. Nie zepsuł się. Wziąłeś
wersję <strong>base</strong>, która tylko kontynuuje sekwencję tokenów, zamiast wersji <strong>instruct/chat</strong>,
douczonej do podążania za poleceniami i dialogiem.<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup></p>
<p>Różnica jest fundamentalna, a diabeł siedzi w formacie. Model czatowy oczekuje wiadomości
opakowanych w konkretne tokeny kontrolne — u jednego to <code>[INST]...[/INST]</code>, u innego
<code>&lt;|user|&gt;</code> i <code>&lt;|assistant|&gt;</code> — i co gorsza, dwa modele dotrenowane z tej samej bazy mogą mieć
zupełnie różny format czatu.<sup id="fnref1:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup> Podasz zły — i instruct-model, który powinien świecić,
nagle gada od rzeczy. W bibliotece <code>transformers</code> załatwia to <code>apply_chat_template</code>, który
sam skleja wiadomości w format właściwy dla danego modelu.<sup id="fnref2:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup> W <code>llama.cpp</code> odpowiada za
to <code>--jinja</code>. Morał krótki: zajrzyj do karty i upewnij się, który to wariant, zanim ogłosisz,
że „model jest słaby&quot;.</p>
<h2 id="benchmarki-tak-ale-z-ręką-na-sercu">Benchmarki? Tak, ale z ręką na sercu</h2>
<p>I na koniec ta tabelka, przez którą w ogóle klikasz „Download&quot; — słupki, w których nowy
model bije wszystko dookoła. Model card może nawet nieść ustrukturyzowane wyniki w polu
<code>model-index</code>, z zadaniem, datasetem, metryką i źródłem.<sup id="fnref3:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Fajnie. Tylko traktuj to jak
deklarację producenta, nie jak wyrok.</p>
<p>Jest udokumentowany problem zwany <strong>benchmark data contamination</strong>: dane testowe benchmarku
wyciekają do zbioru treningowego modelu, przez co wynik na tym teście rośnie bez realnej
poprawy jakości.<sup id="fnref:8"><a href="#fn:8" class="footnote-ref" role="doc-noteref">8</a></sup> Model po prostu „widział odpowiedzi&quot; na egzaminie. To nie teoria
spiskowa — poświęcono temu prace przeglądowe. Dlatego liczba w tabelce mówi ci co najwyżej,
że warto sprawdzić samemu na swoim zastosowaniu, a nie że sprawa zamknięta. Najlepszy
benchmark i tak jest jeden: twój własny prompt, którego nikt nie mógł wcześniej wkuć.</p>
<h2 id="zrób-to-sam-lista-na-lodówkę">Zrób to sam: lista na lodówkę</h2>
<p>Cała ta gadka sprowadza się do sześciu spojrzeń w kartę modelu, zanim ruszysz pobieranie:</p>
<table>
	<thead>
			<tr>
					<th>Sprawdź</th>
					<th>Gdzie</th>
					<th>Czerwona flaga</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Rozmiar i wariant</td>
					<td>liczba parametrów, czy jest GGUF (np. <code>Q4_K_M</code>)</td>
					<td>tylko pełna precyzja, brak GGUF</td>
			</tr>
			<tr>
					<td>Licencja</td>
					<td>pole <code>license</code> / <code>license_link</code></td>
					<td><code>other</code> bez przeczytanej treści, „research only&quot;</td>
			</tr>
			<tr>
					<td>Kontekst</td>
					<td>deklaracja modelu vs domyślne okno runtime&rsquo;u</td>
					<td>liczysz na 128k, dostajesz 4k</td>
			</tr>
			<tr>
					<td>Wsparcie narzędzia</td>
					<td>GGUF gotowy? architektura znana <code>llama.cpp</code>?</td>
					<td>świeża architektura, brak konwertera</td>
			</tr>
			<tr>
					<td>Instruct vs base</td>
					<td>dopisek w nazwie, karta modelu</td>
					<td>base tam, gdzie chcesz rozmawiać</td>
			</tr>
			<tr>
					<td>Benchmarki</td>
					<td>tabelka wyników, metodologia</td>
					<td>same słupki bez metody, ryzyko skażenia</td>
			</tr>
	</tbody>
</table>
<p>Wydrukuj, przyklej nad biurkiem, albo po prostu zapamiętaj rytm: waga, licencja, kontekst,
wsparcie, wariant, benchmarki. Przy trzecim nowym modelu przejdziesz to odruchowo.</p>
<p>Bo świeży model to trochę jak używane auto z ogłoszenia: zdjęcia lśnią, opis zachwala, scena
piszczy z zachwytu. Ale to ty siadasz za kierownicą i to ty potem stoisz na poboczu, jak się
okaże, że pod maską nie ma silnika pasującego do twojej karty. Pięć minut zaglądania pod
maskę — kartę modelu — kosztuje mniej niż wieczór klikania w „czemu to nie działa&quot;.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Hugging Face Hub docs — Model Cards (metadane: <code>license</code>, <code>license_name</code>/<code>license_link</code>, <code>base_model</code>/<code>base_model_relation</code>, <code>model-index</code>), <a href="https://huggingface.co/docs/hub/en/model-cards">huggingface.co/docs/hub/en/model-cards</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></p>
</li>
<li id="fn:2">
<p>llama.cpp — wymóg formatu GGUF, konwersja skryptami <code>convert_*.py</code>, przestrzeń „GGUF-my-repo&quot;, <a href="https://github.com/ggml-org/llama.cpp/blob/master/README.md">README repo ggml-org/llama.cpp</a>.&#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>llama.cpp — poziomy kwantyzacji GGUF (IQ*, Q2_K–Q8_0, F16) oraz przykład Llama-3.1-8B: F16 ≈ 14,96 GiB, Q4_K_M ≈ 4,58 GiB, <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/quantize/README.md">tools/quantize/README.md</a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Ollama docs — Context length: domyślne dobieranie okna kontekstu do VRAM (poniżej 24 GiB → 4k, 24–48 GiB → 32k, od 48 GiB → 256k), zmienna <code>OLLAMA_CONTEXT_LENGTH</code> oraz uwaga o rosnącym koszcie pamięci, <a href="https://docs.ollama.com/context-length">docs.ollama.com/context-length</a>.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Ollama docs — <code>PARAMETER num_ctx</code> (okno kontekstu modelu) w Modelfile oraz nadpisywanie parametrów Modelfile opcjami podanymi w locie przez API, <a href="https://github.com/ollama/ollama/blob/main/docs/modelfile.mdx#valid-parameters-and-values">docs/modelfile.mdx</a>.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>llama.cpp — kroki dodania wsparcia nowej architektury (skrypty konwersji w Pythonie + kod C++ + testy CPU/CUDA/Metal), <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/development/HOWTO-add-model.md">docs/development/HOWTO-add-model.md</a>.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:7">
<p>Hugging Face transformers docs — Chat templating: różnica base vs instruct/chat, tokeny kontrolne, <code>apply_chat_template</code>, ryzyko złego formatu promptu, <a href="https://huggingface.co/docs/transformers/en/chat_templating">huggingface.co/docs/transformers/en/chat_templating</a>.&#160;<a href="#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref2:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:8">
<p>„Benchmark Data Contamination of Large Language Models: A Survey&quot;, przegląd problemu przecieku danych ewaluacyjnych do zbioru treningowego, <a href="https://arxiv.org/abs/2406.04244">arXiv:2406.04244</a>.&#160;<a href="#fnref:8" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Ekosystem GGUF: skąd się biorą modele, które odpalasz</title><link>https://inferownia.pl/aktualnosci/ekosystem-gguf/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0200</pubDate><category>kwantyzacja</category><guid>https://inferownia.pl/aktualnosci/ekosystem-gguf/</guid><description>Ściągasz jeden plik z Hugging Face, dwuklik i model gada. Ale kto go w ogóle zrobił, czemu wariantów jest dwadzieścia i co siedzi w środku tego jednego .gguf? Rozbieramy fabrykę.</description><content:encoded><![CDATA[<p>Wchodzisz na Hugging Face po świeży model, otwierasz stronę i widzisz listę plików jak menu w barze mlecznym, w którym wszystko nazywa się prawie tak samo. <code>Q4_K_M</code>, <code>Q5_K_S</code>, <code>Q6_K</code>, <code>Q8_0</code>, <code>IQ4_XS</code>, gdzieś niżej jakiś <code>BF16</code> na 30 gigabajtów. Wszystkie kończą się na <code>.gguf</code>, wszystkie są tego samego modelu, a ty stoisz i myślisz: dobra, ale który? I skąd się to w ogóle wzięło, skoro autor modelu wrzucił coś zupełnie innego?</p>
<p>To jest ten moment, w którym większość ludzi bierze na chybił trafił ten <code>Q4_K_M</code>, bo tak radzą na Reddicie, odpala i idzie dalej. I słusznie — działa. Ale pod tym jednym plikiem stoi cała cicha fabryka: ludzie, narzędzia, konwersje i format, który ktoś kiedyś usiadł i zaprojektował, żebyś ty mógł zrobić dwuklik. Warto wiedzieć, co tam mruczy pod maską — bo dzięki temu przestajesz zgadywać, a zaczynasz wybierać świadomie.</p>
<h2 id="co-to-w-ogóle-jest-ten-gguf">Co to w ogóle jest, ten GGUF</h2>
<p>Zacznijmy od rozczarowania, bo lepiej od razu: <strong>GGUF to nie jest model</strong>. To nie nowa architektura, nie nowy sposób trenowania, nie magiczny AI od ggerganova. To pojemnik. Format pliku — dosłownie „GGML Universal File” — do trzymania modelu na dysku tak, żeby silnik inferencyjny mógł go szybko wczytać i zacząć gadać.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Model (Llama, Qwen, Mistral — cokolwiek) rodzi się gdzie indziej, w treningu na klastrze, którego rachunku za prąd żaden z nas nie chciałby zobaczyć. GGUF to dopiero opakowanie, w które ten wytrenowany model się przepakowuje na koniec, pod kątem tego, że odpalisz go u siebie na jednej karcie.</p>
<p>Format wymyślił Georgi Gerganov, ten sam, który stoi za <code>llama.cpp</code> i biblioteką <code>ggml</code>.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> GGUF jest następcą kilku starszych formatów o równie uroczych nazwach — GGML, GGMF, GGJT — które po drodze się wykruszyły. I tu pierwsza pułapka, w którą łatwo wdepnąć: <strong>GGML i GGUF to nie synonimy</strong>. GGML to ten stary, w dużej mierze wyparty format pliku (i przy okazji wciąż nazwa biblioteki tensorowej pod spodem), a GGUF to jego młodszy, mądrzejszy brat z porządnymi metadanymi.<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<h2 id="co-siedzi-w-tym-jednym-pliku">Co siedzi w tym jednym pliku</h2>
<p>To jest właśnie sedno, dla którego GGUF wygrał. Otwórz sobie w głowie taki plik jak pudełko z przegródkami:</p>
<ul>
<li><strong>Nagłówek</strong> — na samym początku cztery bajty <code>GGUF</code> (magic number, bajt po bajcie <code>0x47 0x47 0x55 0x46</code>), zaraz za nimi numer wersji formatu, liczba tensorów i sterta metadanych.<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li><strong>Metadane klucz-wartość</strong> — i tu robi się ciekawie. Zamiast beztypowej listy liczb jak w starych formatach, GGUF trzyma nazwane pola w hierarchii z kropkami: <code>general.architecture</code>, <code>llama.context_length</code>, <code>general.quantization_version</code>. Klucz <code>general.architecture</code> (czym ten model właściwie jest) musi być zawsze, a jak model jest skwantowany, to musi być też <code>general.quantization_version</code>.<sup id="fnref3:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li><strong>Tokenizer</strong> — w środku, w tym samym pliku. To jest ten myk, którego naprawdę brakowało wcześniej. GGUF potrafi wnieść cały tokenizer: natywne tablice tokenów, scores i merges, albo pełny <code>tokenizer.json</code> prosto z Hugging Face, albo szablony czatu w Jinja.<sup id="fnref4:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Dlatego jeden <code>.gguf</code> wystarcza — nie musisz dociągać pięciu plików obok.</li>
<li><strong>Same wagi</strong> — na końcu surowe dane tensorów, wyrównane do granicy (domyślnie co 32 bajty, klucz <code>general.alignment</code>), żeby silnik mógł je wczytać przez <code>mmap</code> bez mielenia całego pliku.<sup id="fnref5:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
</ul>
<div class="callout">
  <span class="callout__label">Dlaczego to ważne dla lokalnego LLM</span>
<p>To „wszystko w jednym pliku” jest dokładnie tym, co robi z GGUF format do <strong>lokalnej</strong> inferencji. Ściągasz jeden plik i masz komplet: wagi, architekturę i tokenizer. Nie ma cyrku z dociąganiem <code>config.json</code>, <code>tokenizer.json</code> i trzech innych obok. Silnik typu <code>llama.cpp</code> bierze go przez <code>mmap</code> i startuje w sekundę, bez deserializacji. Mniej ruchomych części to mniej rzeczy, które ci się rozjadą o 23:00, gdy chcesz tylko o coś zapytać model.</p>
</div>
<h2 id="skąd-biorą-się-wszystkie-te-warianty">Skąd biorą się wszystkie te warianty</h2>
<p>No dobra, a czemu tego samego modelu jest dwadzieścia sztuk? Bo GGUF wspiera całą tęczę typów tensorów: pełną precyzję (F32, F16, BF16), serię K (<code>Q2_K</code> do <code>Q6_K</code>), stare legacy (<code>Q4_0</code>, <code>Q8_0</code>), nowszą serię IQ opartą na macierzy istotności (<code>IQ4_XS</code>, <code>IQ2_XXS</code>) i egzotykę w stylu ternarnego <code>TQ1_0</code>.<sup id="fnref6:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Każdy z tych <code>Q</code>-ów to inny schemat ściśnięcia wag. <code>Q4_K</code> upycha wagę w jakichś 4,5 bita, <code>Q6_K</code> w 6,56, <code>Q2_K</code> w 2,63 — i to są dokładnie te przegródki, w których leży cały kompromis rozmiar/jakość/szybkość.<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>I tu druga pułapka: <strong>te warianty to nie są różne modele</strong>. <code>Q4_K_M</code>, <code>Q5_K_S</code>, <code>Q8_0</code> tego samego modelu to te same wagi bazowe, tylko skompresowane innym sitem. Grubszy plik = bliżej oryginału i wolniej, chudszy = mniej VRAM-u i szybciej, ale z lekkim ubytkiem jakości. Co ważne, to jest kwantyzacja <strong>post-training</strong> — bierzesz gotowy, wytrenowany model i ściskasz go po fakcie. Nie mylić z trenowaniem od zera w niskiej precyzji. W nazewnictwo tych literek zagłębialiśmy się osobno <a href="/poradniki/nazwy-kwantyzacji-gguf/">tutaj</a>, bo to temat na własny wpis.</p>
<h2 id="kto-to-wszystko-właściwie-robi">Kto to wszystko właściwie robi</h2>
<p>Teraz najlepsze. Ten <code>Q4_K_M</code>, który ściągasz — bardzo często <strong>nie zrobił go autor modelu</strong>. Autor wrzuca zwykle wagi w safetensors i może jedną-dwie wersje GGUF, a resztę tego bufetu produkują ludzie z boku: community-quantizerzy. Konta jak bartowski czy mradermacher (dawniej głośny TheBloke) siedzą i masowo mielą cudze modele na wszystkie możliwe warianty, dzień po dniu, jak taka lokalna piekarnia GGUF-ów.</p>
<p>Jak to robią bez klastra? Dwiema drogami. Pierwsza to skrypt <code>convert_hf_to_gguf.py</code> prosto z repo <code>llama.cpp</code> — łyka wagi z Hugging Face i wypluwa GGUF, obsługuje kupę architektur (w tym multimodalne i MoE), ma opcje <code>--outtype</code> (bierzesz <code>f16</code>, <code>bf16</code>, <code>q8_0</code>… — czym te „szesnastki&quot; różnią się od siebie, jest <a href="/poradniki/bf16-f16-f32/">tu</a>), <code>--vocab-only</code>, <code>--split-max-size</code> do krojenia wielkich plików, a nawet <code>--remote</code>, żeby konwertować prosto z Huba.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Druga droga jest jeszcze leniwsza: <code>ggml-org/gguf-my-repo</code>, gotowy Space na Hugging Face, gdzie wklejasz repo, klikasz i dostajesz komplet kwantyzacji bez kompilowania czegokolwiek u siebie.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</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"># klasyczna droga: własny build llama.cpp</span>
</span></span><span class="line"><span class="cl">python convert_hf_to_gguf.py ./Qwen2.5-7B-Instruct <span class="se">\
</span></span></span><span class="line"><span class="cl">  --outtype f16 --outfile qwen2.5-7b-f16.gguf
</span></span><span class="line"><span class="cl"><span class="c1"># a potem osobno kwantyzacja narzędziem llama-quantize do Q4_K_M itd.</span>
</span></span></code></pre></div><p>Sam Hugging Face traktuje ten format jak pełnoprawnego obywatela: masz filtr <code>library=gguf</code>, który pokazuje wszystko, co gęgnięte (<a href="https://huggingface.co/models?library=gguf">hf.co/models?library=gguf</a>), a na stronie konkretnego pliku podejrzysz metadane i listę tensorów wprost z przeglądarki, bez ściągania.<sup id="fnref2:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Praktyczny wniosek: skoro warianty sypie kto chce, <strong>sprawdzaj, czyje repo bierzesz</strong>. Zerknij na autora, na to, czy imatrix był użyty, czy karta modelu ma ręce i nogi. Na co patrzeć przy świeżym modelu rozkładaliśmy <a href="/aktualnosci/nowy-model-na-co-patrzec/">w osobnej notce</a>.</p>
<h2 id="gguf-kontra-safetensors-to-nie-jest-ranking">GGUF kontra safetensors: to nie jest ranking</h2>
<p>Skoro autor wrzuca safetensors, a ty odpalasz GGUF — który jest lepszy? Źle postawione pytanie. To dwa pojemniki do dwóch różnych rzeczy.</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th>GGUF</th>
					<th>safetensors</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Co trzyma</td>
					<td>wagi + architektura + tokenizer, w jednym pliku</td>
					<td><strong>tylko</strong> tensory, goła macierz liczb</td>
			</tr>
			<tr>
					<td>Metadane / tokenizer</td>
					<td>w środku</td>
					<td>osobno (<code>config.json</code>, <code>tokenizer.json</code>)</td>
			</tr>
			<tr>
					<td>Kwantyzacja</td>
					<td>tak, to jego chleb (<code>Q4_K_M</code>, IQ…)</td>
					<td>zwykle pełna precyzja lub bf16/fp16</td>
			</tr>
			<tr>
					<td>Pod co skrojony</td>
					<td>inferencja przez <code>llama.cpp</code>/<code>ggml</code>, CPU/GPU</td>
					<td>trening/inferencja w PyTorch, transformers, diffusers</td>
			</tr>
			<tr>
					<td>Po co powstał</td>
					<td>jeden plik gotowy do odpalenia</td>
					<td>bezpieczna, szybka (zero-copy) alternatywa dla <code>.bin</code>/pickle</td>
			</tr>
	</tbody>
</table>
<p>Safetensors narodził się z zupełnie innej potrzeby: żeby nie ładować cudzych wag przez <code>pickle</code> (który potrafi odpalić dowolny kod przy wczytaniu) i żeby robić to szybko, bez kopiowania w pamięci.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> To rekomendowany format wag na Hugging Face — ale trzyma <strong>wyłącznie</strong> tensory. Chcesz z niego odpalić model, musisz dorzucić config i tokenizer obok. GGUF ten cały komplet nosi w sobie i dokłada kwantyzację. Nie „lepszy/gorszy” — inne zadanie. Jak chcesz to potem faktycznie uruchomić garścią flag, jest o tym <a href="/poradniki/flagi-llama-cpp/">osobny poradnik</a>.</p>
<h2 id="wróć-do-tego-menu">Wróć do tego menu</h2>
<p>Wróć teraz do tego menu na Hugging Face, do listy dwudziestu plików kończących się na <code>.gguf</code>. Już nie wygląda jak bar mleczny, w którym wszystko nazywa się tak samo. Widzisz teraz, że ktoś wziął model wytrenowany na drugim końcu świata, przepuścił go przez <code>convert_hf_to_gguf.py</code>, upchał wagi, architekturę i tokenizer do jednego pudełka z przegródkami, ścisnął sitem <code>Q4_K_M</code> i wrzucił na Huba, żebyś ty mógł go zassać jednym plikiem i usłyszeć, jak mruczy pod biurkiem. Cała ta cicha fabryka — od klastra treningowego, przez konto bartowskiego, po twój dysk — sprowadza się do jednego czterobajtowego napisu na początku pliku: <code>GGUF</code>. Reszta to już tylko ty i pytanie, który wariant dziś bierzesz.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Specyfikacja formatu: struktura pliku, magic number <code>GGUF</code> (<code>0x47 0x47 0x55 0x46</code>), wersje 1–3, wyrównanie <code>general.alignment</code>, wymagane klucze metadanych, typy tensorów i osadzanie tokenizera, historia jako następca GGML/GGMF/GGJT — <a href="https://github.com/ggml-org/ggml/blob/master/docs/gguf.md">ggml-org/ggml, <code>docs/gguf.md</code></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></p>
</li>
<li id="fn:2">
<p>Twórca formatu (@ggerganov), integracja z Hub (tag <code>library=gguf</code>, viewer metadanych i tensorów), narzędzie <code>gguf-my-repo</code>, porównanie z safetensors oraz tabela typów kwantyzacji z bitami-na-wagę — <a href="https://huggingface.co/docs/hub/en/gguf">Hugging Face Hub docs, GGUF</a>.&#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>&#160;<a href="#fnref2:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Mechanizm konwersji modeli HF do GGUF, obsługiwane architektury i opcje <code>--outtype</code>, <code>--vocab-only</code>, <code>--split-max-size</code>, <code>--remote</code> — <a href="https://github.com/ggml-org/llama.cpp/blob/master/convert_hf_to_gguf.py">llama.cpp, <code>convert_hf_to_gguf.py</code></a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Narzędzie, którym community-quantizerzy konwertują i kwantyzują dowolne wagi HF do GGUF bez lokalnej kompilacji <code>llama.cpp</code> — <a href="https://huggingface.co/spaces/ggml-org/gguf-my-repo">ggml-org/gguf-my-repo (Hugging Face Space)</a>.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Definicja safetensors jako bezpiecznego (bez deserializacji pickle), zero-copy formatu przechowywania samych tensorów oraz jego rola w ekosystemie transformers/diffusers/candle — <a href="https://huggingface.co/docs/safetensors/index">Hugging Face, dokumentacja safetensors</a>.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>