Resource Optimization - איך כל הגורמים משפיעים בפועל על Latency ו-TPS
Resource Optimization - איך כל הגורמים משפיעים בפועל על Latency ו-TPS
בכל מערכת inference, כל שינוי קטן - בליבות, בזיכרון, או בדרך החלוקה של המשאבים - משפיע על שני מדדים עיקריים:
- Latency (זמן תגובה) - כמה זמן לוקח לבקשה אחת להסתיים.
- TPS (כמות תחזיות לשנייה) - כמה תחזיות המערכת מצליחה לעבד בשנייה.
כדי לשפר אחד, לעיתים מקריבים את השני. להבין את האיזון הזה - זו המהות של אופטימיזציה אמיתית.
איך NUMA, חלוקת ליבות ו-Resource Division מתחברים יחד
-
NUMA (Non-Uniform Memory Access) - כשמודל ניגש לזיכרון “מרוחק”, הוא מבזבז זמן על תקשורת בין מעבדים. התוצאה: עלייה ב-latency גם אם כוח העיבוד נשאר זהה.
-
חלוקת ליבות (Thread Affinity) - כשthreads נודדים בין ליבות, הם מאבדים את ה-cache המקומי, מה שמוריד יעילות ומוסיף עיכובים מיותרים. שמירה על affinity משפרת את היציבות ומונעת “קפיצות” ב-latency.
-
Resource Division (חלוקת משאבים בין מודלים) - אם שני מודלים מתחרים על אותם משאבים, כל אחד מהם יקבל פחות מה-CPU או הזיכרון הדרוש. זה מעלה latency ויכול להוריד throughput דרמטית. ניהול חכם (Isolation או Load Balancing נכון) מחזיר את האיזון.
איך למדוד נכון ולזהות את ה-Bottlenecks
מדידה שטחית של זמן ריצה לא מספרת את כל הסיפור. כדי להבין איפה צוואר הבקבוק, צריך לבחון כמה שכבות:
- CPU Utilization - האם כל הליבות עסוקות באמת או שחלק “מבזבזות זמן” בהמתנה?
- Memory Bandwidth - האם יש עומס גישה בין NUMA nodes?
- Thread Scheduling - האם threads קופצים בין ליבות?
- Latency Distribution - לא רק ממוצע, אלא גם סטיית תקן: חוסר יציבות הוא סימן לחלוקה לא נכונה.
עקרונות לניסוי ובדיקת אופטימיזציה
- שנה רק פרמטר אחד בכל ניסוי - אחרת אי אפשר לדעת מה באמת השפיע.
- מדוד לאורך זמן - מערכות inference מושפעות גם מתנודות עומס.
- עקוב אחרי מדדים עקביים (TPS, P99 latency, CPU usage).
- השווה תצורות NUMA / affinity / isolation תחת אותם תנאים בדיוק.
- תעד כל שינוי - גם אופטימיזציה קטנה עלולה להיראות הפוכה כשלא נבדקת בהקשר הנכון.
בשורה התחתונה
שום רכיב - NUMA, ליבות, או משאבים - לא עומד בפני עצמו. רק כשמבינים איך כולם מתקשרים זה עם זה, אפשר להגיע לאופטימיזציה אמיתית: מערכת שבה כל חישוב מנוצל, כל thread נמצא במקום הנכון, וכל תחזית יוצאת בזמן - בלי לבזבז אף מיקרו-שנייה.
📚 פוסטים נוספים בסדרה: אופטימיזציה של חומרת הסקה
- חלק 1 למה בכלל צריך להבין חומרה כשעוסקים באופטימיזציות Inference?
- חלק 2 מה זה NUMA ולמה זה חשוב באופטימיזציות Inference?
- חלק 3 מה זה ליבות (Cores) ו-Threads?
- חלק 4 מה זה Cache ולמה הוא משנה הכל?
- חלק 5 חלקת ליבות איך לנהל נכון את כח העיבוד שלך
- חלק 6 Thread Affinity - How to Bind Cores Smartly
- חלק 7 Divided Resources - איך מחלקים משאבים בין מודלים או תהליכים
- חלק 9 סיכום הסדרה: מ-NUMA ועד Throughput - איך אופטימיזציה הופכת חומרה לביצועים