<?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>Apple-Silicon — Inferownia</title><link>https://inferownia.pl/tags/apple-silicon/</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>Fri, 17 Jul 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://inferownia.pl/tags/apple-silicon/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></channel></rss>