Artykuł · · 14 min czytania
Model 125B na komputerze za 6 tysięcy złotych. Sprawdzam Stratę własnym benchmarkiem
Zainteresowała mnie możliwość uruchamiania dużych modeli językowych lokalnie, bez wydawania majątku na kartę graficzną i komputer. Mój cały komputer kosztował około 6 tys. zł (mniej więcej 1400 euro): serwerowy procesor Intel Xeon E5-2699 v4 z 2016 roku, 121 GB RAM-u DDR4 (tyle widzi system), dysk NVMe i GeForce RTX 3060 z 12 GB pamięci.
W moim feedzie Strata pojawiała się przez kilka tygodni z różnych źródeł: z GitHuba, z Reddita, z newsletterów o lokalnych modelach. Obietnica była zawsze ta sama: Qwen3.8-Flash-Next, otwarty model Alibaby o 125 mld parametrów, na jednej karcie z 12 GB, z prędkością ponad 50 tokenów na sekundę. Postanowiłem to zmierzyć, a potem sprawdzić własnym benchmarkiem, czy taki model jest wart więcej niż cztery mniejsze, które na podobnym komputerze są naturalnym wyborem.
Czym jest Strata
Strata to otwarty silnik (licencja MIT) jednego autora o pseudonimie Niko1221, niezwiązanego z zespołem Qwen, zbudowany pod Qwen3.8-Flash-Next: model typu mixture of experts, w którym ze 125 mld parametrów przy każdym tokenie pracuje około 6 mld. Strata trzyma wszystkich „ekspertów” w RAM-ie, na karcie zostawia warstwy uwagi i zapas najczęściej używanych ekspertów, resztę liczy na procesorze, a dodatkowa mała warstwa (MTP, multi-token prediction) proponuje kilka tokenów naprzód, które pełny model sprawdza w jednym przebiegu; według dokumentacji odpowiedź jest ta sama, tylko szybsza (szczegóły mechanizmów).
Instalacja i wymagania
Instalacja przez polecenie strata w terminalu nie wymaga uprawnień administratora i wszystko zapisuje w katalogu domowym:
curl -fsSL https://github.com/Niko1221/Strata/releases/latest/download/install.sh | sh
strata launch --plan --model iq3_s # pokazuje plan, niczego nie zmienia
strata launch --model iq3_s --context 128k --yes --no-tui
Skrypt sprawdza sumę SHA-256 i podpis pobieranego archiwum silnika; sam skrypt, jak zawsze przy curl | sh, pobiera się bez weryfikacji, więc zapisałem go do pliku i przeczytałem przed uruchomieniem. Silnik i model z dodatkami to 90 GB do pobrania; ładowanie modelu trwa około minuty. Serwer udostępnia API zgodne z OpenAI (http://127.0.0.1:8080/v1) i Anthropic oraz czat w przeglądarce.
Model jest dostępny w kilku stopniach kwantyzacji, czyli zapisu wag na mniejszej liczbie bitów zamiast 16: mniejsze pliki, mniej RAM-u, odrobinę gorsze odpowiedzi. Instalator dodaje RAM do pamięci karty, odejmuje 5 GB na system i od danego progu proponuje kolejny wariant:
| Próg instalatora (RAM + VRAM − 5 GB) | Wariant | Eksperci w RAM-ie |
|---|---|---|
| 32 GB | Coder IQ1_M, połowa ekspertów wybranych pod programowanie | 23 GB |
| 40 GB | IQ2_XS | 35,5 GB |
| 48 GB | IQ3_XXS | 43 GB |
| 64 GB | IQ3_S, testowany tutaj | 50 GB |
Liczy się przede wszystkim RAM, bo eksperci muszą się w nim zmieścić w całości: dla IQ3_S to 50 GB, a dokumentacja zaleca 60 GB i pisze, że przy 64 GB wariant działa, gdy niewiele innych programów jest otwartych. U mnie proces silnika zajmował 83 GB, bo przy RAM-ie powyżej 107 GB Strata ładuje do pamięci także 29-gigabajtową tablicę osadzeń n-gramów, która normalnie zostaje na dysku. Karta musi mieć co najmniej 12 GB, a procesor obsługiwać AVX2; większa karta przyspiesza model, bo mieści więcej ekspertów, ale nie zmniejsza zapotrzebowania na RAM.
IQ3_S zapisuje wagi na około 3,3 bita. Autorzy mierzą jakość kompresji na 5 tys. tokenów tekstu, sprawdzając, jak często wariant wybiera ten sam najbardziej prawdopodobny token co wersja 8-bitowa: IQ3_S w 87,7% pozycji, 4-bitowy UD-Q4_K_XL w 93,1%, IQ3_XXS w 84,5%, a najmniejszy Q2_0 w 80,6%. To inna miara niż benchmark: inny token nie musi zmieniać sensu odpowiedzi, a jak często go zmienia, dokumentacja nie pokazuje. Pełnego modelu nie miałem z czym porównać, więc nie wiem, ile kosztuje sama kompresja.
Przy starcie Strata ostrzegła, że na karcie zostaje tylko 200–450 MB wolnej pamięci, bo część zajmuje pulpit, i zaproponowała --vram-reserve-mib 1024. Zignorowałem ostrzeżenie i nic złego się nie stało, ale gdy sterownik zacznie przenosić pamięć karty do RAM-u, pisanie spada do kilku tokenów na sekundę.
Prędkość: moje pomiary a dokumentacja
Dokumentacja podaje dla IQ3_S 53 tokeny na sekundę pisania i 1620 tokenów na sekundę czytania promptu, zmierzone na komputerze z RTX 5070 (też 12 GB), Ryzenem 5 7600 i 64 GB RAM-u. Na moim komputerze, przy temperaturze 0 (losowość wyłączona, pomiar powtarzalny) i czterech rodzajach tekstu (funkcja w Pythonie, esej po polsku, esej po angielsku, lista 30 nazw), Strata pisała średnio 49 tokenów na sekundę: od 43 w polskim eseju do 54 w kodzie. Pisanie jest więc na poziomie dokumentacji. Różnice między rodzajami tekstu wynikają z MTP: według statystyk, które serwer zwraca z każdą odpowiedzią, w kodzie model przyjmował ponad 70% proponowanych tokenów, w polskiej prozie około 40%.
Czytanie długich promptów wyszło dwa razy wolniej niż w dokumentacji: 790–850 tokenów na sekundę dla promptów od 17 do 115 tys. tokenów. Rdzeni mam więcej niż tamten komputer (22 wobec 6), ale przy czytaniu Strata przesyła ekspertów do karty przez PCIe, a mój komputer ma PCIe 3.0 (zmierzone 10,5 GB/s), pamięć DDR4 i procesor bez instrukcji AVX-512, z których silnik korzysta na nowszych procesorach (u mnie, według logu, używał AVX2). Dokumentacja nie rozdziela wpływu tych czynników, więc nie potrafię wskazać, który odpowiada za różnicę.
Dla porównania ten sam plik modelu w llama.cpp (wersja b10809, z ekspertami w RAM-ie i bez warstwy MTP, której llama.cpp dla tego modelu nie używa) pisał 16 tokenów na sekundę, trzy razy wolniej, a prompt czytał z prędkością 88–226 tokenów na sekundę.
Długi kontekst
Model obsługuje natywnie 262 144 tokeny kontekstu; instalator ustawia 32K dla kart poniżej 14 GB, ja uruchomiłem Stratę ze 128K. Do pomiarów brałem losowe fragmenty angielskiej dokumentacji Straty, za każdym razem inne, żeby silnik nie skorzystał z zapamiętanego promptu. Czytanie 115 tys. tokenów trwało 140 s, a pisanie prawie nie zależało od długości kontekstu: 46 tokenów na sekundę przy 1,3 tys. tokenów i 42 przy 115 tys. (w krótkich promptach z poprzedniej sekcji 43–54).
Ukryte w środku polskie zdanie z hasłem model odnalazł w 15 z 16 prób; raz, przy 66 tys. tokenów, odmówił, bo uznał je za prompt injection, czyli ukryte w danych polecenie. W trudniejszym teście dwa angielskie zdania w stylu dokumentacji („nocne testy regresji działają na maszynie ORCA-7”, „maszyna ORCA-7 stoi w biurze we Frankfurcie”) wstawiłem w jedną czwartą i trzy czwarte tekstu, w pięciu promptach o długości od 9 do 122 tys. tokenów; na pytanie, w jakim mieście stoi maszyna z nocnymi testami, model odpowiedział poprawnie za każdym razem.
Agenci
Polecenie strata connect wypisuje albo zapisuje konfigurację dla Claude Code, Codex CLI, OpenCode, Hermes Agent i kilku innych narzędzi; dla Claude Code to trzy zmienne środowiskowe: lokalny adres zgodny z API Anthropic, nazwa modelu i zastępczy klucz. Z opcją --check wysyła próbne pytanie i wywołanie narzędzia (tool calling, czyli prośbę modelu o uruchomienie funkcji); u mnie oba przeszły w 3–4 sekundy.
Claude Code (w trybie --bare, bez wtyczek) dostał ode mnie mały projekt w Pythonie z błędem w liczeniu słów, niezaimplementowaną funkcją i sześcioma testami, z których pięć nie przechodziło. Naprawił wszystko w 19 krokach i 133 sekundach, nie ruszając pliku z testami; każde wywołanie narzędzia model sformułował poprawnie za pierwszym razem. Pomaga pamięć podręczna promptów: silnik pamięta już przeczytany początek rozmowy, więc w kolejnych krokach czytał tylko dopisany fragment, w 0,3–1,1 s. To jedna próba na prostym zadaniu, nie ocena pracy z większym repozytorium.
Własny benchmark
Publikowane wyniki benchmarków niewiele mówią o modelu skompresowanym do 3 bitów, uruchomionym na takim sprzęcie i pytanym po polsku. Zbudowałem więc własny zestaw: 53 zadania po polsku w ośmiu kategoriach, odpowiadających temu, co mierzą publiczne zestawy testowe dla modeli językowych.
| Kategoria | Publiczny wzór | Przykłady zadań | Zadań |
|---|---|---|---|
| Matematyka | GSM8K, MATH | mnożenie dużych liczb, rabat i podatek, procent składany, dni między datami | 7 |
| Programowanie | HumanEval, MBPP | funkcje w Pythonie uruchamiane z moimi testami: walidacja polskiego numeru podatkowego NIP z sumą kontrolną, liczby rzymskie, liczby słownie po polsku | 6 |
| Rozumowanie | BBH, ARC | zagadka o kłamcach, ważenie monet, kolejność wzrostu, liczenie liter w słowie | 9 |
| Wiedza | MMLU, SimpleQA | fakty z historii, nauki i informatyki, w tym dwa polskie | 7 |
| Wykonywanie instrukcji | IFEval | tylko JSON, tylko wielkie litery, dokładnie pięć linii, 40–60 słów z zadanym ostatnim słowem | 7 |
| Praca z tekstem | DROP, SQuAD | pytania do podanego raportu z awarii: czas trwania, przyczyna, chronologia; wydźwięk opinii | 6 |
| Pisanie | ocena ręczna | mail do klienta, czterowiersz z rymami AABB, bajka dla dziecka, przeróbka urzędowego komunikatu na luźny styl | 6 |
| Odporność na zmyślanie | TruthfulQA | pytania o rzeczy, które nie istnieją: powieść „Szklany ogród” Bolesława Prusa (polskiego pisarza z XIX wieku), polski noblista z fizyki z 1978 roku, funkcja itertools.chunked w Pythonie | 5 |
W sześciu pierwszych kategoriach odpowiedzi sprawdza skrypt: porównuje liczbę lub słowo, parsuje JSON, liczy linie i słowa, a kod uruchamia z testami. Zadania z pisania i ze zmyślania oceniałem sam, według dwóch reguł. Tekst zalicza, gdy spełnia polecenie i jest spójny; pojedynczy błąd językowy nie dyskwalifikuje, ale wiersz bez rymów albo z dwoma wersami zamiast czterech już tak. Odpowiedź na pytanie o nieistniejącą rzecz zalicza tylko wtedy, gdy model mówi, że jej nie ma, i nie dokłada zmyślonych faktów; „Prus tego nie napisał, to powieść Reymonta” nie zalicza.
Zestaw jest mały i jednojęzyczny, a zadania napisałem sam, więc mierzy codzienne, sprawdzalne zadania po polsku, nie granice możliwości modeli. Modele odpowiadały przy domyślnych temperaturach ze swoich kart, czyli tak, jak używa się ich na co dzień, więc odpowiedzi różnią się między przebiegami; dlatego zestaw powtarzałem i sumuję wyniki ze wszystkich przebiegów: Strata i gemma-4-E4B trzy razy bez myślenia i dwa z myśleniem, gemma-4-12B i Qwen3.6-35B-A3B dwa razy bez i raz z myśleniem, Qwen3.6-27B dwa razy bez myślenia. W trybie myślenia, w którym model przed odpowiedzią pisze rozumowanie, dostał na nie limit 8000 tokenów (Strata) albo 6000 (pozostałe, bo są wolniejsze); Qwen3.6-27B przy swoich 5 tokenach na sekundę potrzebowałby na taki przebieg kilkunastu godzin, więc go pominąłem.
Do porównania wybrałem cztery otwarte modele, które na komputerze z kartą 12 GB i dużą ilością RAM-u są naturalnym wyborem, wszystkie uruchomione przez llama.cpp w wariantach Q4_K_M (około 4,8 bita na wagę):
- gemma-4-E4B (5 GB): mały model Google, mieści się w całości na karcie.
- gemma-4-12B (7,4 GB): największy z tych modeli, który w całości mieści się na karcie 12 GB.
- Qwen3.6-35B-A3B (21 GB): model mixture of experts z 3 mld aktywnych parametrów; podobnie jak w Stracie eksperci leżą w RAM-ie, a liczy je procesor.
- Qwen3.6-27B (17 GB): model gęsty, czyli liczący wszystkie wagi przy każdym tokenie; na karcie mieści się tylko częściowo.
Porównanie nie jest całkiem równe: mniejsze modele mają wagi zapisane na około 4,8 bita, Strata na 3,3, więc jeśli kompresja coś psuje, to bardziej model 125B.
Wyniki
Bez trybu myślenia Qwen3.8-Flash-Next przez Stratę odpowiedział poprawnie w 89% prób (142 ze 159 w trzech przebiegach), a cały zestaw 53 zadań zajmował mu 3,3 minuty. Gemma-4-12B miała 82%, Qwen3.6-35B-A3B 79%, gemma-4-E4B 63%, a Qwen3.6-27B 79%.
Matematyka i programowanie najmocniej odróżniają duży model od małych. Strata pomyliła się raz na 21 prób w matematyce (w zadaniu o pociągach podała 20 minut zamiast 120) i ani razu w 18 próbach programistycznych; gemma-4-12B i Qwen3.6-35B-A3B miały w matematyce 11 i 10 z 14, a w kodzie po 10 z 12. Funkcji zapisującej liczby słownie po polsku, z odmianą „dwa tysiące”, „pięć tysięcy”, nie przeszedł żaden z mniejszych modeli w żadnym przebiegu, a mnożenie 4567 × 8912 bez myślenia pomyliły trzy z czterech mniejszych modeli za każdym razem (poradził sobie tylko Qwen3.6-27B); z myśleniem policzyła je też gemma-4-12B. Gemma-4-E4B zaliczyła 7 z 18 zadań z kodem; jej funkcje do parsowania czasu, walidacji NIP-u i liczb słownie nie przeszły testów w żadnym przebiegu.
Rozumowanie wyszło Stracie bez myślenia słabo: 23 z 27. Zagadkę o trzech osobach, z których część zawsze kłamie, pomyliła we wszystkich trzech próbach, za każdym razem odpowiadając w niecałą sekundę jednym imieniem; z myśleniem rozwiązała ją dwa razy na dwa. Tę samą zagadkę bez myślenia pomyliły też wszystkie mniejsze modele we wszystkich przebiegach. Liczenie liter „r” w słowie „przerażający” to pułapka tokenizacji (model widzi słowo w kawałkach, nie w literach), którą Strata zaliczyła 2 razy na 3, a obie Gemmy ani razu.
Wiedza i wykonywanie instrukcji nie różnicują większych modeli: Strata, gemma-4-12B i Qwen3.6-35B-A3B miały tu komplet albo prawie komplet. Gemma-4-E4B myliła się w faktach w 6 z 21 prób, a polecenia „odpowiedz wyłącznie wielkimi literami” nie wykonała ani razu. Qwen3.6-35B-A3B dwa razy przekroczył zadany limit 40–60 słów.
Praca z tekstem to jedyna kategoria, w której Strata bez myślenia przegrała z mniejszymi modelami: 15 z 18 wobec kompletu gemma-4-12B i Qwen3.6-35B-A3B. Cała różnica to jedno pytanie: o czas trwania awarii, na które trzy razy odpowiedziała 105 minut, licząc od wygaśnięcia certyfikatu (14:30) zamiast od chwili, gdy system przestał przyjmować transakcje (14:35). Z myśleniem miała komplet.
Pisanie oceniałem ręcznie. Mail, wyjaśnienie techniczne, tłumaczenie idiomów i przeróbka komunikatu wychodziły Stracie dobrze w każdej próbie; czterowiersz z rymami AABB nie udał się jej bez myślenia ani razu (raz dostałem dwa wersy zamiast czterech), a z myśleniem dwa razy na dwa. Rymowanie po polsku okazało się trudne dla wszystkich: żaden z mniejszych modeli nie napisał poprawnego czterowiersza, a Gemmy wstawiały do wierszy nieistniejące słowa („gotę”, „rozwoni”). Qwen3.6-35B-A3B w przeróbce komunikatu dwa razy dopisał, że szkolenie jest „w środę” (3 czerwca 2024 to poniedziałek).
Odporność na zmyślanie przegrały wszystkie modele. Strata bez myślenia zaliczyła 9 z 15 prób, z myśleniem 3 z 10; gemma-4-12B i Qwen3.6-35B-A3B po 4 z 10, gemma-4-E4B 5 z 15, a najlepiej wypadł Qwen3.6-27B z 6 z 10. Rzadko chodziło o streszczenie nieistniejącej powieści od zera (choć gemma-4-E4B robiła to za każdym razem). Typowy błąd wyglądał inaczej: model słusznie zaprzeczał, a potem dokładał zmyślone fakty, na przykład że „Szklany ogród” napisał Reymont (inny polski pisarz, noblista), że „Cienie mostów” to powieść Johna le Carré z 2015 roku, albo wpadał w pętlę „Jerzy Zurek (nie, to błąd)” powtarzaną do końca odpowiedzi. Dziesięć prób Straty z myśleniem to za mało, żeby mówić o regule, ale wzorzec był za każdym razem ten sam: po dłuższym rozumowaniu model odpowiadał pewniej, nie prawdziwiej, i na przykład dwa razy na dwa opisał z przykładem kodu funkcję itertools.chunked, której w Pythonie nie ma.
Myślenie pomaga więc tam, gdzie trzeba policzyć albo sprawdzić: Stracie podniosło wynik z 89% do 92%, a gemma-4-E4B z 63% do 77%. Kosztuje za to czas: zestaw trwał u Straty ponad pięć razy dłużej (18,4 minuty zamiast 3,3), a jedna funkcja w Pythonie powstawała 141 s i 6783 tokeny rozumowania z odpowiedzią zamiast 22 s. Gemma-4-12B myślała 26 minut i w trzech zadaniach wyczerpała limit 6000 tokenów, oddając między innymi pusty wiersz. Qwen3.6-35B-A3B z myśleniem wyszedł na to samo co bez (77% wobec 79%), bo w dziewięciu zadaniach, w tym w czterech z kodem, wyczerpał limit i nie zdążył odpowiedzieć, a zestaw trwał 65 minut. Limit jest moim wyborem; z większym te modele odpowiedziałyby pewnie lepiej, ale jeszcze wolniej.
Qwen3.6-27B, jedyny gęsty model w porównaniu, odpowiedział poprawnie w 79% prób (84 ze 106), ale przy 5 tokenach na sekundę zestaw trwał u niego 28 minut, prawie dziewięć razy dłużej niż u Straty bez myślenia. Jako jedyny z mniejszych modeli policzył mnożenie w obu przebiegach i najlepiej ze wszystkich pięciu wypadł w pytaniach o nieistniejące rzeczy, za to dwa razy pomylił rok wydania „Lalki” i planetę z największą liczbą księżyców, a zagadki o kłamcach i liczb słownie nie rozwiązał ani razu.
Co z tego wynika
O prędkości na tym komputerze decydują trzy rzeczy: ile wag model liczy na token, czy mieszczą się na karcie i czy silnik ma predykcję wielu tokenów. Gemma-4-E4B pisze 76 tokenów na sekundę, gemma-4-12B 38, Qwen3.6-35B-A3B z ekspertami w RAM-ie 37, Strata 49, a Qwen3.6-27B, który na kartę się nie mieści, 5; ten sam model 125B bez MTP w llama.cpp pisał 16. Wybór na karcie 12 GB sprowadza się do pary Strata albo gemma-4-12B: 7 punktów procentowych i 11 tokenów na sekundę więcej, przy tych samych błędach w zmyślaniu, za cenę 60 GB RAM-u zajętych przez cały czas pracy, 90 GB dysku i zależności od silnika jednego autora, zbudowanego pod jedną rodzinę modeli. Gdy wyjdzie następny Qwen, llama.cpp obsłuży go w ciągu dni; Strata wtedy, gdy Niko1221 go doda.
Możliwość wykonania części pracy zupełnie lokalnie, na modelu mniejszym od czołowych modeli w chmurze, jest kusząca i po tym teście wiem, której części: rachunków, kodu, pytań o sprawdzalne fakty i pracy z dokumentami. Pytań o rzeczy, których model może nie znać, nie zadałbym lokalnie żadnemu z pięciu modeli bez sprawdzenia odpowiedzi.
Pieniądze nie są tu argumentem. Komputer pod obciążeniem pobierał według watomierza około 340 W, z czego sama karta około 140 W; przy cenie prądu w Polsce około 1 zł za kilowatogodzinę godzina pracy modelu kosztuje około 35 groszy (8 eurocentów). Ten sam model w API Alibaby kosztuje według cenników agregatorów 0,47 dolara za milion wygenerowanych tokenów, a w godzinę Strata wygeneruje ich najwyżej 176 tys.; to ten sam rząd wielkości, bez kupowania 60 GB RAM-u. Argumentem są dane, które nie wychodzą z komputera, brak limitów i praca bez sieci. Ograniczeniem to, że Strata domyślnie obsługuje jedno zapytanie naraz (kilku użytkowników nie testowałem) i że tryb myślenia, który poprawia wyniki w logice i kodzie, wydłuża pracę pięciokrotnie.
Źródła
- Strata, repozytorium i dokumentacja, Niko1221, wersja 0.2.3, silnik 0.1.48: README (tabela prędkości),
docs/MODELS.md,docs/QUANTS.md,docs/HOW_IT_WORKS.md. - Qwen3.8-Flash-Next, karta modelu, Qwen.
- llama.cpp, ggml-org, wersja b10809; modele porównawcze w wariantach Q4_K_M od LM Studio Community.
- Cena API Qwen3.8-Flash-Next według anotherwrapper.com, stan na wrzesień 2026.