לדלג לתוכן

דיוק חצי ומעורב באימון מודלים מוסבר - למה פחות ביטים זה לפעמים יותר טוב

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

איך בכלל מייצגים מספרים במחשב

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

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

למה פחות ביטים אומר יותר מהירות

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

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

אז למה בכלל להשתמש ב-FP32

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

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

מה זה בעצם דיוק מעורב - mixed precision

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

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

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

האיזון בין מהירות לדיוק

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

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

לסיכום

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

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

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