מידע על שיטות לשיתוף 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. ‫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 פיזי יש הקצאה ייעודית של יכולת חישוב, זיכרון ורוחב פס. לכן, ל-container במחיצה יש תפוקה וחביון צפויים, גם כש-containers אחרים מגיעים לקיבולת המקסימלית במחיצות אחרות.

כל קונטיינר ניגש לקיבולת המלאה של ה-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 עם כמה מופעים במקביל הפעלת מעבדים גרפיים עם שיתוף זמן הפעלת יחידות GPU באמצעות NVIDIA MPS
שיטה מומלצת:

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

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

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

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

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

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

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

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

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

חלוקת זמן של 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 עבור מעבדים גרפיים.

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

תוויות של צמתים
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 משתמש בהתאמה אוטומטית לעומס ובהקצאת צמתים אוטומטית (NAP) כדי ליצור צמתים חדשים או מאגרי צמתים שתואמים לתווית. כברירת מחדל, לצמתים שהוקצו אוטומטית מוקצים התווית והערך הבאים לכל שיטה:

  • שיתוף זמן של 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 דוחה את עומס העבודה.

Standard:‏ GKE מתזמן עומסי עבודה בצמתים זמינים שמשתמשים בשיטות שיתוף ספציפיות.

  • אם יש כמה מאגרי צמתים משותפים עם ערכים שונים ל-cloud.google.com/gke-max-shared-clients-per-gpu, אפשר לתזמן את עומס העבודה בכל צומת זמין.
  • אם אין צמתים זמינים באף מאגר צמתים, הכלי Cluster Autoscaler מגדיל את מאגר הצמתים עם הערך הנמוך ביותר של 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 או ב-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.

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