Verificarea noastră de sănătate a repornit de opt ori într-o zi un server de modele perfect funcțional
Operațiuni
Pe 22 iulie, un watchdog a repornit de opt ori serverul nostru local de modele. Niciuna dintre aceste reporniri nu a avut în spate un crash. Verificarea menită să mențină modelul activ a fost chiar cea care l-a doborât.
Ce s-a întâmplat
Serverul de modele a rulat vLLM pe o singură mașină NVIDIA GB10 și a produs aproximativ 8 tokeni pe secundă pentru o singură cerere. La fiecare cinci minute, un watchdog îi trimitea o cerere reală de chat și aștepta până la 45 de secunde pentru răspuns. Cinci verificări eșuate la rând însemnau un server blocat, iar watchdog-ul îl repornea. O repornire elimina modelul pentru câteva minute, în timp ce aproximativ 19 GB de greutăți se încărcau din nou.
În acea zi, o sarcină de lot ținea ocupate două până la patru cereri pe server timp de minute întregi. Cererea watchdog-ului aștepta în coadă în spatele lor, rămânea fără timp și era numărată ca eșec. După cinci astfel de verificări, un server sănătos a fost repornit. Aveam un fișier cu un indicator „ocupat” pe care watchdog-ul îl respecta, dar sarcina de lot nu îl seta niciodată.
Cum o repornire falsă a dus la următoarea
Fiecare repornire a eșuat cererile în curs cu o eroare 500 („cannot schedule new futures after shutdown”). Un al doilea watchdog număra erorile 500 și repornea serverul când erau prea multe, iar cu cât vedea mai multe erori, cu atât acționa mai repede. Astfel, fiecare repornire falsă făcea ca următoarea să vină mai devreme. În total, patru watchdog-uri separate puteau reporni acel server, la timere de 5, 10, 15 și 30 de minute.
Regula pe care am dedus-o din aceasta
O verificare de sănătate nu trebuie să folosească resursa pe care o păzește. Resursa rară a unui server de modele este reprezentată de sloturile pentru cereri în curs. O verificare care ocupă unul dintre aceste sloturi sau așteaptă pentru unul face parte din sarcina pe care ar trebui să o evalueze. Verificați ieftin și reporniți doar când puteți demonstra că serverul este blocat.
Verificarea care a înlocuit-o
vLLM publică propriile contoare la /metrics. Noua verificare le citește mai întâi:
- Cereri în execuție și motor care face progrese: sănătos și ocupat. Nu se trimite nicio cerere de test.
- Cereri în execuție și nicio progresie între două citiri: blocat. Acesta este cazul care încă repornește serverul.
- Nimic în execuție: inactiv. Abia atunci verificarea cere un răspuns scurt, pe care un motor inactiv îl oferă imediat.
Prima versiune număra tokenii generați ca progres. A trecut opt teste și, la prima rulare live, a găsit serverul ocupat și sănătos: 2 cereri în execuție, 107 tokeni noi între cele două citiri.
Ce am schimbat de atunci
- Pași de motor, nu tokeni de ieșire. În timp ce vLLM citește un prompt lung, nu produce tokeni de ieșire pentru o perioadă, dar continuă să facă pași. Numărarea pașilor (numărul din vllm:iteration_tokens_total) împiedică un prompt lung să pară un server blocat.
- Două așteptări înainte de „blocat”, astfel încât o pauză scurtă să nu fie considerată o eroare.
- O repornire între cele două citiri este detectată prin timpul de pornire a procesului din aceleași metrici; verificarea cere apoi un răspuns în loc să compare contoare din două procese diferite.
- Un proxy este verificat doar prin /models. În spatele unui proxy cu cea mai mică conexiune, fiecare citire a /metrics poate proveni de la un backend diferit, așa cum am constatat când am rulat o copie a modelului pe fiecare dintre două mașini. Backend-urile sunt verificate direct.
Diferența este ușor de observat. În timp ce scriam această notă, ambele servere ale noastre de modele rulau câte 12 cereri fiecare, limita lor. O cerere de test ar fi așteptat în coadă. Noua verificare a raportat ambele ca ocupate și sănătoase, la 126 și, respectiv, 101 tokeni pe secundă, fără a trimite una.
Factory Floor 1.0.2 include această verificare ca models/llm-health.py, cu teste pentru servere inactive, ocupate, blocate și repornite, un server fără metrici, un proxy și un backend mort.