Dwa silniki, te same modele na tej samej karcie
basal-rs to silnik, który uruchamia modele Basal. Jego szybkość porównujemy z basal-serve v1.5.0, referencyjny serwer autora modeli Basal w Pythonie i PyTorchu. Na kartach NVIDIA działa w trybie fast: BF16, torch.compile i CUDA graphs. Na Macach używa MLX., czyli serwerem autora modeli, na tej samej karcie graficznej. Oba silniki liczą w precyzji 16-bitowej: basal-rs w formacie f16, upstream w BF16. Decyzje obu silników porównujemy z obliczeniami w pełnej precyzji FP32, w której autor sprawdzał modele. Wyniki opisują silnik, a za trafność decyzji odpowiadają modele Basal.
- 900/900 decyzji takich samych jak w pełnej precyzji FP32 (basal-1.5-max, A100, f16)
- 0 różnic w odpowiedzi na to samo żądanie pod obciążeniem
- 1,5–2,8× więcej żądań na tej samej karcie (14 z 15 par karta i model)
- 1,3–2,8× mniej energii na decyzję we wszystkich 15 parach karta i model
Jak mierzymy
Wyniki wydajności i zgodności pochodzą z raportów w repozytorium basal-rs, z danymi i opisem warunków. Oba silniki mierzymy zawsze na tej samej karcie, a basal-rs działa w ustawieniach domyślnych, takich jak po instalacji.
basal-rs, f16
wagi i wyniki pośrednie w f16, sumy w mnożeniu macierzy w f32
upstream, BF16
PyTorch z torch.compile i CUDA graphs, na Macach MLX w bf16
upstream, FP32
Pełna precyzja, w której autor oceniał modele. Służy do porównania decyzji. Szybkości z nią nie porównujemy. Kto potrzebuje dokładnie FP32, ustawia w basal-rs dtype: f32 i dostaje 900 / 900.
Pojedyncza decyzja
Czas jednej decyzji, gdy serwer nie ma innej pracy: 44 przykładowe pytania, każde w obu kolejnościach opcji. Mediana z 39 pomiarów, po odrzuceniu 5.
Serwer HTTP
Działający serwer i 1, 8 albo 32 klientów naraz; każde żądanie zawiera jedno pytanie. Obu serwerom zapytania wysyła ten sam program, a zużycie energii odczytujemy z karty.
Ruch mieszany
Dokumenty od 100 do 16 tys. tokenów i od 1 do 14 pytań na żądanie. Mierzony tylko basal-rs: upstream obsługuje na modelu max ok. 17 takich żądań na minutę, więc pomiar trwałby ponad godzinę dłużej na każdej karcie.
Zgodność
Decyzje porównujemy z obliczeniami w pełnej precyzji FP32, w której autor sprawdzał modele. Oba silniki muszą zbudować dokładnie takie samo zapytanie do modelu, co do tokenu.
| Karta | Architektura, Compute capability, czyli numer wersji układu NVIDIA. Od niego zależy, jakie instrukcje obsługuje karta. | Pamięć | Limit mocy | Liczba wirtualnych rdzeni procesora (vCPU) maszyny, w której pracuje karta. |
|---|---|---|---|---|
| H100 80 GB | Hopper, 9.0 | 80 GB | 700 W | 16 vCPU |
| A100 80 GB | Ampere, 8.0 | 80 GB | 400 W | 16 vCPU |
| L40S | Ada, 8.9 | 48 GB | 350 W | 12 vCPU |
| RTX 6000 Ada | Ada, 8.9 | 48 GB | 300 W | 12 vCPU |
| RTX A6000 | Ampere, 8.6 | 48 GB | 300 W | 6 vCPU |
Pięć kart, trzy modele
Przełączniki nad wykresem zmieniają model i rodzaj pomiaru. Liczba z „×” przy każdej karcie pokazuje, ile razy lepszy wynik ma silnik, który wygrywa. Gdy wygrywa upstream, przed liczbą stoi jego nazwa.
Dane w tabeli
| Pomiar | upstream v1.5.0, BF16 (fast) | basal-rs, f16 | Jednostka |
|---|---|---|---|
| H100 80 GB | 56 | 85 | żądań/s (więcej = lepiej) |
| A100 80 GB | 24 | 41 | żądań/s (więcej = lepiej) |
| L40S | 18 | 36 | żądań/s (więcej = lepiej) |
| RTX 6000 Ada | 10 | 27 | żądań/s (więcej = lepiej) |
| RTX A6000 | 10 | 21 | żądań/s (więcej = lepiej) |
W 14 z 15 par karta i model basal-rs obsługuje 1,5–2,8 raza więcej żądań niż upstream. Wyjątek to basal-1.5-mini na H100, gdzie oba serwery są na podobnym poziomie (basal-rs ma 0,95 wyniku upstream).
Bez Pythona i PyTorcha
Wykres pokazuje, ile miejsca na dysku zajmuje wszystko, co trzeba zainstalować, żeby uruchomić serwer z modelami Basal na karcie NVIDIA. Nie wliczamy plików modelu ani sterownika karty. Upstream w każdym trybie działa jako basal-serve w Pythonie z bibliotekami torch i transformers, także wtedy, gdy obliczenia wykonuje Ollama albo llama.cpp.
Dane w tabeli
| Pomiar | upstream: basal-serve z silnikiem | basal-rs 0.1.6 | Jednostka |
|---|---|---|---|
| PyTorch (tryb fast) | 7,08 | 1,07 | GB (mniej = lepiej) |
| vLLM | 8,24 | 1,07 | GB (mniej = lepiej) |
| SGLang | 8,91 | 1,07 | GB (mniej = lepiej) |
| Ollama + basal-serve | 12,09 | 1,07 | GB (mniej = lepiej) |
| llama.cpp + basal-serve | 8,15 | 1,07 | GB (mniej = lepiej) |
basal-rs, 1,07 GB
Pliki programu: 47 MB. Reszta to biblioteki NVIDIA CUDA 12.9 (cudart, cuBLAS, cuBLASLt, cuRAND), razem 1,02 GB. Polecenie basal setup pobiera je tylko wtedy, gdy nie ma ich w systemie.
upstream z PyTorchem, 7,08 GB
Biblioteki NVIDIA instalowane jako pakiety Pythona: 4,5 GB, torch: 1,6 GB, triton: 0,67 GB. Do tego biblioteka transformers i serwer HTTP.
Upstream zainstalowany według instrukcji Basala v1.5.0 w czystym środowisku Pythona 3.12, bez wliczania samego Pythona (0,1 GB). Ollama 0.20.3 z oficjalnego instalatora. llama.cpp b11535 z oficjalnej paczki z CUDA 12.8: llama-server, jego biblioteki i cudart. Rozmiar plików na dysku zmierzony 9 października 2026.
Krótkie pytania i długie dokumenty naraz
Ruch podobny do prawdziwego: krótkie pytania przychodzą razem z dokumentami do 16 tys. Fragment tekstu, zwykle część słowa. Model czyta tekst jako ciąg tokenów.. p50 to typowy czas odpowiedzi, p95 czas, w którym mieści się 95% żądań. Wysokie p95 przy 32 klientach to długie dokumenty czekające w kolejce; krótkie pytania mają w serwerze osobną kolejkę i nie czekają za nimi.
| Karta | 32 klientów | p50 / p95 | Sekwencyjnie | p50 / p95 |
|---|---|---|---|---|
| H100 80 GB | 454 | 1,35 / 12,1 | 381 | 0,03 / 0,87 |
| A100 80 GB | 231 | 2,05 / 22,8 | 197 | 0,07 / 1,68 |
| L40S | 214 | 2,23 / 26,2 | 184 | 0,08 / 1,77 |
| RTX 6000 Ada | 166 | 3,03 / 35,6 | 145 | 0,12 / 2,22 |
| RTX A6000 | 121 | 3,55 / 46,5 | 105 | 0,13 / 3,18 |
basal-1.5-mini przyjmuje krótsze dokumenty, do ok. 4 tys. tokenów, więc w jego teście najdłuższe dokumenty są krótsze.
Im dłuższy dokument, tym większa różnica
Przy krótkich dokumentach, do ok. 2 tys. tokenów, upstream jest na H100 szybszy. Od ok. 4 tys. tokenów basal-rs jest szybszy 1,75–2,4 raza, a przy pięciu pytaniach o ten sam dokument 10–15 razy, bo dokument liczy się tylko raz.
Dane w tabeli
| Pomiar | upstream v1.5.0, BF16 (fast) | basal-rs, f16 | Jednostka |
|---|---|---|---|
| 512 tokenów | 23 | 31 | ms (mniej = lepiej) |
| 1 792 tokenów | 84 | 100 | ms (mniej = lepiej) |
| 4 096 tokenów | 487 | 267 | ms (mniej = lepiej) |
| 16 384 tokenów | 4200 | 1743 | ms (mniej = lepiej) |
| 16 384 tokenów, 5 pytań | 29,5 | 2 | s (mniej = lepiej) |
Czas całego żądania z jednym pytaniem; im dłuższy dokument, tym większa przewaga basal-rs. Przy kilku pytaniach o ten sam dokument liczy się on tylko raz: na RTX 6000 Ada dokument 16 tys. tokenów z pięcioma pytaniami zajmuje w upstream 112 s, a w basal-rs 5,3 s.
Modele Basal na MacBookach
Na Macach basal-rs liczy przez Interfejs Apple do obliczeń na układzie graficznym Maca.. Serwer autora modeli działa tam na Biblioteka Apple do uczenia maszynowego na komputerach Mac. w precyzji 16-bitowy format liczb o większym zakresie i mniejszej dokładności niż f16.. Przełącznik pokazuje dwa porównania: w tej samej precyzji f16 widać różnicę samych silników, a w bf16 różnicę, którą odczuje użytkownik upstream. Laptop mierzony na zasilaczu. Na baterii i po nagrzaniu czasy rosną.
Dane w tabeli
| Pomiar | upstream v1.5.0, MLX f16 | basal-rs, f16 | Jednostka |
|---|---|---|---|
| basal-1.5-max | 886 | 526 | ms (mniej = lepiej) |
| basal-1.5-4.5B | 372 | 235 | ms (mniej = lepiej) |
| basal-1.5-mini | 130 | 80 | ms (mniej = lepiej) |
Czasy z kilku przebiegów: dla upstream pokazujemy najlepszy wynik, dla basal-rs najsłabszy. Na M2 Max basal-rs liczy 1,9–2,0 raza więcej decyzji na sekundę niż upstream w f16.
Te same decyzje co w pełnej precyzji
900 pytań z dziewięciu publicznych zbiorów, po 100 z każdego. Decyzje porównujemy z obliczeniami w pełnej precyzji FP32. Jedyne różnice basal-rs w f16 to pytania, przy których nawet FP32 daje prawie remis, np. 0,503 wobec 0,497.
| Wariant | Decyzje jak FP32 | Maks. różnica Surowy wynik modelu dla opcji, z którego powstaje jej prawdopodobieństwo. | Maks. Całkowite wahanie (total variation): połowa sumy bezwzględnych różnic prawdopodobieństw wszystkich opcji. 0 znaczy, że rozkłady są identyczne. rozkładu |
|---|---|---|---|
| basal-rs f16 (domyślnie) | 900/900 | 0,114 | 0,0092 |
| basal-rs f32 | 900/900 | 0,0003 | 0,00001 |
| upstream BF16 (fast) | 896/900 | 1,210 | 0,052 |
Zbiory pytań
- polemo2-in (KLEJ)
- allegro-reviews (KLEJ)
- cdsc-e (KLEJ)
- dyk (KLEJ)
- cbd (KLEJ)
- ag-news
- emotion
- boolq
- sst5
Pytania z dziesiątkami opcji
Modele Basal wybierają spośród najwyżej 10 opcji. Gdy opcji jest więcej, basal-rs dzieli je na grupy, wybiera najlepsze z każdej i rozstrzyga je w rundzie finałowej. Serwer autora modeli tego nie robi, więc trafność porównujemy z API TypeSafe na zbiorach pytań z poprawnymi odpowiedziami.
Dane w tabeli
| Pomiar | TypeSafe jev-1.13.0 | basal-1.5-max w basal-rs | Jednostka |
|---|---|---|---|
| banking77 (77 opcji, EN) | 159 | 156 | trafnych (więcej = lepiej) |
| clinc150 (150 opcji, EN) | 185 | 182 | trafnych (więcej = lepiej) |
| massive-pl (59 opcji, PL) | 159 | 157 | trafnych (więcej = lepiej) |
Jedno pytanie z kilkudziesięcioma opcjami to dla basal-rs 14–32 mniejsze zapytania do modelu. Pomiar na RTX 6000 Ada z limitem mocy 200 W.
250 W czy 300 W
Mierzymy basal-rs z modelem basal-1.5-max na karcie RTX 6000 Ada, której fabryczny limit mocy to 300 W. Przy limicie obniżonym do 250 W serwer obsługuje ok. 20% mniej żądań, a energia na decyzję zostaje taka sama.
| Pomiar | 250 W | 300 W (domyślnie) |
|---|---|---|
| Serwer HTTP, 1 klient | 13,9 żądania/s, p50 72 ms | 17,3 żądania/s, p50 56 ms |
| Serwer HTTP, 32 klientów | 21,8 żądania/s | 26,3 żądania/s |
| Energia na decyzję, 32 klientów | 11,5 J | 11,4 J |
| Ruch mieszany, 32 klientów | 134 żądania/min | 161 żądań/min |
| Dokument 16 tys. tokenów, 5 pytań | 5,9 s | 5,3 s |
Sprawdź zgodność u siebie
Wystarczy zainstalowany basal-rs (polecenie basal) i kopia repozytorium basal-rs. W repozytorium są wyniki obliczeń upstream w pełnej precyzji FP32 dla trzech modeli. Polecenia zapisujące wyniki odmawiają zapisu, jeśli pod wskazaną ścieżką coś już istnieje.
# wyniki upstream w pełnej precyzji FP32 są w repozytorium
git clone https://github.com/itsoltech/basal-rs && cd basal-rs
# sprawdza zapytania do modelu co do tokenu, bez GPU; model pobiera się do cache Hugging Face
basal check-prompts --model 4.5B --reference reports/reference-basal-1.5-4.5B-fp32
# te same pytania policzone przez basal-rs, zapisane w tym samym formacie
basal export --model 4.5B --inputs reports/reference-basal-1.5-4.5B-fp32 --out export-f16
# porównuje tokeny i decyzje, liczy różnice logitów i prawdopodobieństw
basal compare --a reports/reference-basal-1.5-4.5B-fp32 --b export-f16 --out compare.json