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šineKopija na svakoj mašini
KV kešviše od 3 miliona tokena0,76 i 1,08 miliona tokena
Zahtevi pri punom kontekstuoko 122,9 i 4,1
Propusnost pod našim opterećenjemoko 180 tokena/s210 tokena/s (111 + 99)
Pokretanjeoko 20 minuta5 do 13 minuta po kopiji
Restart jedne mašinemodel je nedostupandruga 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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

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.

Ažurirano: