Dve kutije klase DGX Spark, jedan model: kopija na svakoj koja eliminiše podelu
Operacije
Sedam nedelja naš lokalni jezički model radio je podeljen na dve NVIDIA GB10 mašine uz tenzorsku paralelizaciju. Dana 22. oktobra zamenili smo to punom kopijom modela na svakoj mašini i proxy-jem sa najmanjim brojem konekcija ispred njih. Propusnost je porasla sa oko 180 na 210 tokena u sekundi, a bilo koja mašina sada može da se restartuje bez gašenja modela.
Zašto smo ga podelili
Svaka mašina ima 128 GB memorije koju dele CPU i GPU. U septembru je model stao na jednu mašinu, ali jedva da je stao njegov keš: verzija vLLM-a koju smo koristili nije mogla da drži KV keš ovog modela u FP8 formatu, pa je keš bio u BF16 formatu, a jedna mašina je imala prostora za 499.110 tokena keša. To je manje od dva zahteva pri punom kontekstu modela od 262.144 tokena. Podeljen na obe mašine uz tenzorsku paralelizaciju preko njihove direktne mrežne veze, keš je porastao na više od tri miliona tokena. Podelili smo model zbog prostora, a ne zbog brzine.
Šta se promenilo
Novija 4-bitna verzija istog modela (NVFP4, napravljena kvantizacijski osvešćenom distilacijom) zauzima oko 71 GiB memorije, a zajednička vLLM verzija za GB10 (eugr/spark-vllm-b12x) pokreće njen keš u FP8 formatu. Sada jedna mašina drži ceo model i keš od 0,76 do 1,08 miliona tokena, što je prostor za 2,9 do 4,1 zahteva pri punom kontekstu, u zavisnosti od toga koliko memorije mašina dodeli. Obe kopije koriste sopstveno spekulativno dekodiranje modela (MTP, četiri draft tokena). Pre prelaska, pokrenuli smo naš test pozivanja alata na novoj verziji: postigla je 86, a verzija koju je zamenila 75.
Šta smo merili
| Podeljeno na dve mašine | Kopija na svakoj mašini | |
|---|---|---|
| KV keš | više od 3 miliona tokena | 0,76 i 1,08 miliona tokena |
| Zahtevi pri punom kontekstu | oko 12 | 2,9 i 4,1 |
| Propusnost pod našim opterećenjem | oko 180 tokena/s | 210 tokena/s (111 + 99) |
| Pokretanje | oko 20 minuta | 5 do 13 minuta po kopiji |
| Restart jedne mašine | model je nedostupan | druga kopija opslužuje |
Jedna kopija sama za sebe, prema broju zahteva koje istovremeno opslužuje: sa kratkim promptovima, 1 zahtev je davao 36 tokena u sekundi, 4 su davala 82, 8 je davalo 109, a 16 je davalo 150. Sa dužim promptovima našeg email agenta, 4 su davala 81, 8 je davalo 113, a 16 samo 87: nakon osam takvih zahteva, veći broj ih je usporavao.
Tokom jednog popodneva, jedna kopija je primila najviše 12 zahteva istovremeno, a druga 8. Prva je proizvodila 91 do 93 tokena u sekundi i završavala 26 do 27 zahteva u minutu; druga 81 do 83 tokena u sekundi i 22 zahteva u minutu. Obe sada primaju po 12.
Od čega smo odustali
Prostor. Podeljeni model je imao jedan keš od više od tri miliona tokena; kopije imaju dva manja, a zahtev može da koristi samo keš one kopije koja ga opslužuje. Naši agenti šalju mnogo kratkih i srednjih zahteva, pa je za njih propusnost bila važnija. Ako opslužujete nekoliko veoma dugih konteksta istovremeno, podela možda i dalje jeste bolji izbor. Zadržali smo podeljenu konfiguraciju, a povratak na nju je jedan skript.
Šta je pošlo naopako tokom prelaska
- Jedanaest minuta bez modela, pa 30 sekundi grešaka 502. Podeljeni model je morao da se zaustavi pre nego što je kopija mogla da se učita na istim mašinama, pa su naši agenti čekali oko jedanaest minuta. Kada se prva kopija podigla, proksi je još oko 30 sekundi odgovarao sa "502 no live upstreams": označio je backendove kao neuspešne dok su bili nedostupni (max_fails=3, fail_timeout=30s) i nije ih ponovo pokušao dok to vreme nije isteklo.
- Klijent koji je preskočio proksi. Jedan od naših batch poslova je imao adresu prve mašine u svojoj konfiguraciji, pa je sav njegov teret išao na jednu kopiju dok je druga imala slobodnog kapaciteta. Svi klijenti sada idu preko proksija; adrese samih mašina su samo za provere zdravlja.
- Metrike koje su poskakivale. Naš monitor propusnosti je čitao vLLM-ove /metrics preko proksija. Sa dva backendova, uzastopna čitanja su dolazila sa različitih kopija, brojači su poskakivali napred-nazad, a monitor je prijavljivao model kao izgladneli. Sada čita svaku kopiju direktno i sabira ih.
- Stari nadzorni proces koji bi zaustavio novu kopiju. Podeljena konfiguracija imala je nadzorni proces koji je ponovo pokretao svoju uslugu kada model prestane da odgovara. Nova usluga deklariše Conflicts= sa starom, tako da bi taj restart zaustavio novu kopiju. Morao je biti isključen pomoću
systemctl disable --now, a ne samo zaustavljen, jer naš operativni sloj ponovo pokreće jedinice koje su omogućene, ali ne i pokrenute. - Memorija na mašini koja obavlja i druge poslove. Jedna mašina takođe pokreće naše baze podataka i izgradnje sajtova. Sa vLLM-ovim gpu-memory-utilization na 0.78, preostalo je samo 5 GiB za sve ostalo, pa smo smanjili na 0.74 i ponovo pokrenuli samo tu kopiju dok je druga preuzimala opterećenje. Na ovim mašinama, udeo koji dodelite vLLM-u dolazi iz iste memorije kao i sve ostalo.
Ako imate dve ove mašine
- Ako se model i keš koji vam je potreban uklapaju na jednu mašinu, pokrenite kopiju na svakoj iza proxy servera sa najmanjim brojem konekcija. Podelite model samo kada jedna mašina ne može da drži keš koji vam je potreban.
- Usmerite sve klijente na proxy, uključujući batch poslove i stare konfiguracije.
- Čitajte metrike direktno sa svake kopije.
- Dodelite svakoj mašini sopstveni udeo memorije, u skladu sa onim što se još pokreće na njoj.
- Podesite koliko zahteva jedna kopija istovremeno opslužuje prema vašem saobraćaju: za naš miks, 12 je bilo bolje od 8.
- Očekujte da će prebacivanje oduzeti model na vreme potrebno da se kopija pokrene, i pripremite se za to.
Factory Floor isporučuje proxy i konfiguracije za pokretanje za jednu ili dve mašine, proveru zdravlja i test korišćenja alata koji pokrećemo pre prebacivanja modela, sa nadzornim procesima i zaštitnim mehanizmima memorije za ostatak mašine.