Naš nadzorni proces je restartovao ispravan serverski model osam puta u jednom danu
Operacije
22. jula je nadzorni proces restartovao naš lokalni serverski model osam puta. Ni jedan od tih restartova nije imao pad sistema iza sebe. Provera koja je trebalo da drži model aktivnim bila je ta koja ga je obarala.
Šta se desilo
Serverski model je pokretao vLLM na jednoj NVIDIA GB10 mašini i generisao oko 8 tokena u sekundi za jedan zahtev. Na svakih pet minuta nadzorni proces mu je slao stvarni zahtev za ćaskanje i čekao odgovor do 45 sekundi. Pet neuspešnih provera zaredom značilo je zaglavljen server, i nadzorni proces ga je restartovao. Restart je uklanjao model na nekoliko minuta dok se oko 19 GB težina ponovo nije učitalo.
Tog dana je posao u grupi držao dva do četiri zahteva zauzetim na serveru po nekoliko minuta. Zahtev nadzornog procesa je čekao u redu iza njih, isteklo mu je vreme i računao se kao neuspeh. Nakon pet takvih provera, ispravan server je restartovan. Imali smo datoteku sa oznakom "zauzeto" koju je nadzorni proces poštovao, ali je posao u grupi nikada nije postavio.
Kako je jedan lažni restart doveo do sledećeg
Svaki restart je neuspešno završio zahteve u toku sa greškom 500 ("cannot schedule new futures after shutdown"). Drugi nadzorni proces je brojao greške 500 i restartovao server kada ih je bilo previše, a što je više grešaka video, to je pre reagovao. Dakle, svaki lažni restart je ubrzavao dolazak sledećeg. Ukupno, četiri zasebna nadzorna procesa su mogla da restartuju taj server, na tajmerima od 5, 10, 15 i 30 minuta.
Pravilo koje smo izvukli iz toga
Provera ispravnosti ne sme da koristi ono što čuva. Oskudan resurs serverskog modela su njegova mesta za zahteve u toku. Provera koja zauzme jedno od tih mesta ili čeka na njega, deo je opterećenja koje treba da proceni. Proveravajte jeftino i restartujte samo kada možete da pokažete da je server zaglavljen.
Provera koja ga je zamenila
vLLM objavljuje svoje brojače na /metrics. Nova provera ih prvo čita:
- Zahtevi u toku i napredak motora: ispravno i zauzeto. Test zahtev se ne šalje.
- Zahtevi u toku i bez napretka između dva čitanja: zaglavljeno. Ovo je slučaj koji i dalje izaziva restart.
- Ništa u toku: neaktivno. Samo tada provera traži kratak odgovor, koji neaktivan motor daje odmah.
Prva verzija je računala generisane tokene kao napredak. Prošla je osam testova, a pri prvom radu u produkciji našla je server zauzetim i ispravnim: 2 zahteva u toku, 107 novih tokena između dva čitanja.
Šta smo promenili od tada
- Koraci pogona, a ne izlazni tokeni. Dok vLLM čita dugačak prompt, ne proizvodi izlazne tokene neko vreme, ali i dalje izvršava korake. Brojanje koraka (broj vllm:iteration_tokens_total) sprečava da dugačak prompt izgleda kao zaglavljen server.
- Dva čekanja pre nego što se označi „zaglavljen“, tako da kratka pauza ne broji kao greška.
- Ponovno pokretanje između dva očitavanja se detektuje preko vremena pokretanja procesa u istim metrikama; provera tada traži odgovor umesto da upoređuje brojače iz dva različita procesa.
- Proksi se proverava samo preko /models. Iza proksija sa najmanjim brojem konekcija, svako očitavanje /metrics može doći sa različitog backend-a, kao što smo otkrili kada smo pokrenuli kopiju modela na dve mašine. Backend-i se proveravaju direktno.
Razlika se lako uočava. Dok smo pisali ovu napomenu, oba naša serverska modela su izvršavala po 12 zahteva, što je njihov limit. Test zahtev bi čekao u redu. Nova provera je prijavila oba kao zauzeta i zdrava, sa 126 i 101 token u sekundi, bez slanja zahteva.
Factory Floor 1.0.2 isporučuje ovu proveru kao models/llm-health.py, sa testovima za neaktivne, zauzete, zaglavljene i ponovo pokrenute servere, server bez metrika, proksi i mrtav backend.