vLLM czy TensorRT-LLM: który silnik do on-prem LLM

Fryderyk Pryjma·opublikowano 3 września 2026·aktualizacja 3 września 2026·8 min · 1621 słów
[architektura]vLLMTensorRT-LLMSGLanginference
vLLM czy TensorRT-LLM: który silnik do on-prem LLM

Dlaczego wybór silnika to osobna decyzja od wyboru GPU

Kiedy firma policzy już ile GPU potrzebuje pod Llamę 70B, zwykle uznaje, że najtrudniejsza decyzja techniczna jest za nią. Nie jest. Ten sam serwer 2x H100 potrafi obsłużyć dwukrotnie różną liczbę użytkowników zależnie od tego, jaki silnik serwujący na nim postawimy i jak go skonfigurujemy. Sprzęt wyznacza sufit. Silnik decyduje, jak blisko tego sufitu realnie zajedziesz.

W praktyce dla on-prem LLM w średniej produkcji wybór sprowadza się do dwóch nazw: vLLM i TensorRT-LLM. Trzecia, SGLang, dochodzi tam, gdzie liczy się współdzielony kontekst (RAG, długie system prompty). Ten post porównuje je liczbami i kończy tabelą decyzyjną: który silnik do jakiego scenariusza. Bez tezy, że jeden jest zawsze lepszy, bo nie jest.

Co właściwie robią te silniki

Silnik serwujący (inference server) siedzi między modelem a użytkownikiem i odpowiada za trzy rzeczy: ładowanie wag do VRAM, zarządzanie kolejką requestów (batching) i zwracanie tokenów. Różnice między silnikami leżą głównie w tym, jak sprytnie robią batching i jak agresywnie optymalizują pod konkretny sprzęt.

vLLM to projekt open source o najszerszym wsparciu modeli i najprostszym wdrożeniu. Jego znakiem firmowym jest PagedAttention, czyli zarządzanie KV cache jak stronami pamięci w systemie operacyjnym. Model uruchamiasz jedną komendą, bez kroku kompilacji. Aktualizacja modelu to podmiana wag.

TensorRT-LLM to biblioteka NVIDIA, która kompiluje model do zoptymalizowanego silnika pod konkretną architekturę GPU (Hopper, Blackwell), konkretną precyzję i konkretny zakres batch size. Ta kompilacja to osobny krok, który trwa, ale w zamian daje najwyższy throughput, jaki karta jest w stanie wyprodukować.

SGLang to silnik z agresywnym prefix caching. Kiedy wiele requestów dzieli ten sam początek (ten sam długi system prompt, ten sam dokument w kontekście RAG), SGLang liczy tę wspólną część raz i reużywa. W czystym on-prem RAG to bywa decydujące.

Liczby: throughput i TTFT na H100

Poniższe wartości pochodzą z niezależnego benchmarku SqueezeBits na jednej karcie H100 SXM5 80GB, model Llama 3.3 70B Instruct w FP8, wersje vLLM 0.18, TensorRT-LLM 1.2 i SGLang 0.5.9. Metodyka: prompty ~512 tokenów wejścia, 256 tokenów wyjścia, pomiar przy rosnącej współbieżności.

Zagregowany throughput (tokeny wyjścia na sekundę), im więcej tym lepiej:

WspółbieżnośćvLLMTensorRT-LLMSGLang
1 request120 tok/s130 tok/s125 tok/s
10 requestów650 tok/s710 tok/s680 tok/s
50 requestów1 850 tok/s2 100 tok/s1 920 tok/s
100 requestów2 400 tok/s2 780 tok/s2 460 tok/s

Time to first token, mediana (p50) i p95, im mniej tym lepiej:

WspółbieżnośćvLLM p50vLLM p95TRT-LLM p50TRT-LLM p95SGLang p50SGLang p95
1 request45 ms68 ms38 ms55 ms42 ms61 ms
10 requestów120 ms195 ms105 ms170 ms112 ms178 ms
50 requestów380 ms720 ms340 ms620 ms360 ms680 ms
100 requestów740 ms1 450 ms680 ms1 280 ms710 ms1 380 ms

Wzór jest czytelny: TensorRT-LLM prowadzi na każdym poziomie współbieżności, gdy silnik jest już skompilowany. Przewaga jest najmniejsza przy pojedynczym requeście (~8% nad vLLM) i największa przy 50 równoległych (~13%). Na TTFT ten sam kierunek: TRT-LLM ma niższe opóźnienie, a różnica rośnie w ogonie p95, czyli tam, gdzie użytkownik najbardziej odczuwa zacinanie.

Warto jednak znać drugą stronę. Starszy benchmark SqueezeBits na A100 (Llama 3 8B) pokazał, że przy bardzo ostrym limicie latencji i wymuszonym małym batchu (batch 4) to vLLM wychodził szybciej, 230 tok/s wobec 197 tok/s dla TRT-LLM. Innymi słowy: przewaga TensorRT-LLM materializuje się pod obciążeniem i batchingiem, a nie przy pojedynczych, latency-krytycznych requestach na małym modelu.

Co te liczby znaczą operacyjnie

Kilkanaście procent throughputu brzmi jak detal, dopóki nie przeliczysz go na użytkowników. Jeśli serwer w vLLM obsługuje 30 jednoczesnych sesji przy Twoim SLO, te same ~13% przewagi to realnie 3 do 4 dodatkowych sesji z tego samego sprzętu. Przy dwóch serwerach to jeden użytkownik więcej niż zerowy ROI z całej trzeciej karty, której nie musisz kupować.

Ale jest warunek: ta przewaga jest darmowa tylko wtedy, gdy model jest stabilny. Każda zmiana modelu, precyzji albo docelowego zakresu batch size w TensorRT-LLM oznacza ponowną kompilację silnika. vLLM tego kroku nie ma. Dlatego liczby z tabeli to nie cała historia. Druga połowa to koszt utrzymania.

Cold start i koszt utrzymania

To jest miejsce, w którym większość porównań się urywa, a decyzja on-prem naprawdę się rozstrzyga.

SilnikZimny start (pierwszy raz)Kolejne przeładowaniaKrok kompilacji
vLLM~62 s~62 sbrak
TensorRT-LLM~28 min (kompilacja)~90 stak, per wersja modelu
SGLang~58 s~58 sbrak

28 minut kompilacji TensorRT-LLM to nie błąd, to świadomy kompromis: budujesz silnik raz na wersję modelu, a potem serwujesz go miesiącami. Problem pojawia się, gdy Twój zespół często zmienia modele, testuje warianty kwantyzacji albo aktualizuje wersje co dwa tygodnie. Wtedy 28 minut per iteracja plus konieczność wersjonowania artefaktów silnika zamienia się w realny narzut DevOps, którego vLLM po prostu nie ma.

Zużycie VRAM jest praktycznie takie samo we wszystkich trzech silnikach (71 do 79 GB na H100 80GB przy tym modelu w FP8), więc pamięć nie jest tu kryterium wyboru. Kryterium jest to, ile masz rąk do utrzymania i jak stabilny jest Twój model.

H200 i długi kontekst: kiedy pamięć zmienia rachunek

Powyższe liczby to jedna karta H100. Przy wyborze między H100 a H200 dochodzi zmienna, która nie widać w tabeli throughputu z krótkimi promptami: pojemność i przepustowość pamięci. H200 ma 141 GB VRAM wobec 80 GB w H100, co przy długim kontekście RAG (15k do 30k tokenów wejścia, typowe dla dokumentacji technicznej) pozwala utrzymać większy KV cache i wyższy batch, zanim pamięć stanie się wąskim gardłem.

Tu wybór silnika zaczyna się przenikać z wyborem sprzętu. Na długim, współdzielonym kontekście SGLang z prefix cachingiem potrafi zniwelować przewagę throughputu TensorRT-LLM, bo nie liczy tego samego prefiksu raz na request. Reguła praktyczna: im bardziej Twoje prompty są unikalne, tym bardziej liczy się surowy throughput (TRT-LLM); im więcej dzielą wspólnego kontekstu, tym bardziej opłaca się prefix caching (SGLang).

Tabela decyzyjna: który silnik do jakiego on-prem

Scenariusz on-premRekomendacjaDlaczego
Jeden stabilny model, maksymalny throughput pod obciążeniemTensorRT-LLMNajwyższe tok/s i najniższy TTFT, kompilację robisz raz
Częsta zmiana modeli, mały zespół IT, szybka iteracjavLLMZero kompilacji, najszersze wsparcie modeli, najprostszy deploy
RAG ze wspólnym system promptem lub długim kontekstemSGLangPrefix caching reużywa wspólną część, niższa latencja
Pierwsze wdrożenie, jeszcze nie wiesz co serwujeszvLLMBezpieczny default, zejdziesz z niego gdy model się ustabilizuje
Latencja pojedynczego requestu krytyczna, mały modelvLLM lub TRT-LLMPrzy wymuszonym małym batchu różnice się zacierają, testuj oba

Rekomendacja domyślna

Dla większości średnich firm wchodzących w on-prem AI rozsądny start to vLLM: zero kompilacji, najszersze wsparcie modeli i najmniejszy narzut na zespół, który dopiero uczy się operować własnym LLM. Kiedy model się ustabilizuje, a ruch urośnie na tyle, że kilkanaście procent throughputu zaczyna przekładać się na oszczędność jednej karty, migracja na TensorRT-LLM staje się policzalna. Jeśli od początku wiesz, że Twój główny workload to RAG na wspólnej bazie dokumentów, SGLang wart jest testu równolegle do vLLM już na starcie.

Najgorsza decyzja to wybór silnika pod benchmark z bloga producenta zamiast pod własny profil ruchu. Zmierz swój realny rozkład długości promptów, współbieżności i częstotliwości zmian modelu, a dopiero potem czytaj tabele. Liczby wyżej są punktem startu do rozmowy, nie werdyktem.

// co tu nie pokrywamCzego tu nie pokrywam

  • Multi-node i tensor parallelism ponad jeden serwer. Wszystkie liczby wyżej to pojedyncza karta lub jeden node. Skalowanie na 8+ GPU ma własne wąskie gardła (interconnect, pipeline parallelism) i zasługuje na osobny post.
  • Dokładny tuning kernel flag i wersji CUDA. Wahania ±10 do 15% między wersjami silnika i driverów są normalne. Traktuj tabele jako rząd wielkości, nie jako gwarancję.
  • Alternatywy non-NVIDIA (AMD MI300X, Intel Gaudi). Wsparcie w tych silnikach dojrzewa, ale dla mieszanego inference w produkcji średniej firmy wciąż jest niedojrzałe.
  • Jakość modelu. Silnik nie zmienia tego, co model potrafi, tylko jak szybko to podaje. Wybór modelu i kwantyzacji to osobna rozmowa.

// disclosure i biasesDisclosure i biases

Pracuję nad on-prem AI platformą (CortexMine) dla europejskich producentów. Liczby w tym poście pochodzą z publicznego benchmarku SqueezeBits i publicznych wytycznych doboru silników, nie z naszych wewnętrznych testów. Tam, gdzie źródła się różniły (A100 kontra H100, mały kontra duży model), zaznaczyłem to w tekście, bo wnioski nie są uniwersalne.

Stronniczość, której jestem świadom: piszę z perspektywy „on-prem jest realnym wyborem", więc naturalnie skupiam się na kryteriach utrzymania i kontroli, a nie tylko na surowym throughpucie. Firma, która serwuje jeden model przez rok bez zmian, ma inny rachunek niż zespół iterujący co dwa tygodnie, i staram się to rozdzielać.

Powiązane notatki

FP
// autor
Fryderyk Pryjma

Buduje CortexMine, on-prem AI platform dla europejskich producentów objętych NIS2. Tam, gdzie ta stronniczość mogłaby zaważyć na wnioskach, oznacza to inline.

Chcesz przełożyć to na swój przypadek: architekturę, zgodność i koszt?

→ Umów 30 min
// powiązane notatki
Ile kosztuje milion tokenów on-prem: H100 vs H200 vs API

Peak throughput z benchmarku nie mówi, ile kosztuje milion tokenów. Rachunek to stawka za godzinę karty podzielona przez tokeny na godzinę i przez obłożenie. Liczymy koszt per milion tokenów na H100 i H200, zestawiamy z ceną API i pokazujemy próg obłożenia, powyżej którego on-prem wygrywa.