Dua belas build

Inferensi lokal pada GPU passthrough dengan endpoint yang kompatibel dengan OpenAI

Driver, runtime, dan model pada G-L40S, dilayani di belakang TLS dengan API key, dan uji beban yang melaporkan token per detik secara nyata, bukan sekadar angka promosi vendor.

Yang Dibangun

Satu instance GPU yang melayani model open-weights melalui HTTP API dengan skema yang kompatibel dengan OpenAI, sehingga semua pustaka klien yang sudah Anda miliki dapat bekerja dengannya hanya dengan mengubah satu base URL. Di belakang nginx, dengan TLS, API key, dan unit systemd yang tetap hidup setelah reboot.

Ditulis pada G-L40S: empat puluh delapan gigabyte VRAM pada satu kartu, diteruskan ke instance melalui PCIe, bukan dibagi waktu antar penyewa. Perbedaan ini adalah perbedaan antara latensi yang dapat diprediksi dan menunggu di belakang pekerjaan training orang lain. Kartu itu milik Anda sampai Anda membatalkan.

Sebelum Anda Mulai

  • G-L40S dengan Debian 13. G-ADA dengan dua puluh gigabyte cukup untuk model yang lebih kecil; aritmetika di langkah empat menentukan model mana.
  • Dua terabyte NVMe pada paket ini, yang merupakan tempat yang tepat untuk weights. Mengunduh empat puluh gigabyte dua kali karena cache di filesystem root adalah cara yang menjengkelkan untuk menghabiskan satu jam.
  • Sebuah hostname yang menunjuk ke instance, llm.example.com di bawah.

1. Driver

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
reboot

Setelah kembali:

nvidia-smi

Anda ingin kartu terdaftar, versi driver tercetak, dan penggunaan memori mendekati nol. Kartu yang hilang pada titik ini hampir selalu karena initramfs yang basi; update-initramfs -u dan reboot sekali lagi sebelum membuka tiket.

nvidia-smi -q -d PERFORMANCE | grep -A3 "Clocks Event Reasons"
nvidia-smi -pm 1

Persistence mode menjaga driver tetap dimuat antar proses, yang menghilangkan beberapa detik inisialisasi dari setiap restart.

2. Runtime

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 vllm

Instalasi menarik set wheel CUDA-linked yang besar dan membutuhkan waktu. Sementara itu, putuskan model.

3. Memilih yang Cocok

Weights adalah batas bawah, bukan anggaran. Model dengan presisi 16-bit membutuhkan sekitar dua gigabyte VRAM per miliar parameter, ditambah key-value cache untuk setiap permintaan bersamaan, plus sekitar satu gigabyte overhead runtime.

KartuWeights pada 16-bitUkuran model realistisTersisa untuk cache
L40S, 48 GB2 GB per miliarHingga sekitar 20 miliar6 hingga 8 GB
L40S, 48 GB, 8-bit1 GB per miliarHingga sekitar 34 miliar10 GB
RTX 4000 Ada, 20 GB2 GB per miliarHingga sekitar 7 miliar5 GB
Dua × L40S, 96 GB2 GB per miliarHingga sekitar 40 miliar12 GB

Kolom cache menentukan berapa banyak orang yang dapat menggunakan endpoint sekaligus. Isi kartu sampai penuh dengan weights dan Anda telah membangun mainan pengguna tunggal yang sangat cepat.

4. Menyajikannya

Arahkan cache ke NVMe dan mulai server. Ganti dengan identifier repositori model open-weights yang Anda pilih; runtime akan mengambilnya pada start pertama.

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 vllm

Binding ke loopback disengaja. Pemeriksaan API key di runtime adalah satu shared secret tanpa rate limiting di belakangnya, jadi nginx yang melakukan paparan dan runtime tidak pernah menyentuh antarmuka publik.

Start timeout yang besar ada karena peluncuran pertama mengunduh puluhan gigabyte dan kemudian mengompilasi kernel. Start berikutnya memakan waktu di bawah satu menit.

5. Proxy dan 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 adalah baris yang membuat respons streaming benar-benar mengalir. Biarkan aktif dan token tiba dalam batch yang sopan setiap kali nginx merasa buffer penuh, yang terlihat persis seperti model yang lambat dan sebenarnya bukan.

Verifikasi

Mulai dengan kartu:

nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv

Memori terpakai harus sekitar sembilan puluh persen dari total, karena itulah yang diminta oleh --gpu-memory-utilization. Lalu endpoint:

curl -s https://llm.example.com/v1/models -H "Authorization: Bearer <the key>" | head -20

Satu model, bernama local. Sekarang completion asli, dan ukur waktunya:

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}'

Terakhir, ukur di bawah beban, bukan satu permintaan pada satu waktu, yang merupakan satu-satunya angka yang layak dikutip:

/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 8

Baca tiga angka dari output: token output per detik secara agregat, median waktu ke token pertama, dan persentil kesembilan puluh sembilan end-to-end. Pada single L40S dengan model dalam kisaran sepuluh hingga dua puluh miliar, throughput output agregat dalam ratusan token per detik dan waktu ke token pertama di bawah satu detik adalah bentuk yang diharapkan. Waktu ke token pertama yang naik seiring konkurensi berarti key-value cache Anda terlalu kecil, jadi turunkan --max-model-len atau --max-num-seqs dan jalankan lagi.

Setelahnya

Pantau suhu dan throttling clock selama minggu pertama dengan nvidia-smi dmon, karena kartu yang throttling secara termal di bawah beban berkelanjutan menghasilkan jenis kelambatan intermiten yang sering disalahkan pada jaringan. Dari segi tagihan, ingat bahwa instance GPU dikenai biaya yang sama baik kartu sibuk atau idle, jadi kerjakan secara batch daripada membiarkannya hangat. Harga ada di halaman GPU.

Siap saat Anda siap

Pilih kota. Pilih ukuran. Bayar dengan koin.

Tanpa formulir tentang siapa Anda, tanpa menunggu manusia untuk menyetujui, tanpa panggilan telepon untuk memverifikasi apa pun. Invoice dibersihkan dan kredensial masuk ke kotak masuk Anda.