<?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>Fine-Tuning — Inferownia</title><link>https://inferownia.pl/tags/fine-tuning/</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>Wed, 15 Jul 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://inferownia.pl/tags/fine-tuning/index.xml" rel="self" type="application/rss+xml"/><item><title>QLoRA: fine-tuning dużego modelu w 4 bitach</title><link>https://inferownia.pl/naukowy/qlora/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0200</pubDate><author>Tim Dettmers</author><author>Artidoro Pagnoni</author><author>Ari Holtzman</author><author>Luke Zettlemoyer</author><category>fine-tuning</category><guid>https://inferownia.pl/naukowy/qlora/</guid><description>Dostroić model 65B na jednej karcie 48 GB, z jakością pełnego 16-bitowego treningu? QLoRA mrozi wagi w 4 bitach i trenuje same adaptery. Rozkładamy na części, jak to w ogóle ma prawo działać.</description><content:encoded><![CDATA[<p>Wyobraź sobie na chwilę, że bierzesz się wreszcie za to, co wiecznie odkładasz „na kiedyś&quot;:
dostroić model pod siebie — pod swój żargon, swoje dane, swój ton. Wchodzisz na jakiś poradnik o fine-tuningu, czytasz do
połowy z zapałem, a potem pada zdanie, które gasi światło: „potrzebujesz kilku kart A100
po 80 GB&quot;. No i tyle. Zamykasz kartę w przeglądarce, wracasz do promptowania gotowca i
mówisz sobie, że przecież i tak nie miałeś na to czasu. Na forach o fine-tuningu to gatunek posta
sam w sobie — ktoś pyta, jak dotrenować siódemkę na własnym korpusie, i pierwsza odpowiedź
brzmi „wynajmij GPU w chmurze&quot;. Fine-tuning latami był tym pokojem za szybą: widzisz, co
w środku, ale klamka jest po drugiej stronie.</p>
<p>W maju 2023 czterech badaczy z University of Washington tę szybę stłukło. Praca nazywa się
<em>QLoRA: Efficient Finetuning of Quantized LLMs</em>, a jej główna teza brzmi jak przechwałka
z forum: da się dostroić model <strong>65B na jednej karcie 48 GB</strong> i zachować jakość pełnego,
16-bitowego fine-tuningu.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Nie „prawie&quot;, nie „z gwiazdką na jakości&quot;. Tak blisko, że
w benchmarku różnicy praktycznie nie widać. Jak? Rozłóżmy to na części, bo cały trik jest
piękny i składa się z kilku osobnych sprytów, które dopiero razem zaskakują.</p>
<h2 id="skąd-się-bierze-ten-cały-vram">Skąd się bierze ten cały VRAM</h2>
<p>Zanim rozbijemy QLoRA na części, trzeba wiedzieć, na co przy treningu schodzi pamięć — bo to nie
tylko same wagi. Klasyczny fine-tuning musi trzymać na karcie cztery rzeczy naraz: wagi
modelu, gradienty (po jednej liczbie na każdą wagę), stany optymalizatora (Adam trzyma
ich dwa na wagę) i aktywacje. Przy pełnym treningu w 16 bitach to znaczy, że sama arytmetyka
optymalizatora potrafi zająć więcej niż sam model. Dlatego dotrenowanie „całego&quot; modelu 65B
to zabawa nie na jedną kartę, a na małą serwerownię.</p>
<p>Pierwszy pomysł, żeby to obejść, jest starszy od QLoRA i nazywa się <strong>LoRA</strong> (Low-Rank
Adapters). Zamiast ruszać wszystkie miliardy wag, zamrażasz je w całości, a obok doklejasz
malutkie, niskorangowe macierze — adaptery — i trenujesz tylko je. Nagle gradienty i
optymalizator dotyczą ułamka parametrów. To już był przełom. Ale został jeden gruby
kamień w bucie: <strong>zamrożone wagi bazowe i tak muszą siedzieć na karcie</strong>, żeby przez nie
puścić forward i backward. A dla modelu 65B te zamrożone wagi w 16 bitach to wciąż jakieś
130 GB. Adaptery są tanie, ale bilet wstępu — sam model — dalej jest za drogi.</p>
<h2 id="trzy-sprytne-rzeczy-które-robi-qlora">Trzy sprytne rzeczy, które robi QLoRA</h2>
<p>I tu wchodzi sedno pracy. Skoro te wagi bazowe są zamrożone — nikt ich w treningu nie
zmienia — to po co trzymać je w pełnej precyzji? QLoRA mówi: skwantyzujmy je do <strong>4 bitów</strong>,
zamroźmy je w tej postaci, a gradient przepuśćmy wstecz przez ten zamrożony 4-bitowy model
prosto do adapterów LoRA.<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Trenujemy dalej tylko adaptery — ale bilet wstępu właśnie
schudł czterokrotnie. Żeby to zagrało bez utraty jakości, autorzy dorzucili trzy osobne
patenty.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p><strong>Raz — NF4, czyli 4-bit NormalFloat.</strong> Nie wszystkie 4-bitowe typy danych są sobie równe. Wagi
wytrenowanej sieci nie są rozrzucone byle jak — układają się mniej więcej w rozkład
normalny, taką dzwonową górkę wokół zera. NF4 to typ danych skrojony dokładnie pod ten
kształt, teoretycznie optymalny informacyjnie dla wag o rozkładzie normalnym. To ważne:
NF4 <strong>nie jest</strong> zwykłym zmiennoprzecinkowym FP4 z IEEE. To specjalny format, który
„marnuje&quot; mniej z tych czterech bitów, bo wie z góry, gdzie wagi się tłoczą.<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p><strong>Dwa — double quantization (podwójna kwantyzacja).</strong> Kwantyzacja blokowa musi gdzieś
zapisać stałe skalujące — po jednej na blok wag. To drobne liczby, ale jak masz ich
miliony, robi się z tego zauważalny narzut. QLoRA kwantyzuje więc… same stałe kwantyzacji.
Kwantyzacja kwantyzacji brzmi jak żart, a oszczędza realnie około 0,4 bita na parametr.<sup id="fnref2:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>
Przy modelu 65B te ułamki bitów zamieniają się w gigabajty.</p>
<p><strong>Trzy — paged optimizers (optymalizatory stronicowane).</strong> Przy gradient checkpointingu
zużycie pamięci potrafi nagle skoczyć — pojawia się pik i karta krztusi się „out of memory&quot;
w najmniej spodziewanym momencie. Paged optimizers używają NVIDIA unified memory, żeby te
skoki obsłużyć: gdy na GPU robi się ciasno, stany optymalizatora są po cichu przerzucane do
RAM-u i z powrotem, jak stronicowanie pamięci w systemie operacyjnym.<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Dzięki temu
pik nie wywala całego treningu.</p>
<div class="callout">
  <span class="callout__label">Dlaczego to ważne dla lokalnego LLM</span>
<p>Najważniejsza rzecz do zapamiętania: <strong>4 bity nie znaczą, że cały trening liczy się w 4
bitach.</strong> W 4 bitach siedzą tylko zamrożone wagi bazowe — i to po to, żeby zająć mało miejsca.
Kiedy przychodzi liczyć forward i backward, te wagi są w locie dekwantyzowane, a same
obliczenia na aktywacjach idą w wyższej precyzji (typowo bf16 albo fp16). QLoRA to sprytny
sposób na <strong>przechowanie</strong> modelu, nie na liczenie w niższej precyzji. Dlatego jakość nie
leci na łeb — arytmetyka zostaje porządna.</p>
</div>
<h2 id="to-nie-jest-to-samo-co-gptq-czy-awq">To nie jest to samo co GPTQ czy AWQ</h2>
<p>Tu łatwo o zamieszanie, więc warto postawić słup graniczny. Kiedy słyszysz „kwantyzacja&quot;,
najczęściej chodzi o coś zupełnie innego niż QLoRA: o GPTQ albo AWQ, czyli metody, które
biorą <strong>gotowy, wytrenowany model i ściskają go pod samą inferencję</strong> (post-training
quantization). Rozgryzaliśmy ten drugi świat osobno <a href="/naukowy/gptq-awq/">tutaj</a> — i to jest
inna bajka.</p>
<p>QLoRA nie służy do odchudzania modelu pod odpalanie. QLoRA to <strong>metoda fine-tuningu</strong> —
kwantyzacja 4-bitowa jest w niej tylko trikiem, który pozwala zmieścić trening na jednej
karcie. Efekt końcowy to wytrenowane adaptery LoRA, które doklejasz do modelu. Zapamiętaj
prostą regułę: GPTQ/AWQ to „jak taniej <strong>uruchomić</strong> cudzy model&quot;, QLoRA to „jak tanio
<strong>dostroić</strong> model pod siebie&quot;. Mylenie tych dwóch to klasyk początkującego na forach.</p>
<h2 id="guanaco-czyli-dowód-że-to-działa">Guanaco, czyli dowód, że to działa</h2>
<p>Teoria teorią, ale autorzy poszli na całość: tą metodą dostroili <strong>ponad 1000 modeli</strong> —
różne architektury (LLaMA, T5), różne skale (7B, 13B, 33B, 65B), osiem zestawów danych
instrukcyjnych. Skale, których zwykłym fine-tuningiem nikt by na tym sprzęcie nie ruszył.<sup id="fnref3:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Najlepsza rodzina dostała nazwę <strong>Guanaco</strong> (tak, po tej andyjskiej kuzynce lamy — w tym
świecie wszystko jest lamą). Trenowana na danych OpenAssistant, w benchmarku Vicuna
przebiła wszystkie wcześniej publicznie wydane modele i osiągnęła <strong>99,3% poziomu ChatGPT</strong>
— przy zaledwie <strong>24 godzinach</strong> fine-tuningu na jednej karcie.<sup id="fnref4:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Tu tylko jedna uczciwa gwiazdka, którą stawiają sami autorzy: te 99,3% to wynik z
konkretnego benchmarku Vicuna, ocenianego przez GPT-4 — nie jakaś uniwersalna miara „model
jest w 99% tak dobry jak ChatGPT do wszystkiego&quot;. Praca wprost pokazuje, że ocena GPT-4 to
tania i sensowna alternatywa dla oceny ludzkiej, ale zastrzega, że ówczesne benchmarki
chatbotów nie były w pełni wiarygodne do precyzyjnego rankingowania modeli.<sup id="fnref5:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Liczba
robi wrażenie — traktuj ją jednak jako „zaskakująco blisko&quot;, a nie jako wyrok.</p>
<h2 id="zrób-to-sam-a-przynajmniej-wiedz-gdzie-klikać">Zrób to sam (a przynajmniej wiedz, gdzie klikać)</h2>
<p>Najlepsze jest to, że QLoRA nie została na papierze jako ciekawostka. Kod referencyjny i
modele Guanaco wylądowały na licencji MIT w repo <a href="https://github.com/artidoro/qlora">artidoro/qlora</a>,
razem z jądrami CUDA do treningu 4-bitowego.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> A w praktyce prawie nikt nie pisze tego
od zera — całość jest wpięta w ekosystem Hugging Face. Kwantyzację robi biblioteka
<strong>bitsandbytes</strong>, adaptery dokłada <strong>PEFT</strong>, a spina to wszystko <code>transformers</code>.</p>
<p>Sercem konfiguracji jest <code>BitsAndBytesConfig</code> — i to w nim odnajdziesz jak żywe wszystkie
trzy patenty z papieru:<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-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">transformers</span> <span class="kn">import</span> <span class="n">BitsAndBytesConfig</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">torch</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">bnb_config</span> <span class="o">=</span> <span class="n">BitsAndBytesConfig</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">load_in_4bit</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>                    <span class="c1"># wagi bazowe w 4 bitach</span>
</span></span><span class="line"><span class="cl">    <span class="n">bnb_4bit_quant_type</span><span class="o">=</span><span class="s2">&#34;nf4&#34;</span><span class="p">,</span>            <span class="c1"># patent nr 1: NF4, nie zwykły FP4</span>
</span></span><span class="line"><span class="cl">    <span class="n">bnb_4bit_use_double_quant</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>       <span class="c1"># patent nr 2: podwójna kwantyzacja</span>
</span></span><span class="line"><span class="cl">    <span class="n">bnb_4bit_compute_dtype</span><span class="o">=</span><span class="n">torch</span><span class="o">.</span><span class="n">bfloat16</span> <span class="c1"># obliczenia w bf16, nie w 4 bitach!</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>Popatrz na ostatnią linijkę — <code>compute_dtype</code> to bf16 (a czym <code>bf16</code> różni się od <code>f16</code>, rozbieramy <a href="/poradniki/bf16-f16-f32/">osobno</a>), dokładnie ta wyższa precyzja
obliczeń, o której gadaliśmy wyżej. Wagi leżą w 4 bitach, ale liczy się porządnie.</p>
<p>A ile realnie karty to zjada? Zależy od modelu, długości sekwencji, batcha i checkpointingu
— liczby 65B/48 GB z papieru to konkretny eksperyment, nie uniwersalna tabelka. Ale skala
robi wrażenie z drugiej strony też: dzięki nested quantization dokumentacja Hugging Face
pokazuje dostrojenie <strong>Llama-13B na jednej karcie T4 16 GB</strong> — sekwencja 1024 tokeny,
batch 1, gradient accumulation na 4 kroki.<sup id="fnref1:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> T4 to karta, którą dostajesz za darmo
w Google Colab.</p>
<table>
	<thead>
			<tr>
					<th>Metoda</th>
					<th>Co robi z wagami bazowymi</th>
					<th>Ile parametrów trenujesz</th>
					<th>Po co</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Pełny fine-tuning</td>
					<td>16 bitów, wszystkie odmrożone</td>
					<td>wszystkie</td>
					<td>najdroższy, „złoty standard&quot;</td>
			</tr>
			<tr>
					<td>LoRA</td>
					<td>16 bitów, zamrożone</td>
					<td>tylko adaptery</td>
					<td>tanio, ale wagi 16-bit dalej na karcie</td>
			</tr>
			<tr>
					<td><strong>QLoRA</strong></td>
					<td><strong>4 bity (NF4), zamrożone</strong></td>
					<td><strong>tylko adaptery</strong></td>
					<td><strong>tanio i mieści się na jednej karcie</strong></td>
			</tr>
			<tr>
					<td>GPTQ / AWQ</td>
					<td>4 bity, pod inferencję</td>
					<td>nic (to nie trening)</td>
					<td>tanie odpalanie gotowca</td>
			</tr>
	</tbody>
</table>
<p>Jeśli martwi cię, czy w ogóle zmieścisz coś na swojej karcie, to osobna rachunkowość —
zbieraliśmy wzory na VRAM <a href="/poradniki/ile-vram-na-model/">tutaj</a>. Ale morał QLoRA jest
prosty: bilet wstępu spadł tak, że fine-tuning przestał być salą VIP.</p>
<p>Przez lata fine-tuning działał jak wędkarstwo z burty jachtu — niby każdy może, tylko
najpierw kup jacht. QLoRA wsadziła ci w rękę wędkę i pokazała, że ryba bierze tak samo z
pomostu za pięć złotych. Zamrożone wagi ściśnięte do czterech bitów, garść adapterów do
dotrenowania, jedna karta pod biurkiem — i model, który jeszcze wczoraj wymagał serwerowni,
uczy się twojego żargonu przez noc. Nie dlatego, że ktoś dołożył ci pamięci. Dlatego, że
ktoś w końcu zapytał, czy naprawdę trzeba trzymać w pełnej precyzji coś, czego i tak nikt
w treningu nie rusza.</p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, Luke Zettlemoyer, <em>QLoRA: Efficient Finetuning of Quantized LLMs</em>, arXiv:2305.14314 (23 maja 2023) — abstrakt: 65B na jednej karcie 48 GB przy jakości 16-bit, NF4, double quantization, paged optimizers, rodzina Guanaco 99,3% ChatGPT w benchmarku Vicuna, ponad 1000 wytrenowanych modeli i zastrzeżenia co do wiarygodności benchmarków. <a href="https://arxiv.org/abs/2305.14314">arxiv.org/abs/2305.14314</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></p>
</li>
<li id="fn:2">
<p>Hugging Face blog, <em>Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA</em> — opis trzech innowacji (NF4, double quantization, paged optimizers) i oszczędności ~0,4 bita/parametr z podwójnej kwantyzacji. <a href="https://huggingface.co/blog/4bit-transformers-bitsandbytes">huggingface.co/blog/4bit-transformers-bitsandbytes</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>Oficjalne repozytorium kodu QLoRA — implementacja referencyjna, jądra CUDA do treningu 4-bitowego, modele Guanaco (trenowane na OpenAssistant), licencja MIT. <a href="https://github.com/artidoro/qlora">github.com/artidoro/qlora</a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Hugging Face Transformers, dokumentacja kwantyzacji bitsandbytes — parametry <code>BitsAndBytesConfig</code> (<code>load_in_4bit</code>, <code>bnb_4bit_quant_type=&quot;nf4&quot;</code>, <code>bnb_4bit_use_double_quant</code>, <code>bnb_4bit_compute_dtype</code>) oraz przykład dostrojenia Llama-13B na T4 16 GB z nested quantization. <a href="https://huggingface.co/docs/transformers/main/en/quantization/bitsandbytes">huggingface.co/docs/transformers/main/en/quantization/bitsandbytes</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>
</ol>
</div>
]]></content:encoded></item></channel></rss>