Zum Hauptinhalt springen

LiteLLM Proxy - 1K RPS Lasttest mit Locust

Tutorial, wie Sie mit LiteLLM Proxy auf Locust 1K+ RPS erreichen

Checkliste vor dem Testen

Verwenden Sie diese Konfiguration für Tests

Hinweis: Wir migrieren derzeit zu aiohttp, das einen 10x höheren Durchsatz hat. Wir empfehlen die Verwendung des aiohttp_openai/ Providers für Lasttests.

model_list:
- model_name: "fake-openai-endpoint"
litellm_params:
model: aiohttp_openai/any
api_base: https://your-fake-openai-endpoint.com/chat/completions
api_key: "test"

Lasttest - Fake OpenAI Endpunkt

Erwartete Leistung

MetrikWert
Anfragen pro Sekunde1174+
Mittlere Antwortzeit96ms
Durchschnittliche Antwortzeit142,18ms

Test ausführen

  1. Fügen Sie fake-openai-endpoint zu Ihrer proxy_config.yaml hinzu und starten Sie Ihren litellm proxy. litellm bietet einen gehosteten fake-openai-endpoint, den Sie gegenlasttesten können
model_list:
- model_name: fake-openai-endpoint
litellm_params:
model: aiohttp_openai/fake
api_key: fake-key
api_base: https://exampleopenaiendpoint-production.up.railway.app/

litellm_settings:
callbacks: ["prometheus"] # Enterprise LiteLLM Only - use prometheus to get metrics on your load test
  1. pip install locust

  2. Erstellen Sie eine Datei namens locustfile.py auf Ihrem lokalen Rechner. Kopieren Sie den Inhalt aus dem litellm Lasttest, der sich hier befindet

  3. Starten Sie Locust. Führen Sie locust im selben Verzeichnis wie Ihre locustfile.py aus Schritt 2 aus

    locust -f locustfile.py --processes 4
  4. Lasttest auf Locust ausführen

    Rufen Sie die Locust-Benutzeroberfläche unter http://0.0.0.0:8089 auf

    Stellen Sie Benutzer=1000, Hochfahren der Benutzer=1000, Host=Basis-URL Ihres LiteLLM Proxys ein

  5. Erwartete Ergebnisse

Lasttest - Endpunkte mit Ratenbegrenzungen

Führen Sie einen Lasttest auf 2 LLM-Bereitstellungen mit jeweils 10K RPM Kontingent durch. Erwarten Sie ~20K RPM

Erwartete Leistung

  • Wir erwarten, dass in 1 Minute 20.000+ erfolgreiche Antworten angezeigt werden
  • Die restlichen Anfragen schlagen fehl, da der Endpunkt sein 10K RPM Kontingentlimit überschreitet - vom LLM API-Anbieter
MetrikWert
Erfolgreiche Antworten in 1 Minute20,000+
Anfragen pro Sekunde~1170+
Mittlere Antwortzeit70ms
Durchschnittliche Antwortzeit640,18ms

Test ausführen

  1. Fügen Sie 2 gemini-vision Bereitstellungen zu Ihrer config.yaml hinzu. Jede Bereitstellung kann 10K RPM verarbeiten. (Wir richten unten einen Fake-Endpunkt mit einer Ratenbegrenzung von 1000 RPM auf der Route /v1/projects/bad-adroit-crow ein)
Info

Alle Anfragen mit model="gemini-vision" werden gleichmäßig auf die 2 Bereitstellungen verteilt.

model_list:
- model_name: gemini-vision
litellm_params:
model: vertex_ai/gemini-1.0-pro-vision-001
api_base: https://exampleopenaiendpoint-production.up.railway.app/v1/projects/bad-adroit-crow-413218/locations/us-central1/publishers/google/models/gemini-1.0-pro-vision-001
vertex_project: "adroit-crow-413218"
vertex_location: "us-central1"
vertex_credentials: /etc/secrets/adroit_crow.json
- model_name: gemini-vision
litellm_params:
model: vertex_ai/gemini-1.0-pro-vision-001
api_base: https://exampleopenaiendpoint-production-c715.up.railway.app/v1/projects/bad-adroit-crow-413218/locations/us-central1/publishers/google/models/gemini-1.0-pro-vision-001
vertex_project: "adroit-crow-413218"
vertex_location: "us-central1"
vertex_credentials: /etc/secrets/adroit_crow.json

litellm_settings:
callbacks: ["prometheus"] # Enterprise LiteLLM Only - use prometheus to get metrics on your load test
  1. pip install locust

  2. Erstellen Sie eine Datei namens locustfile.py auf Ihrem lokalen Rechner. Kopieren Sie den Inhalt aus dem litellm Lasttest, der sich hier befindet

  3. Starten Sie Locust. Führen Sie locust im selben Verzeichnis wie Ihre locustfile.py aus Schritt 2 aus

    locust -f locustfile.py --processes 4 -t 60
  4. Lasttest auf Locust ausführen

    Rufen Sie die Locust-Benutzeroberfläche unter http://0.0.0.0:8089 auf und verwenden Sie die folgenden Einstellungen

  5. Erwartete Ergebnisse

    • Erfolgreiche Antworten pro Minute = 19.800 = (69415 - 49615)
    • Anfragen pro Sekunde = 1170
    • Mittlere Antwortzeit = 70ms
    • Durchschnittliche Antwortzeit = 640ms

Prometheus-Metriken zum Debuggen von Lasttests

Verwenden Sie die folgenden Prometheus-Metriken zum Debuggen Ihrer Lasttests / Fehler

MetriknameBeschreibung
litellm_deployment_failure_responsesGesamtzahl der fehlgeschlagenen LLM-API-Aufrufe für eine bestimmte LLM-Bereitstellung. Labels: "requested_model", "litellm_model_name", "model_id", "api_base", "api_provider", "hashed_api_key", "api_key_alias", "team", "team_alias", "exception_status", "exception_class"
litellm_deployment_cooled_downAnzahl der Male, die eine Bereitstellung von der LiteLLM-Lastverteilungslogik heruntergetaktet wurde. Labels: "litellm_model_name", "model_id", "api_base", "api_provider", "exception_status"

Maschinenspezifikationen für die Ausführung von Locust

MetrikWert
locust --processes 44
vCPUs auf der Lasttestmaschine2,0 vCPUs
Speicher auf der Lasttestmaschine450 MB
Replikate der Lasttestmaschine1

Maschinenspezifikationen für die Ausführung von LiteLLM Proxy

👉 Anzahl der Replikate von LiteLLM Proxy=4 für 1K+ RPS

DienstSpezifikationCPUsSpeicherArchitekturVersion
Servert2.large.2 vCPUs8 GBx86

Locust-Datei für Tests verwendet

import os
import uuid
from locust import HttpUser, task, between

class MyUser(HttpUser):
wait_time = between(0.5, 1) # Random wait time between requests

@task(100)
def litellm_completion(self):
# no cache hits with this
payload = {
"model": "fake-openai-endpoint",
"messages": [{"role": "user", "content": f"{uuid.uuid4()} This is a test there will be no cache hits and we'll fill up the context" * 150 }],
"user": "my-new-end-user-1"
}
response = self.client.post("chat/completions", json=payload)
if response.status_code != 200:
# log the errors in error.txt
with open("error.txt", "a") as error_log:
error_log.write(response.text + "\n")



def on_start(self):
self.api_key = os.getenv('API_KEY', 'sk-1234')
self.client.headers.update({'Authorization': f'Bearer {self.api_key}'})