מידע על שיטות לשיתוף GPU ב-GKE

בדף הזה מוסברות המאפיינים והסוגים הטובים ביותר של עומסי עבודה לכל אסטרטגיית שיתוף GPU שזמינה ב-Google Kubernetes Engine‏ (GKE), כמו GPUs מרובי-מופעים, שיתוף זמן GPU ו-NVIDIA MPS. שיתוף GPU עוזר לכם לצמצם את הקיבולת שלא מנוצלת באשכול, ולספק לעומסי העבודה קיבולת מספיקה להשלמת המשימות.

הדף הזה מיועד לאדמינים ולמפעילים של פלטפורמות, ולמומחים בתחום הנתונים וה-AI שרוצים להריץ עומסי עבודה מבוססי-GPU שצורכים את קיבולת ה-GPU בצורה יעילה ככל האפשר. מידע נוסף על תפקידים נפוצים שאנחנו מתייחסים אליהם בתוכן של Google Cloud , זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE.

לפני שקוראים את הדף הזה, חשוב להכיר את המושגים הבאים:

איך בקשות ל-GPU פועלות ב-Kubernetes

ב-Kubernetes, עומסי עבודה יכולים לבקש בדיוק את כמות המשאבים שהם צריכים כדי לפעול. אפשר לבקש יחידות חלקיות של CPU לעומסי עבודה, אבל אי אפשר לבקש יחידות חלקיות של GPU. בקובצי מניפסט של Pod צריך לבקש משאבי GPU במספרים שלמים, כלומר, GPU פיזי שלם מוקצה לקונטיינר אחד, גם אם הקונטיינר צריך רק חלק מהמשאבים כדי לפעול בצורה תקינה. הגישה הזו לא יעילה ויכולה להיות יקרה, במיוחד כשמריצים כמה עומסי עבודה עם דרישות דומות של GPU נמוך.

שיטה מומלצת:

כדי לשפר את ניצול ה-GPU כשעומסי העבודה לא צריכים את כל משאבי ה-GPU, אפשר להשתמש באסטרטגיות לשיתוף GPU.

מהן שיטות לשיתוף GPU?

שיטות לשיתוף מעבד גרפי מאפשרות לכמה קונטיינרים להשתמש ביעילות במעבדים הגרפיים המצורפים ולחסוך בעלויות ההפעלה. ‫GKE מספק את האסטרטגיות הבאות לשיתוף GPU:

  • Multi-instance GPU: ‏ GKE מחלק GPU יחיד נתמך לעד שבעה חלקים. אפשר להקצות כל פרוסה למאגר אחד בצומת באופן עצמאי, עד שבעה מאגרים לכל GPU. ‫Multi-instance GPU (GPU עם כמה מופעים) מספק בידוד חומרה בין עומסי העבודה, בנוסף לאיכות שירות (QoS) עקבית וצפויה לכל הקונטיינרים שפועלים ב-GPU.
  • שיתוף זמן ב-GPU: ‏ GKE משתמש ביכולת המובנית של שיתוף זמן שמסופקת על ידי ה-GPU של NVIDIA וערימת התוכנה. החל מארכיטקטורת Pascal, מעבדי GPU של NVIDIA תומכים בהקדמה ברמת ההוראה. כשמבצעים החלפת הקשר בין תהליכים שפועלים ב-GPU, מניעת קדימות ברמת ההוראה מבטיחה שכל תהליך יקבל פרוסת זמן הוגנת. שיתוף זמן ב-GPU מספק בידוד ברמת התוכנה בין עומסי העבודה מבחינת בידוד של מרחב כתובות, בידוד ביצועים ובידוד שגיאות.
  • NVIDIA MPS: ‏ GKE משתמש ב-Multi-Process Service‏ (MPS) של NVIDIA. ‫NVIDIA MPS היא הטמעה חלופית של CUDA API, שתואמת לקבצים בינאריים. היא נועדה לאפשר באופן שקוף להריץ במקביל עומסי עבודה של CUDA מרובי-תהליכים במכשיר GPU יחיד. ה-GPU עם NVIDIA MPS מספק בידוד ברמת התוכנה מבחינת מגבלות המשאבים (אחוז השרשורים הפעילים וזיכרון המכשיר המוצמד).

באיזו אסטרטגיה של שיתוף GPU להשתמש

בטבלה הבאה מפורטים המאפיינים של שיטות השיתוף השונות של GPU:

GPU עם כמה מופעים במקביל שיתוף זמן ב-GPU NVIDIA MPS
כללי שיתוף מקביל של GPU בין מאגרי תגים החלפת הקשר מהירה שיתוף מקביל של GPU בין מאגרי תגים
בידוד מעבד GPU יחיד מחולק לעד שבעה חלקים, ולכל קונטיינר באותו מעבד GPU פיזי יש הקצאה ייעודית של יכולת חישוב, זיכרון ורוחב פס. לכן, למאגר במחיצה יש תפוקה וחביון צפויים, גם כשמאגרים אחרים מגיעים לקיבולת המקסימלית במחיצות אחרות.

כל קונטיינר ניגש לקיבולת המלאה של ה-GPU הפיזי הבסיסי על ידי החלפת הקשר בין תהליכים שפועלים ב-GPU.

עם זאת, שיתוף זמן לא מספק אכיפה של מגבלת זיכרון בין משימות משותפות, והחלפת ההקשר המהירה לגישה משותפת עלולה ליצור תקורה.

ל-NVIDIA MPS יש בידוד משאבים מוגבל, אבל היא גמישה יותר בהיבטים אחרים, למשל סוגי GPU ומקסימום יחידות משותפות, מה שמפשט את הקצאת המשאבים.
מתאים לעומסי העבודה הבאים מומלץ לעומסי עבודה שפועלים במקביל וצריכים חוסן מסוים ואיכות שירות (QoS). לדוגמה, כשמריצים עומסי עבודה של הסקת מסקנות מ-AI, ‏ GPU עם כמה מופעים מאפשר להריץ כמה שאילתות הסקת מסקנות בו-זמנית כדי לקבל תשובות מהירות, בלי שהן יאטו אחת את השנייה.

מומלץ לעומסי עבודה (workloads) אינטראקטיביים עם תקופות של חוסר פעילות, שבהם יש שימוש אינטנסיבי במשאבים לפרקי זמן קצרים. עומסי העבודה האלה לא יעילים מבחינת עלות עם יחידת GPU ייעודית לחלוטין. באמצעות שיתוף זמן, עומסי עבודה מקבלים גישה מהירה ל-GPU כשהם בשלבים פעילים.

שיתוף זמן של GPU מתאים במיוחד לתרחישים שבהם רוצים להימנע ממצב שבו מעבדי GPU יקרים לא פעילים, ושבהם בידוד מלא וגישה רציפה ל-GPU לא נדרשים. לדוגמה, כשמספר משתמשים בודקים או יוצרים אב טיפוס של עומסי עבודה.

עומסי עבודה שמשתמשים בשיתוף זמן צריכים להיות סובלניים לפשרות מסוימות בביצועים ובזמן האחזור.

מומלץ לעיבוד ברצף (batch processing) למשימות קטנות כי MPS ממקסם את התפוקה ואת השימוש המקביל ב-GPU. ‫MPS מאפשר לעבד ביעילות במקביל משימות אצווה לעומסי עבודה קטנים עד בינוניים.

‫NVIDIA MPS הוא פתרון אופטימלי לתהליכים שיתופיים שפועלים כאפליקציה אחת. לדוגמה, עבודות MPI עם מקביליות של דרגות MPI. בעזרת המשימות האלה, כל תהליך קטן של CUDA (בדרך כלל דרגות MPI) יכול לפעול בו-זמנית ב-GPU כדי להגיע לניצול מלא של כל ה-GPU.

עומסי עבודה שמשתמשים ב-CUDA MPS צריכים להיות מסוגלים להתמודד עם המגבלות של הגנה על הזיכרון ושל בלימת שגיאות.

מעקב מדדי השימוש ב-GPU לא זמינים עבור מעבדי GPU מרובי-מופעים. אפשר להשתמש ב-Cloud Monitoring כדי לעקוב אחרי הביצועים של שיתוף הזמן של ה-GPU. מידע נוסף על המדדים הזמינים מופיע במאמר מעקב אחר שיתוף זמן של GPU או צמתים של NVIDIA MPS. אפשר להשתמש ב-Cloud Monitoring כדי לעקוב אחרי הביצועים של NVIDIA MPS. מידע נוסף על המדדים הזמינים מופיע במאמר מעקב אחר שיתוף זמן של GPU או צמתים של NVIDIA MPS.
בקשת יחידות GPU משותפות בעומסי עבודה הפעלת מעבדים גרפיים מרובי-מופעים הפעלת מעבדים גרפיים עם שיתוף זמן הפעלת יחידות GPU באמצעות NVIDIA MPS
שיטה מומלצת:

כדי למקסם את השימוש ב-GPU, כדאי לשלב בין אסטרטגיות שונות לשיתוף GPU. לכל מחיצת GPU עם כמה מופעים במקביל, משתמשים בשיתוף זמן או ב-NVIDIA MPS. לאחר מכן תוכלו להריץ כמה קונטיינרים בכל מחיצה, כשהקונטיינרים האלה חולקים גישה למשאבים במחיצה הזו. מומלץ להשתמש באחת מהקומבינציות הבאות:

  • ‫GPU כמה מופעים במקביל ושיתוף זמן GPU.
  • מעבד גרפי (GPU) עם כמה מופעים ו-NVIDIA MPS.

איך פועלות שיטות השיתוף של ה-GPU

אפשר לציין את המספר המקסימלי של קונטיינרים שמותר להם לשתף GPU פיזי:

  • ב-Autopilot clusters, ההגדרה הזו מוגדרת במפרט של עומס העבודה.
  • ב-Standard clusters, ההגדרה הזו נקבעת כשיוצרים מאגר צמתים חדש עם יחידות GPU מצורפות. כל יחידת GPU במאגר הצמתים משותפת על סמך ההגדרה שאתם מציינים ברמת מאגר הצמתים.

בקטעים הבאים מוסבר על התנהגות התזמון והפעולה של כל אסטרטגיית שיתוף של GPU.

GPU עם כמה מופעים במקביל

כדי לבקש GPU עם כמה מופעים בעומסי עבודה, מציינים את התווית cloud.google.com/gke-gpu-partition-size בשדה Pod spec‏ nodeSelector, בקטע spec: nodeSelector.

מערכת GKE מתזמנת את עומסי העבודה לצמתים המתאימים שזמינים על ידי התאמה של התוויות האלה. אם אין צמתים מתאימים זמינים, מערכת GKE משתמשת בהתאמה אוטומטית לעומס ובאספקת צמתים אוטומטית כדי ליצור צמתים חדשים או מאגרי צמתים שתואמים לתווית הזו.

שיתוף זמן GPU או NVIDIA MPS

אתם יכולים לבקש שיתוף זמן של GPU או NVIDIA MPS בעומסי עבודה על ידי ציון התוויות הבאות בשדה nodeSelector של מפרט ה-Pod, בקטע spec:nodeSelector.

  • cloud.google.com/gke-max-shared-clients-per-gpu: בחירת צמתים שמאפשרים למספר מסוים של לקוחות לשתף את ה-GPU הבסיסי.
  • cloud.google.com/gke-gpu-sharing-strategy: בחירת צמתים שמשתמשים באסטרטגיית שיתוף הזמן או ב-NVIDIA MPS עבור יחידות GPU.

בטבלה הבאה מוסבר איך משתנה התנהגות התזמון בהתאם לשילוב של תוויות הצמתים שאתם מציינים במניפסטים.

תוויות של צמתים
cloud.google.com/gke-max-shared-clients-per-gpu

and

cloud.google.com/gke-gpu-sharing-strategy

‫GKE מתזמן עומסי עבודה בצמתים זמינים שתואמים לשתי התוויות.

אם אין צמתים זמינים, מערכת GKE משתמשת בהתאמה אוטומטית לעומס ובהקצאת צמתים אוטומטית כדי ליצור צמתים חדשים או מאגרי צמתים שתואמים לשתי התוויות.

רק cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot: המערכת של GKE דוחה את עומס העבודה.

Standard: מערכת GKE מתזמנת עומסי עבודה בצמתים זמינים שתואמים לתווית. אם אין צמתים זמינים, GKE משתמש בהתאמה אוטומטית לעומס ובאספקת צמתים אוטומטית כדי ליצור צמתים חדשים או מאגרי צמתים שתואמים לתווית. כברירת מחדל, הצמתים שמוקצים אוטומטית מקבלים את התווית והערך הבאים לכל שיטה:

  • שיתוף זמן של GPU: cloud.google.com/gke-gpu-sharing-strategy: time-sharing
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy: mps
רק cloud.google.com/gke-gpu-sharing-strategy

Autopilot: המערכת של GKE דוחה את עומס העבודה.

רגיל: מערכת GKE מתזמנת עומסי עבודה בצמתים זמינים שמשתמשים באסטרטגיות שיתוף ספציפיות.

  • אם יש כמה מאגרי צמתים משותפים עם ערכים שונים ל-cloud.google.com/gke-max-shared-clients-per-gpu, אפשר לתזמן את עומס העבודה בכל צומת זמין.
  • אם אין צמתים זמינים באף מאגר צמתים, המידרוג האוטומטי של האשכול מגדיל את מאגר הצמתים עם הערך הנמוך ביותר של cloud.google.com/gke-max-shared-clients-per-gpu.
  • אם כל מאגרי הצמתים מלאים, הקצאת צמתים אוטומטית (NAP) יוצרת מאגר צמתים חדש עם ערך ברירת מחדל של cloud.google.com/gke-max-shared-clients-per-gpu=2

תהליך הבקשה ל-GPU שאתם משלימים זהה לשימוש ב-GPU בשיתוף זמן ולשימוש באסטרטגיית NVIDIA MPS.

אם אתם מפתחים אפליקציות GPU שפועלות ב-GPU time-sharing או ב-NVIDIA MPS, אתם יכולים לבקש רק GPU אחד לכל קונטיינר. מערכת GKE דוחה בקשה ליותר מ-GPU אחד בקונטיינר כדי למנוע התנהגות לא צפויה. בנוסף, מספר ה-GPU שנדרש עם שיתוף זמן ו-NVIDIA MPS לא משקף את כוח המחשוב שזמין לקונטיינר.

בטבלה הבאה מפורטות הכמויות הצפויות של יחידות GPU שתקבלו כשאתם מבקשים כמות מסוימת.

בקשות ל-GPU שחלות על שיתוף זמן של GPU ועל NVIDIA MPS
שיתוף זמן של GPU אחד או NVIDIA MPS לכל קונטיינר ‫GKE מאפשר את הבקשה, גם אם לצומת יש GPU פיזי אחד או כמה GPU פיזיים.
יותר מאחד: שיתוף זמן של GPU לכל מאגר

הבקשה נדחית על ידי GKE.

ההתנהגות הזו זהה כשמבקשים יותר ממופע אחד של GPU עם כמה מופעים במקביל במאגר, כי כל מופע של GPU נחשב ל-GPU פיזי נפרד.

יותר מ-NVIDIA MPS אחד לכל קונטיינר

על סמך מספר המעבדים הגרפיים הפיזיים בצומת, GKE מבצע את הפעולות הבאות:

  • ‫GKE מאפשר את הבקשה אם לצומת יש רק GPU פיזי אחד.
  • ‫GKE דוחה את הבקשה כשיש לצומת כמה מעבדי GPU פיזיים. ההתנהגות הזו זהה כשמבקשים יותר ממופע אחד של GPU עם כמה מופעים במקביל במאגר, כי כל מופע של GPU נחשב ל-GPU פיזי נפרד.

אם GKE דוחה את עומס העבודה, מוצגת הודעת שגיאה דומה לזו:

status:
  message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
    for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
  phase: Failed
  reason: UnexpectedAdmissionError

מעקב אחרי שיתוף זמן של GPU או צמתים של NVIDIA MPS

אפשר להשתמש ב-Cloud Monitoring כדי לעקוב אחרי הביצועים של צמתי שיתוף הזמן של GPU או NVIDIA MPS. ‫GKE שולח מדדים לכל צומת GPU אל Cloud Monitoring. המדדים האלה של שיתוף זמן ב-GPU או של צומת NVIDIA MPS חלים ברמת הצומת (node/accelerator/).

אפשר לבדוק את המדדים הבאים לכל צומת של שיתוף זמן ב-GPU או NVIDIA MPS ב-Cloud Monitoring:

  • דיוטי סייקל (node/accelerator/duty_cycle): אחוז הזמן במהלך תקופת הדגימה האחרונה (10 שניות) שבה צומת ה-GPU עיבד באופן פעיל. הטווח הוא מ-1% עד 100%.
  • השימוש בזיכרון (node/accelerator/memory_used): כמות הזיכרון של המאיץ שהוקצה בבייטים לכל צומת GPU.
  • קיבולת הזיכרון (node/accelerator/memory_total): הזיכרון הכולל של המאיץ בבייטים לכל צומת GPU.

המדדים האלה שונים מהמדדים של מעבדי GPU רגילים שלא מבוססים על שיתוף זמן או על צמתים של NVIDIA MPS. המדדים של מעבדי GPU פיזיים רגילים חלים ברמת הקונטיינר (container/accelerator) ולא נאספים עבור קונטיינרים שמתוזמנים ב-GPU שמשתמש בשיתוף זמן GPU או ב-NVIDIA MPS.

המאמרים הבאים