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:

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

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.

Actualizat: