בדיקת הבריאות שלנו הפעילה מחדש שרת מודלים תקין שמונה פעמים ביום אחד
תפעול
ב-22 ביולי שומר סף הפעיל מחדש את שרת המודלים המקומי שלנו שמונה פעמים. לאף אחת מההפעלות מחדש לא היה קריסה מאחוריה. הבדיקה שהייתה אמורה לשמור על המודל פעיל היא זו שהפילה אותו.
מה קרה
שרת המודלים הרץ vLLM על מכונת NVIDIA GB10 אחת וייצר כ-8 טוקנים לשנייה עבור בקשה בודדת. כל חמש דקות שומר סף שלח לו בקשת צ'אט אמיתית והמתין עד 45 שניות לתשובה. חמש בדיקות שנכשלו ברצף סימנו שרת תקוע, ושומר סף הפעיל אותו מחדש. הפעלה מחדש לקחה את המודל מהשירות למשך מספר דקות בזמן שכ-19 GB של משקולות נטענו מחדש.
באותו יום משימת אצווה (batch job) תפסה בין שתיים לארבע בקשות על השרת למשך דקות ארוכות. בקשת שומר הסף המתנה בתור מאחוריהן, אזלה את הזמן ונספרה ככשל. לאחר חמש בדיקות כאלה, שרת תקין הופעל מחדש. היה לנו קובץ דגל "עסוק" ששומר הסף כיבד, אך משימת האצווה מעולם לא הגדירה אותו.
כיצד הפעלה מחדש שגויה אחת הובילה לבאה
כל הפעלה מחדש נכשלה בבקשות שביצעו פעולה עם שגיאת 500 ("cannot schedule new futures after shutdown"). שומר סף שני ספר שגיאות 500 והפעיל מחדש את השרת כאשר היו יותר מדי, וככל שראה יותר שגיאות, כך פעל מהר יותר. כך כל הפעלה מחדש שגויה גרמה לבאה להגיע מוקדם יותר. בסך הכול, ארבעה שומרי סף נפרדים יכלו להפעיל מחדש את השרת, על טיימרים של 5, 10, 15 ו-30 דקות.
הכלל שלקחנו מכך
בדיקת בריאות אסור שתשתמש במה שהיא שומרת עליו. המשאב המצומצם של שרת מודלים הוא החריצים (slots) לבקשות בתהליך. בדיקה שתופסת חריץ אחד מהם, או ממתינה לאחד, היא חלק מהעומס שהיא אמורה לשפוט. בדוק בזול, והפעל מחדש רק כאשר אתה יכול להוכיח שהשרת תקוע.
הבדיקה שהחליפה אותה
vLLM מפרסם מונים משלו ב-/metrics. הבדיקה החדשה קוראת אותם תחילה:
- בקשות רצות והמנוע מתקדם: תקין ועסוק. לא נשלחת בקשת בדיקה.
- בקשות רצות ואין התקדמות בין שתי קריאות: תקוע. זה המקרה שעדיין מפעיל מחדש.
- שום דבר לא רץ: סרק. רק אז הבדיקה מבקשת תשובה קצרה, שמנוע בסרק נותן מיד.
הגרסה הראשונה ספרה טוקנים שנוצרו כהתקדמות. היא עברה שמונה בדיקות, ובתפעול חי ראשון מצאה את השרת עסוק ותקין: 2 בקשות רצות, 107 טוקנים חדשים בין שתי הקריאות.
מה שינינו מאז
- צעדי מנוע, לא טוקנים של פלט. בזמן ש-vLLM קורא פרומפט ארוך, הוא לא מייצר טוקנים של פלט למשך זמן מה אך עדיין מבצע צעדים. ספירת הצעדים (הספירה של vllm:iteration_tokens_total) מונעת מפרומפט ארוך להיראות כשרת תקוע.
- שתי המתנות לפני "תקוע", כדי שהפסקה קצרה לא תיחשב לכשל.
- הפעלה מחדש בין שתי הקריאות מזוהה לפי זמן ההפעלה של התהליך באותם מדדים; הבדיקה אז מבקשת תשובה במקום להשוות מונים משני תהליכים שונים.
- פרוקסי נבדק דרך /models בלבד. מאחורי פרוקסי עם חלוקת עומס לפי מספר החיבורים המינימלי, כל קריאה ל-/metrics יכולה להגיע מבקנד שונה, כפי שמצאנו כשהרצנו עותק של המודל על כל אחד משני מכונות. הבקנדים נבדקים ישירות.
ההבדל קל לזיהוי. בזמן שכתבנו את ההערה הזו, שני שרתי המודלים שלנו רצו 12 בקשות כל אחד, שהיה הגבול שלהם. בקשת בדיקה הייתה ממתינה בתור. הבדיקה החדשה דיווחה על שניהם כעסוקים ובריאים, ב-126 ו-101 טוקנים לשנייה, בלי לשלוח בקשה.
Factory Floor 1.0.2 כוללת את הבדיקה הזו כ-models/llm-health.py, עם בדיקות לשרתים במצב מנוחה, עסוק, תקוע ומותקן מחדש, שרת ללא מדדים, פרוקסי ובקנד מת.