Benchmarks
Hvordan Wäg-gatewayen klarer sig mod LiteLLM under identiske forhold. Denne side redegør for metoden i sin helhed og offentliggør de målinger, den gav. Vi offentliggør ikke multiplikatorer.
Sådan blev der målt
Alt kørte i Docker på én maskine, med hver komponent bundet til egne kerner, så intet konkurrerede om CPU.
- Begge gateways står foran den samme upstream med identisk modelkonfiguration, så ingen af dem får den lettere vej.
- Hver gateway kører, som dens egen dokumentation anbefaler: LiteLLM efter sin produktionsvejledning med lige så mange workers som vCPU'er, Wäg med de leverede standardindstillinger. Svarcache er slået fra i begge.
- Test i lukket sløjfe måler maksimal gennemstrømning. Test i åben sløjfe sender efter en fast plan og tæller latensen fra det tiltænkte afsendelsestidspunkt, så en gateway der sætter i kø, ikke kan skjule det.
- Hvert svar valideres: status, kroppens opbygning og for streams det forventede antal dele og afslutningen. Alt andet tæller som fejl, aldrig som et hurtigt svar.
- Hvert scenarie køres tre gange, og tabellerne viser medianen. Uden gateway i vejen når den samme belastning omkring 90.000 forespørgsler/s, langt over begge gateways, så resultaterne begrænses af gatewayen og ikke af riggen.
Fodaftryk
Hvad hver gateway koster, før den betjener noget som helst: hukommelse i hvile, opstartstid, billedstørrelse og den latens, den lægger til en enkelt forespørgsel mod en upstream der svarer med det samme.
Hvad det betyder: Hukommelsen afgør, hvor mange replikaer der er plads til på en node, og billedstørrelsen, hvor hurtig en udrulning er. Med 3,8 MB i hukommelsen og et billede på 123 MB er der plads til Wäg i en sidecar, og den er klar, før et health check løber ud; 2,3 GB og 11 sekunder er en pod, man planlægger omkring.
Den tilføjede latens er gatewayens p50 minus den p50, der måles uden gateway i vejen.
Med en realistisk upstream
En rigtig model svarer på hundredvis af millisekunder, så tusindvis af forespørgsler er undervejs samtidig. Her tager upstreamen 300 ms, og forespørgsler ankommer i fast takt, uanset hvad gatewayen gør. Ved 2.000 forespørgsler/s er omkring 600 i gang på ethvert tidspunkt.
| forespørgsler pr. sekund | Wäg p50 | Wäg p99 | Wäg Fejl | Wäg CPU | LiteLLM p50 | LiteLLM p99 | LiteLLM Fejl | LiteLLM CPU | × |
|---|---|---|---|---|---|---|---|---|---|
| 100 | 303 ms | 305 ms | 0,00% | 10,2% | 305 ms | 308 ms | 0,00% | 38,7% | 1,0× |
| 500 | 301 ms | 303 ms | 0,00% | 15,6% | 304 ms | 321 ms | 0,00% | 140,5% | 1,1× |
| 1.000 | 301 ms | 302 ms | 0,00% | 20,2% | 317 ms | 605 ms | 0,00% | 263,7% | 2,0× |
| 2.000 | 301 ms | 302 ms | 0,00% | 31,7% | 3,26 s | 28 s | 7,99% | 391,9% | 92× |
Hvad det betyder: Sådan ser rigtig trafik ud: en model svarer på hundredvis af millisekunder, og tusindvis af forespørgsler er undervejs. En gateway, der sætter i kø, gør et svar på 300 ms til flere sekunder, og ingen opdager det før spidsbelastningen. Wäg bliver på gulvet op til 2.000 forespørgsler/s med under en tredjedel af sit CPU-budget. LiteLLM sætter allerede i kø ved 1.000 og fejler 8 % af forespørgslerne ved 2.000.
Upstreamen alene tager 300 ms, så 300 ms er gulvet. Alt derover er tid brugt i kø inde i gatewayen. Kolonnen × læses altid ens: højere betyder, at Wäg er foran. Den er Wäg ÷ LiteLLM for gennemstrømning og LiteLLM ÷ Wäg for latens.
Gennemstrømning og latens
Lukket sløjfe mod en upstream der svarer med det samme: rene gatewayomkostninger, uden modellatens at gemme sig bag. Det er tallene, en kapacitetsplan har brug for. De er ikke grunden til at vælge en control plane.
4 vCPU, uden database
| Samtidige klienter | Wäg req/s | Wäg p99 | Wäg CPU | LiteLLM req/s | LiteLLM p99 | LiteLLM CPU | × |
|---|---|---|---|---|---|---|---|
| 1 | 6.232 | 0,27 ms | 63,4% | 463 | 3,2 ms | 98,1% | 13× |
| 8 | 25.711 | 0,70 ms | 311,5% | 1.237 | 15 ms | 286,1% | 21× |
| 32 | 25.093 | 2,6 ms | 321,8% | 1.621 | 46 ms | 385,1% | 15× |
| 128 | 23.639 | 11 ms | 328,3% | 1.669 | 111 ms | 396,2% | 14× |
| 512 | 22.407 | 45 ms | 336,9% | 1.569 | 749 ms | 391,6% | 14× |
1 vCPU, uden database
| Samtidige klienter | Wäg req/s | Wäg p99 | LiteLLM req/s | LiteLLM p99 | × |
|---|---|---|---|---|---|
| 1 | 6.589 | 0,35 ms | 459 | 3,2 ms | 14× |
| 8 | 16.594 | 1,3 ms | 484 | 26 ms | 34× |
| 32 | 15.226 | 3,8 ms | 506 | 85 ms | 30× |
| 128 | 13.264 | 15 ms | 505 | 438 ms | 26× |
Hvad det betyder: Det afgør, hvor mange replikaer et trafikniveau kræver, og dermed hvad gatewayen koster at drive. For Kubernetes er tabellen med 1 vCPU den relevante: det er effektiviteten pr. kerne, som en pod reelt får.
Streaming, payloads, embeddings, failover
4 vCPU, uden database. Streams er 50 tokens med 5 ms mellemrum; udholdenhedstesten sender 200 streams i sekundet med svar på cirka 1,2 sekunder i tre minutter.
| Scenarie | Wäg | Wäg p99 | Wäg Fejl | LiteLLM | LiteLLM p99 | LiteLLM Fejl | × |
|---|---|---|---|---|---|---|---|
| Streaming, 64 clients | 233 | 286 ms | 0,00% | 179 | 674 ms | 0,00% | 1,3× |
| Streaming, 256 clients | 911 | 288 ms | 0,00% | 307 | 1,09 s | 0,00% | 3,0× |
| 64 KB conversation history, 32 clients | 3.583 | 29 ms | 0,00% | 568 | 106 ms | 0,00% | 6,3× |
| Embeddings (1,536 dims), 32 clients | 13.558 | 4,3 ms | 0,00% | 740 | 69 ms | 0,00% | 18× |
| Fallback after upstream 500, 16 clients | 19.816 | 1,8 ms | 0,00% | 584 | 62 ms | 0,00% | 34× |
| Soak: 200 streams/s for 3 minutes | 200 | 1,27 s | 0,00% | 176 | 20 s | 12,09% | 1,1× |
Hvad det betyder: Streaming, lange prompts, embeddings og failover er der, hvor en produktionsbelastning bruger tiden. Læs fejlkolonnerne før gennemstrømningskolonnerne: en fejlet forespørgsel er en fejlet brugerforespørgsel, ikke en langsom.
Tallet for 64 KB-payloads ligger ved riggens loft: uden gateway i vejen når den samme belastning 3.711 forespørgsler/s med 64 KB-kroppe på én kerne, så Wäg-tallet er dér en nedre grænse og ikke et maksimum.
Hvad dette ikke viser
Enhver benchmark beskriver én opstilling. Dette er grænserne for denne.
- Absolutte tal afhænger af værten. Begge gateways kørte på den samme maskine med bundne kerner, så sammenligningen mellem dem holder, men forvent andre absolutte tal på jeres egen hardware.
- Testriggen bag disse kørsler er ikke offentliggjort, så I kan ikke gentage dem kommando for kommando. Metoden ovenfor er beskrevet detaljeret nok til at bygge en tilsvarende opsætning.
- LiteLLM udgiver næsten hver uge. Tallene er målt mod v1.104.2, den aktuelle stabile udgave. Når en udgivelse ændrer videresendelsesvejen, måler vi igen og offentliggør, hvad vi finder.
- LiteLLM blev konfigureret ud fra sin produktionsvejledning, ikke af dens vedligeholdere. Der findes måske en bedre konfiguration; finder I en, måler vi igen og offentliggør på ny.
- Begge gateways kørte på én maskine med bundne kerner. Intet her måler adfærd over et netværk, under Kubernetes-scheduling eller med støjende naboer.