LiteLLM: çok kullanıcılı LLM kapısı
İki vLLM kopyasının önüne kullanıcı anahtarı, token tavanı ve bütçe koyun — ölçülmüş maliyetiyle birlikte.
Modeliniz çalışıyor, hatta iki kopyası var. Sıra onu bir ekibe açmaya geldi: herkesin kendi anahtarı olsun, kimse tek başına makineyi doldurmasın, kimin ne kadar token harcadığı görünsün. Bu sayfa o kapıyı LiteLLM ile kuruyor — ve kurmanın bedelini de ölçüyor.
Önce beklentiyi doğru kuralım
LiteLLM'i "daha iyi bir yük dengeleyici" diye almayın. Aynı donanım, aynı iki kopya, aynı kıyaslama (200 istem, 512 girdi / 256 çıktı):
| Çıktı tok/sn | Tek kopyaya oran | TTFT ortalama | |
|---|---|---|---|
| HAProxy | 1.248,6 | 1,894× | 512 ms |
| LiteLLM, 4 işçi | 1.122,6 | 1,746× | 1.073 ms |
| LiteLLM, 8 işçi | 1.103,0 | 1,716× | 859 ms |
| LiteLLM, 1 işçi | 885,9 | 1,356× | 1.551 ms |
| Doğrudan tek kopya | 642,8 | — | 530 ms |
Doğru boyutlandırılmış LiteLLM, HAProxy'nin %90'ına çıkıyor ama TTFT'de arayı kapatmıyor.
Buna rağmen doğru araç olabilir, çünkü HAProxy'nin yapamadığı şeyleri yapar: kullanıcı başına sanal anahtar, token/dakika ve istek/dakika tavanı, bütçe, harcama kaydı, model erişim kısıtı, yeniden deneme ve yedekleme. HAProxy token'ı görmez bile. Seçim "hangisi daha hızlı" değil, "veri yolunda mı yoksa denetim düzleminde mi duruyorum" sorusudur.
İşçi eklemek verimi bir yere kadar artırır. 1 → 4 işçide verim %27 arttı; 4 → 8'de artmadı (1.122,6 → 1.103,0). Ama TTFT düşmeye devam etti (1.551 → 1.073 → 859 ms). Yani verim 4 işçide doyuyor, kuyruk işçi ekledikçe azalıyor. Kalan ~%10'luk fark eşzamanlılık değil, LiteLLM'in istek başına yaptığı iş: yönlendirme, bütçe kontrolü, harcama yazımı.
Yığın
istemci -- sk-... sanal anahtar --> LiteLLM (N işçi) --least-busy--> vLLM r1
| vLLM r2
Postgres (anahtar / bütçe / harcama)
Redis (işçiler arası sayaç)Postgres olmadan sanal anahtar, bütçe ve harcama kaydı çalışmaz — geriye yalnızca yönlendirme ve model başına tavan kalır, yani LiteLLM'e geçme sebebinin çoğu kaybolur. Redis olmadan ise her işçi kendi sayacını tutar ve tavanlarınız işçi sayısıyla çarpılır.
Postgres ve Redis
- Postgres:
postgres:16-alpine, 2 vCPU / 4 GB, kalıcı disk zorunlu (/var/lib/postgresql/data,PGDATA=/var/lib/postgresql/data/pgdata) - Redis:
redis:7-alpine, 1 vCPU / 2 GB
Postgres'i konteyner diskine kurmayın. Konteyner yeniden başladığında bütün anahtarlar, bütçeler ve harcama geçmişi silinir. Kalıcı disk bağlayın — bunu bir kez yaşayıp düzelttik.
Kapı
- İmaj:
ghcr.io/berriai/litellm:v1.90.2(latestdeğil — sürümü sabitleyin) - Kaynak: işçi başına ~1 vCPU ve ~1 GB hesaplayın (ölçüldü: her işçi ~630 MB, ebeveyn ~620 MB). 4 işçi için 6 vCPU / 8 GB rahat eder.
- Port: 4000
- Ortam değişkenleri:
DATABASE_URL=postgresql://litellm:PAROLA@llm-pg-svc:5432/litellmLITELLM_MASTER_KEY=sk-...DISABLE_SCHEMA_UPDATE=true
- Komut:
sh -lc "apk add --no-cache libatomic >/dev/null 2>&1; \
cd /app && prisma db push --schema=./schema.prisma --accept-data-loss --skip-generate; \
exec litellm --config /app/proxy_server_config.yaml --port 4000 --num_workers 4"Bu komut kulağa fazla geliyor olabilir; üç ayrı tuzağı birden kapatıyor — hepsi aşağıda.
model_list:
- model_name: kaptan-llm
litellm_params:
model: hosted_vllm/Qwen/Qwen3.8-27B-FP8
api_base: http://qwen-r1-svc:8000/v1
api_key: none
# 4 işçi x 4 = kopya başına 16 eşzamanlı istek. Sınırsız bıraktığımızda
# 32K bağlamda TTFT 4,2 saniyeden 37,5 saniyeye çıkmıştı.
max_parallel_requests: 4
- model_name: kaptan-llm
litellm_params:
model: hosted_vllm/Qwen/Qwen3.8-27B-FP8
api_base: http://qwen-r2-svc:8000/v1
api_key: none
max_parallel_requests: 4
# Aynı iki kopya, bu kez sabit adlarla — ön ek yakınlığı isteyen istemci için.
- model_name: kaptan-llm-r1
litellm_params:
model: hosted_vllm/Qwen/Qwen3.8-27B-FP8
api_base: http://qwen-r1-svc:8000/v1
api_key: none
max_parallel_requests: 4
- model_name: kaptan-llm-r2
litellm_params:
model: hosted_vllm/Qwen/Qwen3.8-27B-FP8
api_base: http://qwen-r2-svc:8000/v1
api_key: none
max_parallel_requests: 4
router_settings:
# least-busy, shuffle değil. LLM istekleri çok eşitsizdir: 32K'lık bir istem
# 512'liğin ~64 katı prefill demektir, yani "kimin sırası" değil "kim boş" önemli.
routing_strategy: least-busy
num_retries: 2
# 32K bağlamda tek bir istek yük altında 76 saniye sürdü.
timeout: 600
# Ağırlıklarını yükleyen bir kopya ~7 dakika sürüyor; havuzdan düşsün.
allowed_fails: 3
cooldown_time: 60
# Bu olmadan her işçi kendi sayacını tutar ve tavanlarınız çarpılır.
redis_host: llm-redis-svc
redis_port: 6379
litellm_settings:
drop_params: true
request_timeout: 600
json_logs: true
general_settings:
master_key: sk-BURAYA-KENDI-ANAHTARINIZ
background_health_checks: true
health_check_interval: 30api_base sonundaki /v1 şart ve model adının başına hosted_vllm/ gelmeli — LiteLLM kendi
kurduğunuz vLLM'i ancak bu önekle OpenAI uyumlu sağlayıcı gibi çağırır.
Kullanıcı anahtarı üretin
Asıl gelme sebebiniz bu:
curl -s localhost:4000/key/generate \
-H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' \
-d '{"key_alias":"musteri-alfa",
"models":["kaptan-llm"],
"max_budget":5.0, "budget_duration":"30d",
"tpm_limit":20000, "rpm_limit":60}'Sonuç ve doğrulaması:
key/generate: 200
key/info: {'key_alias': 'musteri-alfa', 'spend': 0.0, 'max_budget': 5.0,
'tpm_limit': 20000, 'rpm_limit': 60, 'models': ['kaptan-llm']}
izin verilmeyen modele istek: 403 "key not allowed to access model"Model erişim kısıtının gerçekten uygulandığını görmek önemli: anahtar yalnızca kaptan-llm'e
yetkili, kaptan-llm-r1 denendiğinde 403 dönüyor.
İstemciden kullanın
curl -s localhost:4000/v1/chat/completions \
-H "Authorization: Bearer $VIRTUAL_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"kaptan-llm",
"messages":[{"role":"user","content":"Merhaba"}],
"max_tokens":64,
"chat_template_kwargs":{"enable_thinking":false}}'Cevap başlıkları isteğin hangi kopyaya gittiğini söyler — yük dağılımını tahmin etmek yerine ölçmenizi sağlayan tek şey budur:
x-litellm-model-api-base = http://qwen-r1-svc:8000/v1
x-litellm-overhead-duration-ms = 2.159
x-litellm-attempted-retries = 0chat_template_kwargs drop_params: true ayarına rağmen kopyaya kadar gidiyor — doğrulandı.
Qwen3'te bunu göndermezseniz model önce "düşünür": max_tokens küçükse cevap tamamen
reasoning_content alanında kalır ve content boş döner. Boş cevap alıyorsanız hata bu.
Kurulumdaki üç tuzak
Yukarıdaki uzun command satırı bunları kapatmak için. Üçü de canlıda yaşandı.
1. libatomic eksik → veritabanı hiç kurulmuyor. LiteLLM, Prisma CLI'ını çalışma anında npm
ile indirir; imajdaki node ikilisi libatomic.so.1: cannot open shared object file diyip düşer.
Sonuç sessizdir: kapı açılır, /health/readiness db: connected der, ama tablo yoktur ve ilk
anahtar denemesi şunu verir:
The table `public.LiteLLM_VerificationToken` does not exist in the current database.Çare apk add --no-cache libatomic.
2. Şema dosyası var, migration yok. İmaj schema.prisma taşır ama prisma/migrations klasörü
boştur, yani migrate deploy "No migration found" deyip hiçbir şey yapmaz. Doğru komut
prisma db push — ve idempotenttir, her açılışta güvenle çalışır.
3. DISABLE_SCHEMA_UPDATE=true vermezseniz kapı hiç açılmaz. libatomic düzeldikten sonra
LiteLLM kendi prisma migrate deploy adımını gerçekten çalıştırmaya başlar ve sonsuz döngüye
girer. Belirtisi log değil, süreç tablosudur — her ~10 saniyede bir yeni asılı süreç:
1 7:37 litellm ... --num_workers 4
177 4:07 schema-engine-d
229 3:58 node-MainThread
291 3:48 node-MainThread
345 3:38 node-MainThread <- her 10 saniyede bir yenisiŞemayı zaten kendimiz kurduğumuz için onun migration'ına ihtiyaç yok.
Teşhis ipucu: LiteLLM açılmıyorsa loga değil ps'e bakın. Log tek satırda ("Running prisma
migrate deploy") donmuş görünür ve size hiçbir şey söylemez; süreç tablosu ise döngüyü anında
gösterir.
Aynı kullanıcı hep aynı kopyaya gitsin mi
least-busy bir sohbeti turdan tura farklı kopyaya atabilir, bu da ön ek önbelleğini böler.
Ölçtük: 8 eşzamanlı kullanıcı, 4'er tur, ~3.100 tokenlık ortak ön ek, ikisi de kapıdan geçerek,
birbirinin aynı iki kopya (fp8 + --prefix-match-unit 16), tek fark yönlendirme.
| Aynı kopyada kalan | Ön ek isabeti | Ortalama gecikme | |
|---|---|---|---|
kaptan-llm (least-busy) | 2/8 – 4/8 | %95,0 – %96,4 | 399,2 / 432,2 ms |
kaptan-llm-r{1,2} (sabit) | 8/8 | %99,8 – %99,8 | 317,7 / 322,3 ms |
Sabitleme ~4 puan isabet ve ~%20 gecikme kazandırıyor. Dikkat çeken asıl fark
tekrarlanabilirlik: sabit yönlendirme iki koşuda da tam olarak 100.480 isabet üretti,
least-busy her koşuda başka sayı verdi.
İlk koşuda +26,7 puan ölçtük; gerçek sayı ~4 puan. Test A'yı (least-busy) önce, B'yi (sabit) sonra çalıştırıyor — yani A soğuk önbellekle başlıyor ve B, A'nın ısıttığı önbellekten yararlanıyor. Sıralama etkisi geçene kadar tekrarlamazsanız kazancı altı kat abartırsınız. Bu sayfadaki her sayı en az üç koşudan alındı.
Bu ölçüm iyimserdir. Yalnızca 8 kullanıcı vardı ve KV cache herkesin ön ekini rahatça
tutuyordu. Kullanıcı sayısı önbelleği aşmaya başladığında bölünmüş önbellek gerçekten tahliyeye
yol açar ve aradaki fark büyür. Küçük ekipte least-busy yeterli; kalabalıkta sabitlemeyi
ölçerek değerlendirin.
LiteLLM'in ön ek farkında yönlendirmesi yok. Kendi eşleştirmesi mesaj düzeyinde tam hash; SGLang'daki gibi token düzeyi ön ek eşleştirmesi hâlâ açık bir istek. Yukarıdaki "sabit ad" yöntemi bu eksiğin elle kurulmuş karşılığıdır.
Bir adım ötesi: vLLM production-stack router
Yukarıdaki "sabit model adı" yöntemi, piyasanın önbellek-farkında yönlendirici dediği şeyin elle kurulmuş hâli. Gerçeği de Gao Kaptan'da pod olarak çalışıyor — denendi.
- İmaj:
lmcache/lmstack-router:latest - Kaynak: 2 vCPU / 4 GB yeter
- Komut:
/opt/venv/bin/vllm-router --host 0.0.0.0 --port 8000 \
--service-discovery static \
--static-backends "http://qwen-r1-svc.NAMESPACE.svc.cluster.local:8000,http://qwen-r2-svc.NAMESPACE.svc.cluster.local:8000" \
--static-models "Qwen/Qwen3.8-27B-FP8,Qwen/Qwen3.8-27B-FP8" \
--routing-logic session --session-key x-user-id \
--engine-stats-interval 10 --log-statsSonuç — dört müşteri, üçer istek, yalnızca x-user-id başlığı farklı:
musteri-A: r1r1r1 SABIT
musteri-B: r2r2r2 SABIT
musteri-C: r1r1r1 SABIT
musteri-D: r1r1r1 SABIT sabit kalan: 4/4Kullanıcıyı kopyaya kilitlemek için artık ayrı model adı tanımlamanıza gerek yok.
İki tuzak, ikisi de bir pod ömrüne mal oldu.
vllm-routerPATH'te değil. İmajın kendisi bir sanal ortam taşıyor;commandolarak sadecevllm-routeryazarsanızexec: vllm-router: not foundalırsınız. Tam yolu verin:/opt/venv/bin/vllm-router.- Kısa servis adını kabul etmiyor.
http://qwen-r1-svc:8000"Skipping invalid URL" diye atlanıyor, ardındanAssertionError: URLs and models should have the same lengthile düşüyor — yani asıl hata mesajı sebebi söylemiyor. Tam DNS adı kullanın:http://qwen-r1-svc.<namespace>.svc.cluster.local:8000.
Hangi yönlendirme kipini kullanabilirsiniz
--routing-logic şunları kabul ediyor: roundrobin, session, kvaware, loadaware,
prefixaware, disaggregated_prefill, disaggregated_prefill_orchestrated, priority.
Ama hepsi düz bir vLLM pod'uyla çalışmaz:
| Kip | Gao Kaptan'da düz vLLM ile | Notu |
|---|---|---|
session, roundrobin, loadaware | ✅ çalışır | Ek bileşen istemez |
kvaware, prefixaware | ❌ | LMCache controller ister; motorların lmcacheConfig.enableController ile açılmış olması gerekir |
disaggregated_prefill* | ❌ | Ayrı prefill/decode havuzu ister — MIG'de yapılamaz |
Helm chart'ın tamamı Gao Kaptan'a kurulmaz — o Deployment/Service/CRD yaratır, Gao Kaptan ise pod
çalıştırır. Ama zaten gerek yok: motoru siz pod olarak kuruyorsunuz, geriye kalan tek işe yarar
parça router ve o pod olarak çalışıyor. Gateway API Inference Extension (InferencePool + EPP)
ise küme çapında CRD ve bir Gateway denetleyicisi ister; o kiracı işi değil, platform yöneticisi
işidir.
Zinciri kurmak: LiteLLM → router
Router'ı LiteLLM'in altına koymak için tek bir deployment yeter — fan-out'u artık router yapıyor:
model_list:
- model_name: kaptan-llm
litellm_params:
model: hosted_vllm/Qwen/Qwen3.8-27B-FP8
api_base: http://llm-router-svc:8000/v1
api_key: none
max_parallel_requests: 4
general_settings:
# Router yakinligi x-user-id basligindan okuyor. Bu acik degilse LiteLLM
# istemci basliklarini arkaya iletmez ve yakinlik zincirde sessizce kirilir.
forward_client_headers_to_llm_api: trueBaşlığın gerçekten geçtiğini doğrulayın — dört müşteri, üçer istek, zincir üzerinden:
musteri-A: r1r1r1 musteri-B: r2r2r2
musteri-C: r1r1r1 musteri-D: r1r1r1 sabit kalan: 4/4Dağılım, router'a doğrudan yapılan testle birebir aynı çıktı; yani LiteLLM başlığı bozmadan iletiyor.
Ek atlamanın bedeli (200 istem, 512/256, mc=32, aynı geçit):
| Çıktı tok/sn | TTFT ort | TTFT P99 | E2EL | |
|---|---|---|---|---|
| Zincir (LiteLLM → router → vLLM) | 1.117,8 | 624,3 ms | 2.581,0 ms | 6.534 ms |
| Doğrudan (LiteLLM → vLLM) | 1.173,0 | 697,1 ms | 1.284,2 ms | 6.320 ms |
Verimin %4,7'si ve kuyruk gecikmesinin iki katı. Ortalama TTFT biraz iyileşiyor ama P99 belirgin şekilde kötüleşiyor.
Bu tablo router'ın faydasını ölçmez, yalnızca maliyetini. Kıyaslama aracı x-user-id
göndermiyor, dolayısıyla oturum yakınlığı hiç devreye girmiyor. Kararı şöyle verin:
- Trafiğiniz gerçek sohbetlerse (ortak sistem istemi, büyüyen geçmiş), yakınlık kazancı bu %4,7'yi fazlasıyla karşılar — sabitlemeyi ayrıca ölçtük: ~4 puan ön ek isabeti, ~%20 gecikme.
- Trafiğiniz tek atışlık ve durumsuzsa, router saf ek yüktür; LiteLLM'in kendi
least-busy'si yeterlidir.
Nereye koymalı
Router LiteLLM'in yerine değil, altına girer:
musteri --> LiteLLM (anahtar, TPM/RPM, butce, harcama)
|
vllm-router (oturum/yuk farkinda yonlendirme)
|
vLLM r1 ... rNLiteLLM kimin ne kadar harcadığını bilir ama LLM'e kördür; router LLM'i bilir ama kimin kim olduğunu bilmez. İkisi farklı işler yapıyor, sıralama bu.
"1000 kullanıcı kaldırır mı?"
Önce soruyu düzeltmek gerekiyor: kayıtlı kullanıcı sayısı bir kapasite birimi değildir. Kapasiteyi belirleyen üç şey var — kaç istek eşzamanlı akıyor, dakikada kaç istek geliyor, ve her istemin kaç tokeni var. Üçüncüsü diğer ikisini eziyor.
32K bağlamda ölçülen tavan
İki 4g.71gb dilimi, iki kopya, kapıdan geçerek (32.768 girdi / 128 çıktı):
| Eşzamanlılık | req/sn | TTFT ort | TTFT P99 | Tam cevap (E2EL) ort |
|---|---|---|---|---|
| 4 | 0,29 | 6,5 sn | 14,0 sn | 13,0 sn |
| 16 | 0,37 | 15,0 sn | 43,6 sn | 41,3 sn |
| 64 | 0,39 | 98,9 sn | 159,4 sn | 127,5 sn |
Verim 0,39 istek/saniyede doyuyor. Eşzamanlılığı 16 kat artırmak verime %34 ekliyor, gecikmeyi 15 katına çıkarıyor. Doymuş bir kuyrukta sıraya adam eklemek sırayı hızlandırmaz.
Token cinsinden aynı tavan: 96 istek × 32.768 token ÷ 247 saniye = 12.740 girdi tok/sn — iki kopyanın teorik prefill toplamının (2 × 7.700) %83'ü. İki yoldan aynı sayıya varıyoruz.
Buradan kullanıcı sayısına
Sürdürülebilir istek hızı 0,39/sn ise, N kullanıcı ancak N ÷ 0,39 saniyede bir istek gönderirse sistem yetişir:
| Kullanıcı | Kullanıcı başına 32K istek aralığı |
|---|---|
| 100 | ~4,3 dakikada bir |
| 500 | ~21 dakikada bir |
| 1000 | ~43 dakikada bir |
Yani "1000 kullanıcı" ancak herkes yaklaşık kırk dakikada bir 32K'lık soru soruyorsa kaldırılır
— ve o noktada bile cevaplar iki dakika sürer. Aynı sonucu token tarafından da alırsınız:
12.740 tok/sn ÷ 1000 kullanıcı = kullanıcı başına ~760 girdi tokeni/dakika. tpm_limit
değerinizi tahminle değil bu sayıyla koyun.
En güçlü kaldıraç donanım değil, istem uzunluğu. Aynı yığın 512 tokenlık istemlerde 4,40 req/sn veriyor — 32K'daki 0,39'un 11 katı. Bağlamı yarıya indirmek, kart eklemekten ucuz ve hızlıdır.
Uzun istem kısa sohbeti boğuyor
Bu, çok kullanıcılı kurulumda tek bir havuz kullanmanın bedelidir. Aynı kısa istem kıyaslaması (512 girdi / 128 çıktı, 8 eşzamanlı), önce tek başına, sonra arkada 32K yükü akarken:
| Kısa istem | TTFT ort | TTFT P99 | Tam cevap | req/sn |
|---|---|---|---|---|
| Tek başına | 279,5 ms | 420,7 ms | 2,6 sn | 3,03 |
| 32K yükü akarken | 3.649,3 ms | 7.646,3 ms | 18,8 sn | 0,41 |
TTFT 13 katına, tam cevap 7 katına çıkıyor. Sekiz uzun bağlam isteği, sohbet eden herkesin deneyimini bozmaya yetiyor — çünkü hepsi aynı prefill kuyruğunda bekliyor.
Doğru yapı ne
Bu sayfadaki yığın şekil olarak doğru — kullanıcı anahtarı, tavan, bütçe ve sınırlı eşzamanlılık çok kullanıcılı bir sistemin olmazsa olmazı. Ama 1000 kullanıcı için üç eksiği var:
1. Havuzları ayrı kopyalara sabitleyin. Tek bir vLLM kopyasında paralellik yoktur: bir zamanlayıcı, bir GPU dilimi. Sürekli gruplama istekleri aynı anda taşır ama aynı anda çalıştırmaz — 32K'lık bir prefill dilimin bütün gücünü ~4,25 saniye meşgul eder. (Parçalı prefill hasarı sınırlar, kapalı olsa çok daha kötü olurdu.)
Ama iki kopya ayrı dilimlerde gerçekten paraleldir. Ölçtük — kısa istem yalnızca r1'de, 32K yükü yalnızca r2'de:
| Kısa istem (512/128, mc=8, yalnız r1) | TTFT ort | TTFT P99 | Tam cevap | req/sn |
|---|---|---|---|---|
| Başka yük yok | 439,1 ms | 597,9 ms | 2,91 sn | 2,74 |
| 32K yükü r2'de akarken | 417,3 ms | 576,8 ms | 2,90 sn | 2,75 |
Sıfır bozulma. Aynı havuzda 13 kata çıkan TTFT, ayrı kopyalarda hiç kıpırdamıyor. Yapılandırma tarafında zaten hazır — sabit adları havuz olarak kullanın:
- model_name: kaptan-chat # yalnizca r1
litellm_params: { api_base: http://qwen-r1-svc:8000/v1, ..., max_parallel_requests: 12 }
- model_name: kaptan-longctx # yalnizca r2
litellm_params: { api_base: http://qwen-r2-svc:8000/v1, ..., max_parallel_requests: 2 }Bedeli, her havuzun donanımın yarısıyla kalması. Ama ölçümde bu bedel beklenenden küçük çıktı: kısa istemde tek kopya 2,74 req/sn verdi, iki kopya 3,03 — yani %10. Çünkü mc=8'de sınır GPU değil, eşzamanlılık tavanıdır. Kısa sohbet trafiği için tek kopya çoğu zaman yeter; asıl kazanç, uzun bağlamın onu artık boğamamasıdır.
2. Tavanları ölçümden türetin. tpm_limit için yukarıdaki 760 tok/dk hesabını kullanın.
rpm_limit'i de kullanıcı başına adil paydan verin — 0,39 req/sn × 60 ÷ kullanıcı sayısı.
3. Tek nokta arızalarını kaldırın. Bu sayfadaki kurulumda kapı, Postgres ve Redis'in her biri tek pod. Üretimde kapıyı çoğaltın (Redis sayaçları zaten paylaşıyor) ve Postgres'i yedekleyin.
Asıl tavan iki MIG dilimi. MIG'de tensor-parallel-size 1 zorunlu olduğu için tek bir isteği
hızlandıramazsınız — yalnızca kopya ekleyebilirsiniz, o da yeni dilim ya da yeni kart demektir.
Uzun bağlamı ciddi hacimde sunacaksanız çözüm MIG değil, tam kart ve prefill/decode ayrımıdır.
Hangi yapıyı seçmeli
| İhtiyacınız | Doğru araç |
|---|---|
| Sadece iki kopyaya trafik dağıtmak | HAProxy — ölçtüğümüz kadarıyla bedeli negatif |
| Kullanıcı başına anahtar, tavan, bütçe, harcama kaydı | LiteLLM — HAProxy bunu yapamaz |
| İkisi birden | HAProxy veri yolunda, LiteLLM önünde denetim düzleminde |
| Ön ek farkında gerçek yönlendirme | vLLM production-stack router / llm-d — ikisi de değil |
Sık karşılaşılan hatalar
| Belirti | Sebep |
|---|---|
LiteLLM_VerificationToken does not exist | libatomic eksik, Prisma CLI kurulamadı; komuta apk add --no-cache libatomic ekleyin |
| Kapı hiç açılmıyor, log tek satırda donuk | LiteLLM kendi migration'ını döngüde deniyor; DISABLE_SCHEMA_UPDATE=true verin ve ps ile doğrulayın |
migrate deploy "No migration found" diyor | İmajda migration klasörü yok; prisma db push kullanın |
| Yeniden başlattım, anahtarlar gitti | Postgres konteyner diskinde; kalıcı disk bağlayın |
Cevabın content alanı boş | Qwen3 düşünme kipi; chat_template_kwargs: {enable_thinking: false} gönderin |
Pod "running" ama hizmet yok, restart_count artıyor | İşçi başına bellek yetmiyor, OOMKilled — işçi başına ~1 GB |
| Verim düşük, TTFT şişmiş | İşçi sayısı az; 4'e çıkarın (verim orada doyuyor, TTFT 8'e kadar iyileşir) |
| Tavanlar iki katı gibi davranıyor | İşçiler sayaçları paylaşmıyor; redis_host verin |
| Kısa sohbetler aniden çok yavaşladı | Aynı havuzda uzun bağlam istekleri var; TTFT 13 katına çıkabilir — havuzları ayırın |
Router exec: vllm-router: not found diyor | PATH'te değil; /opt/venv/bin/vllm-router yazın |
Router URLs and models should have the same length diyor | Kısa servis adı geçersiz sayıldı; tam DNS adı verin |
| Zincirde yakınlık çalışmıyor | forward_client_headers_to_llm_api: true yok; LiteLLM x-user-id'yi arkaya iletmiyor |
| 401 alıyorsunuz | Authorization: Bearer sk-... gönderilmedi |
FreeToken: az VRAM ile büyük MoE modelleri
35B parametreli bir MoE modeli GPU'nun 1/7'lik diliminde çalıştırın. Uzmanlar RAM'de durur, GPU'ya akar. Kurulum, ayar ve ölçülmüş rakamlar.
Claude Code'u kendi modelinizle çalıştırın
Kaptan'daki Qwen'i Claude Code'un arkasına koyun: kod tek satır dışarı çıkmadan yazılsın, test edilsin, düzeltilsin.

Gao Kaptan Docs
LiteLLM: çok kullanıcılı LLM kapısı