לדלג לתוכן

וירטואליזציה של GPU מוסברת - איך חולקים כרטיס אחד בין כמה משתמשים

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

למה בכלל צריך לחלק כרטיס GPU

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

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

שתי גישות לחלוקה - זמן מול חלל

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

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

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

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

מה NVIDIA בנתה בשביל זה

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

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

למה זה כל כך חשוב בענן ובסביבות משותפות

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

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

למה זה מורכב יותר מוירטואליזציה של מעבד

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

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

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

לסיכום

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

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

הצטרפו לקהילה בדיסקורד