Latenz von sechs LLM-APIs über sieben Tage, gemessen mit llmprobe

60.480 Probes an GPT-4o-mini, Claude 3.5 Haiku, Gemini 2.0 Flash, Llama 3.3 70B, DeepSeek Chat und Mistral Small über OpenRouter. Time to First Token, Gesamtlatenz, Durchsatz und Fehler, clientseitig einmal pro Minute gemessen.

llmprobe ist ein Open-Source-Go-CLI, das ich geschrieben habe. Es schickt Streaming-Anfragen an LLM-Endpoints und misst Time to First Token (TTFT), Gesamtlatenz und Generierungsdurchsatz. Es verwendet einfaches HTTP und einen eigenen SSE-Parser statt der SDKs der Anbieter.

Ich habe es sieben Tage lang gegen sechs Modelle über OpenRouter laufen lassen.

llmprobe TUI

Setup

Alle 60 Sekunden hat llmprobe den Prompt "Hello" mit einem Limit von 20 Ausgabe-Tokens an jedes Modell geschickt. Der kurze Prompt und das Ausgabelimit halten die Generierungszeit klein, sodass die Zahlen vor allem beschreiben, wie lange es bis zum Beginn der Antwort dauert.

Modelle: GPT-4o-mini, Claude 3.5 Haiku, Gemini 2.0 Flash, Llama 3.3 70B, DeepSeek Chat, Mistral Small.

Probes insgesamt: 60.480 (etwa 10.080 pro Modell).

Alle Anfragen liefen über OpenRouter. Die Zahlen enthalten daher den Proxy-Overhead von OpenRouter und beschreiben diesen Weg in dieser Woche. Sie sind keine Messungen der nativen APIs der Anbieter.

Ergebnisse

ModellTTFT p50TTFT p95LatenzTok/sFehler
GPT-4o-mini645ms1.094ms776ms105,30
Claude 3.5 Haiku731ms1.106ms1.073ms58,10
Gemini 2.0 Flash556ms2.313ms853ms136,80
Llama 3.3 70B761ms2.221ms1.141ms48,32
DeepSeek Chat1.068ms3.017ms1.656ms26,04
Mistral Small2.735ms10.852ms3.886ms191,63

Median und p95 der TTFT

TTFT-Vergleich

Gemini 2.0 Flash hatte den niedrigsten Median-TTFT (556ms). Der p95 lag bei 2.313ms, etwa beim 4-Fachen des Medians. Bei GPT-4o-mini und Claude 3.5 Haiku lag der p95 unter dem 1,7-Fachen des Medians.

Mistral Small hatte einen Median-TTFT von 2.735ms und einen p95 von 10.852ms. Etwa 5% der Anfragen brauchten also mehr als 10 Sekunden bis zum ersten Token. Der stündliche Median lag fast die ganze Woche über dem der anderen Modelle (siehe Zeitverlauf unten).

TTFT und Generierungsdurchsatz

Latenz-Aufschlüsselung

Mistral Small hatte den höchsten TTFT und zugleich den höchsten gemessenen Durchsatz, 191,6 Tok/s. Gemini 2.0 Flash folgte mit 136,8 Tok/s. DeepSeek Chat hatte einen hohen TTFT (1.068ms) und den niedrigsten Durchsatz (26,0 Tok/s).

Der Durchsatz wird aus den Tokens nach dem ersten Token und der Zeit zwischen erstem Token und Ende des Streams berechnet. Bei einem Ausgabelimit von 20 Tokens ist dieses Intervall kurz, die Durchsatzwerte sind daher nur ein grobes Maß.

Durchsatz

Verteilung der TTFT

TTFT-Verteilung

GPT-4o-mini und Claude 3.5 Haiku hatten die engsten TTFT-Verteilungen. Bei beiden lag der p95 unter 2 Sekunden, ein TTFT-Timeout von 2 Sekunden wäre also von weniger als 5% der Anfragen überschritten worden. Gemini 2.0 Flash und Llama 3.3 70B hatten längere Tails. Mistral Small hatte die breiteste Verteilung.

TTFT über die sieben Tage

TTFT-Zeitverlauf

Der Zeitverlauf zeigt den stündlichen Median-TTFT pro Modell.

  • Mistral Small schwankte die ganze Woche über stark, mit Spitzen nahe 5.000ms.
  • DeepSeek Chat hatte mehrere Zeitfenster mit höherer Latenz. Die Ursache geht aus den Daten nicht hervor.
  • GPT-4o-mini und Claude 3.5 Haiku schwankten über die Woche nur wenig.

llmprobe als CI-Prüfung

llmprobe kann in einer Deploy-Pipeline laufen und den Job fehlschlagen lassen, wenn ein Endpoint seine konfigurierten Schwellenwerte nicht einhält.

# .github/workflows/deploy.yml
- name: LLM-Provider prüfen
  env:
    OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
  run: |
    go install github.com/Jwrede/llmprobe@latest
    llmprobe probe --fail-on degraded

Mit --fail-on degraded beendet sich llmprobe mit Exit-Code 1, wenn eine Anfrage fehlschlägt oder ein Endpoint einen seiner Schwellenwerte überschreitet, und der Workflow-Schritt schlägt fehl.

Schwellenwerte werden pro Modell in probes.yml gesetzt:

providers:
  - name: openai
    api_key: ${OPENAI_API_KEY}
    models:
      - name: gpt-4o-mini
        thresholds:
          max_ttft: 2s
          max_latency: 5s
          min_tokens_per_sec: 50

Die folgenden Beispiel-Schwellenwerte für TTFT liegen über den p95-Werten dieser Woche. Sie beruhen auf diesem Weg und Zeitraum und sollten mit eigenen Messungen überprüft werden.

ModellBeispiel max_ttftGrundlage
GPT-4o-mini1,5sp95 1.094ms
Claude 3.5 Haiku1,5sp95 1.106ms
Gemini 2.0 Flash3sp95 2.313ms
Llama 3.3 70B3sp95 2.221ms
DeepSeek Chat5sp95 3.017ms
Mistral Small15sp95 10.852ms

Unterstützte Anbieter

llmprobe unterstützt OpenAI, Anthropic, Google, Azure, AWS Bedrock und jeden OpenAI-kompatiblen Endpoint (Groq, Together, Fireworks, DeepSeek, Mistral, OpenRouter, Ollama, vLLM). Jeder Provider-Client ist ein kleiner HTTP-Wrapper mit SSE-Parsing. Der Bedrock-Client implementiert SigV4-Signierung und das Parsen des AWS Binary Event Stream ohne SDK.

go install github.com/Jwrede/llmprobe@latest
llmprobe watch --tui --interval 60s

GitHub: github.com/Jwrede/llmprobe

Nachtrag: stündlicher Benchmark

Nach diesem Beitrag habe ich einen kontinuierlichen Benchmark auf Basis von llmprobe aufgesetzt. Er misst jede Stunde 15 Modelle von OpenAI, Anthropic, Google, DeepSeek und xAI. Die Modellliste wird täglich anhand der wöchentlichen Popularitäts-Rankings von OpenRouter aktualisiert.

Das Dashboard ist unter bench.jonathanwrede.de erreichbar, die Rohdaten werden als JSONL unter github.com/Jwrede/llm-bench-data veröffentlicht.

Infrastruktur-Code: github.com/Jwrede/llm-bench