Kaksi DGX Spark -luokan konetta, yksi malli: kopio kummallakin lyö pilkkomisen
Ylläpito
Seitsemän viikkoa paikallinen kielimallimme toimi pilkottuna kahden NVIDIA GB10 -koneen kesken tensor-parallelismin avulla. 22. lokakuuta korvasimme sen mallin täydellisellä kopiolla kummallakin koneella ja vähäisimmän yhteyden välityspalvelimella edessä. Läpimeno nousi noin 180:stä 210:een tokeniin sekunnissa, ja kumpi tahansa kone voi nyt käynnistyä uudelleen viemättä mallia.
Miksi pilkoimme sen
Kussakin koneessa on 128 GB muistia, jonka CPU ja GPU jakavat. Syyskuussa malli mahtui yhteen koneeseen, mutta sen välimuisti tuskin: käyttämämme vLLM-käännös ei pystynyt pitämään tämän mallin KV-välimuistia FP8-muodossa, joten välimuisti oli BF16-muodossa, ja yhdessä koneessa oli tilaa 499 110 tokenille. Se on vähemmän kuin kaksi pyyntöä mallin täydellisellä 262 144 tokenin kontekstilla. Pilkkomalla malli molempien koneiden kesken tensor-parallelismilla niiden suoraa verkkoyhteyttä pitkin välimuisti kasvoi yli kolmeen miljoonaan tokeniin. Pilkoimme mallin tilan, ei nopeuden, vuoksi.
Mitä muuttui
Uudempi 4-bittinen käännös samasta mallista (NVFP4, tehty kvantisointitietoiseen distillaatioon) vie noin 71 GiB muistia, ja yhteisön vLLM-käännös GB10:lle (eugr/spark-vllm-b12x) ajaa sen välimuistin FP8-muodossa. Nyt yksi kone pitää sisällään koko mallin ja 0,76–1,08 miljoonan tokenin välimuistin, tilaa 2,9–4,1 pyynnölle täydellisellä kontekstilla riippuen siitä, kuinka paljon muistia kone sille antaa. Molemmat kopiot käyttävät mallin omaa spekulatiivista dekoodausta (MTP, neljä luonnostokenia). Ennen vaihtoa ajoimme työkalukutsutestin uudella käännöksellä: se sai pisteet 86, korvattu käännös 75.
Mitä mittasimme
| Pilkottu kahden koneen kesken | Kopio kummallakin koneella | |
|---|---|---|
| KV-välimuisti | yli 3 miljoonaa tokenia | 0,76 ja 1,08 miljoonaa tokenia |
| Pyyntöjä täydellisellä kontekstilla | noin 12 | 2,9 ja 4,1 |
| Läpimeno kuormamme alla | noin 180 tokenia/s | 210 tokenia/s (111 + 99) |
| Käynnistys | noin 20 minuuttia | 5–13 minuuttia kopiota kohti |
| Yksi kone käynnistyy uudelleen | malli on alhaalla | toinen kopio palvelee |
Yksi kopio itsenäisesti, sen mukaan, kuinka monta pyyntöä se palvelee yhtä aikaa: lyhyillä kehotteilla 1 pyyntö tuotti 36 tokenia sekunnissa, 4 pyyntöä 82, 8 pyyntöä 109 ja 16 pyyntöä 150. Sähköpostiagenttimme pidemmillä kehotteilla 4 pyyntöä tuotti 81, 8 pyyntöä 113 ja 16 pyyntöä vain 87: yli kahdeksan tällaisen pyynnön jälkeen lisääminen hidasti suorituskykyä.
Iltapäivän aikana ensimmäinen kopio otti vastaan enintään 12 pyyntöä yhtä aikaa ja toinen 8. Ensimmäinen tuotti 91–93 tokenia sekunnissa ja suoritti 26–27 pyyntöä minuutissa; toinen 81–83 tokenia sekunnissa ja 22 pyyntöä minuutissa. Molemmat ottavat nyt vastaan 12 pyyntöä.
Mistä luovuimme
Tilasta. Jaettu malli käytti yhtä yli kolmen miljoonan tokenin välimuistia; kopioilla on kaksi pienempää välimuistia, ja pyyntö voi käyttää vain sen kopion välimuistia, joka palvelee sitä. Agenttimme lähettävät paljon lyhyitä ja keskipitkiä pyyntöjä, ja niille läpimeno oli tärkeämpää. Jos palvelet muutamia hyvin pitkiä konteksteja yhtä aikaa, jakaminen voi silti olla parempi valinta. Säilytimme jaetun asetuksen, ja takaisin vaihtaminen on yksi skripti.
Mitä meni pieleen vaihdon aikana
- Yksitoista minuuttia ilman mallia, sitten 30 sekuntia 502-virheitä. Jaetun mallin piti pysähtyä ennen kuin kopio voitiin ladata samille koneille, joten agenttimme odottivat noin yksitoista minuuttia. Kun ensimmäinen kopio käynnistyi, välityspalvelin vastasi vielä noin 30 sekuntia "502 no live upstreams": se oli merkinnyt taustapalvelimet epäonnistuneiksi niiden ollessa alhaalla (max_fails=3, fail_timeout=30s) eikä yrittänyt niitä uudelleen ennen kuin tämä aika kului.
- Asiakas, joka ohitti välityspalvelimen. Yhdessä eräajossamme oli ensimmäisen koneen osoite konfiguraatiossa, joten koko sen kuorma meni yhdelle kopiolle, kun toisella oli kapasiteettia vapaana. Kaikki asiakkaat kulkevat nyt välityspalvelimen kautta; koneiden omat osoitteet ovat vain kunnonvalvontaa varten.
- Mittarit, jotka hyppelivät. Läpimennon valvontamme luki vLLM:n /metrics-päätepisteen välityspalvelimen kautta. Kahdella taustapalvelimella peräkkäiset lukemat tulivat eri kopioista, laskurit hyppelivät edestakaisin ja valvonta ilmoitti mallin olevan nälkiintynyt. Se lukee nyt kunkin kopion suoraan ja laskee arvot yhteen.
- Vanha vahti, joka olisi pysäyttänyt uuden kopion. Jakotavassa oli vahti, joka käynnisti palvelun uudelleen, kun malli ei enää vastannut. Uusi palvelu ilmoittaa Conflicts= vanhaan, joten tämä uudelleenkäynnistys olisi pysäyttänyt uuden kopion. Se piti poistaa käytöstä komennolla
systemctl disable --now, ei vain pysäyttää, koska operaatiokerroksemme käynnistää uudelleen yksiköt, jotka ovat käytössä mutta eivät käynnissä. - Muisti koneella, joka tekee muutakin työtä. Yhdellä koneella pyörii myös tietokantamme ja sivustomme käännökset. Kun vLLM:n gpu-memory-utilization oli 0.78, muuta toimintaa varten jäi vain 5 GiB, joten laskimme sen arvoon 0.74 ja käynnistimme uudelleen vain tuon kopion toisen hoitaessa kuormaa. Näillä koneilla vLLM:lle antamasi muistiosuus otetaan samasta muistista kuin kaikki muukin.
Jos sinulla on kaksi tällaista konetta
- Jos malli ja tarvitsemasi välimuisti mahtuvat yhdelle koneelle, aja kopiota kullakin koneella vähäisimmän yhteyden välityspalvelimen takana. Jaa malli vain, jos yksi kone ei mahduta tarvitsemaasi välimuistia.
- Ohjaa jokainen asiakas välityspalvelimeen, myös erätyöt ja vanhat asetukset.
- Lue mittarit suoraan kunkin kopion omista lähteistä.
- Anna kullekin koneelle oma muistiosuutensa sen mukaan, mitä muuta siellä pyörii.
- Aseta, kuinka monta pyyntöä kopio palvelee kerrallaan oman liikenteesi perusteella: meidän sekoituksessamme 12 oli parempi kuin 8.
- Oleta, että vaihto vie mallin pois niin kauan kuin kopion käynnistyminen kestää, ja varaudu siihen.
Factory Floor toimittaa välityspalvelimen ja käynnistysasetukset yhdelle tai kahdelle koneelle, kunnon tarkistuksen sekä työkalukäyttötestin, jonka ajamme ennen mallien vaihtoa, sekä vahdit ja muistiturvarajat koneen muun toiminnan varalle.