Was hier aufgebaut wird
Eine GPU-Instanz, die ein Open-Weights-Modell über eine HTTP-API bedient, die das OpenAI-kompatible Schema spricht, sodass jede Client-Bibliothek, die Sie bereits haben, mit einer geänderten Basis-URL dagegen funktioniert. Hinter nginx, mit TLS, einem API-Key und einer systemd-Unit, die Neustarts übersteht.
Geschrieben auf einer G-L40S: 48 Gigabyte VRAM auf einer einzelnen Karte, per PCIe an die Instanz durchgereicht und nicht zwischen Mandanten zeitlich aufgeteilt. Diese Unterscheidung ist der Unterschied zwischen vorhersehbarer Latenz und dem Warten hinter dem Trainingsjob eines anderen. Die Karte gehört Ihnen, bis Sie kündigen.
Bevor Sie beginnen
- Eine G-L40S mit Debian 13. Die G-ADA mit 20 Gigabyte funktioniert für kleinere Modelle; die Rechnung in Schritt 4 sagt Ihnen, welche.
- Zwei Terabyte NVMe auf diesem Plan, was der richtige Ort für Gewichte ist. 40 Gigabyte zweimal herunterzuladen, weil der Cache auf dem Root-Dateisystem lag, ist eine nervige Art, eine Stunde zu verbringen.
- Ein Hostname, der auf die Instanz zeigt,
llm.example.comunten.
1. Treiber
sed -i "s/ main$/ main contrib non-free-firmware non-free/" /etc/apt/sources.list.d/debian.sources
apt update
apt install -y nvidia-driver firmware-misc-nonfree build-essential
rebootNachdem er zurückkommt:
nvidia-smiSie möchten die Karte aufgelistet, die Treiberversion gedruckt und den Speicherverbrauch nahe Null. Eine fehlende Karte an diesem Punkt ist fast immer ein veraltetes Initramfs; update-initramfs -u und booten Sie einmal neu, bevor Sie ein Ticket eröffnen.
nvidia-smi -q -d PERFORMANCE | grep -A3 "Clocks Event Reasons"
nvidia-smi -pm 1Der Persistenzmodus hält den Treiber zwischen Prozessen geladen, was mehrere Sekunden Initialisierung bei jedem Neustart entfernt.
2. Laufzeit
apt install -y python3-venv python3-pip
install -d -o root -g root /srv/models /opt/vllm
python3 -m venv /opt/vllm/venv
/opt/vllm/venv/bin/pip install --upgrade pip
/opt/vllm/venv/bin/pip install vllmDie Installation zieht ein großes CUDA-verknüpftes Wheel-Set und dauert eine Weile. Entscheiden Sie in der Zwischenzeit über ein Modell.
3. Auswählen, was passt
Gewichte sind die Untergrenze, nicht das Budget. Ein Modell mit 16-Bit-Präzision benötigt grob zwei Gigabyte VRAM pro Milliarde Parameter, plus den Key-Value-Cache für jede gleichzeitige Anfrage, plus etwa ein Gigabyte Laufzeit-Overhead.
| Karte | Gewichte bei 16-Bit | Realistische Modellgröße | Platz für Cache |
|---|---|---|---|
| L40S, 48 GB | 2 GB pro Milliarde | Bis zu etwa 20 Milliarden | 6–8 GB |
| L40S, 48 GB, 8-Bit | 1 GB pro Milliarde | Bis zu etwa 34 Milliarden | 10 GB |
| RTX 4000 Ada, 20 GB | 2 GB pro Milliarde | Bis zu etwa 7 Milliarden | 5 GB |
| Zwei × L40S, 96 GB | 2 GB pro Milliarde | Bis zu etwa 40 Milliarden | 12 GB |
Die Cache-Spalte bestimmt, wie viele Personen den Endpunkt gleichzeitig nutzen können. Karte bis zum Rand mit Gewichten füllen bedeutet ein sehr schnelles Einzelbenutzer-Spielzeug.
4. Bereitstellen
Zeigen Sie den Cache auf die NVMe und starten Sie den Server. Ersetzen Sie die Repository-Kennung des Open-Weights-Modells Ihrer Wahl; die Laufzeit holt es beim ersten Start.
cat > /etc/systemd/system/vllm.service <<EOF
[Unit]
Description=vLLM inference server
After=network-online.target
[Service]
Environment=HF_HOME=/srv/models
Environment=VLLM_API_KEY=<a long random string>
ExecStart=/opt/vllm/venv/bin/vllm serve <org>/<model> \\
--host 127.0.0.1 --port 8000 \\
--served-model-name local \\
--max-model-len 16384 \\
--gpu-memory-utilization 0.92 \\
--max-num-seqs 32
Restart=on-failure
RestartSec=10
TimeoutStartSec=1800
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now vllm
journalctl -fu vllmDas Binden an Loopback ist beabsichtigt. Die API-Key-Prüfung in der Laufzeit ist ein einzelnes gemeinsames Geheimnis ohne Rate-Limit dahinter, also macht nginx den Zugriff von außen und die Laufzeit berührt nie die öffentliche Schnittstelle.
Das großzügige Start-Timeout existiert, weil der erste Start zig Gigabyte herunterlädt und dann Kernel kompiliert. Spätere Starts dauern unter einer Minute.
5. Proxy und TLS
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name llm.example.com;
ssl_certificate /etc/letsencrypt/live/llm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.example.com/privkey.pem;
location /v1/ {
proxy_pass http://127.0.0.1:8000;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_set_header Host $host;
}
}proxy_buffering off ist die Zeile, die Streaming-Antworten streamen lässt. Lassen Sie es an; Token kommen in höflichen Stapeln, wann immer nginx meint, ein Puffer sei voll, was genau wie ein langsames Modell aussieht und es nicht ist.
Verifizieren
Beginnen Sie mit der Karte:
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csvVerwendeter Speicher sollte bei etwa 90 % des Gesamtspeichers liegen, denn das ist, was --gpu-memory-utilization angefordert hat. Dann der Endpunkt:
curl -s https://llm.example.com/v1/models -H "Authorization: Bearer <the key>" | head -20Ein Modell, genannt local. Nun eine echte Vervollständigung, und messen Sie die Zeit:
time curl -s https://llm.example.com/v1/chat/completions \
-H "Authorization: Bearer <the key>" \
-H "Content-Type: application/json" \
-d '{"model":"local","messages":[{"role":"user","content":"List three prime numbers."}],"max_tokens":64}'Messen Sie es schließlich unter Last und nicht eine Anfrage nach der anderen, denn das ist die einzige Zahl, die man zitieren kann:
/opt/vllm/venv/bin/vllm bench serve \
--backend openai-chat \
--base-url https://llm.example.com \
--endpoint /v1/chat/completions \
--model local --num-prompts 200 --request-rate 8Lesen Sie drei Zahlen aus der Ausgabe: Ausgabe-Tokens pro Sekunde in der Summe, Medianzeit bis zum ersten Token und das 99. Perzentil Ende-zu-Ende. Auf einer einzelnen L40S mit einem Modell im Bereich von zehn bis zwanzig Milliarden ist ein aggregierter Ausgabedurchsatz im hohen Hunderterbereich von Tokens pro Sekunde und eine Zeit bis zum ersten Token deutlich unter einer Sekunde die erwartete Form. Eine Zeit bis zum ersten Token, die mit der Parallelität steigt, bedeutet, dass Ihr Key-Value-Cache zu klein ist; senken Sie also --max-model-len oder --max-num-seqs und führen Sie es erneut aus.
Danach
Beobachten Sie Temperatur und Taktdrosselung in der ersten Woche mit nvidia-smi dmon, da eine Karte, die unter Dauerlast thermisch drosselt, genau die Art von intermittierender Langsamkeit erzeugt, die dem Netzwerk angelastet wird. Und denken Sie an die Rechnung: Eine GPU-Instanz kostet dasselbe, ob die Karte beschäftigt oder im Leerlauf ist, also bündeln Sie Arbeit, anstatt sie warmzuhalten. Die Preise finden Sie auf der GPU-Seite.