תוכן עניינים
אמ:לק - פייסבוק (מטא\מתה) חוללה סערה ברשת הלילה כאשר הכריזה על גרסה חדשה למודל השפה שלה: לאמה-3.1, מדובר במודל עצום שיהיה פתוח לשימוש מסחרי. אבל כדי להריץ אותו צריך להבין מה דרוש ברמת החומרה והזיכרון, ואיך שוב - הכל סובב סביב קוונטיזציה. בואו נדבר על הכל.
לפני הכל - קרדיט
דיסקליימר: הנתונים במאמר הזה לקוחים מהקורס המדהים של יסודות הקוונטיזציה שזמין בחינם בפלטפורמה של אנדרו אינג האדיר (DeepLearning.AI):
בואו נצלול לדרמה שהתרחשה הלילה
ידיעה חדשה סחפה את הרשת ואת כל עולם ה-AI: פייסבוק (או מטא) הכריזה על גרסה חדשה למודל השפה הגדול שלה: לאמה-3.1. מודל ענקי בגודל של 405 מיליארד פרמטרים(!), שמשוחרר לכולם בחינם לרבות לצרכים מסחריים!
כדי שנבין, מדובר במודל בסדר גודל של קלוד Sonnet או GPT-3, אלה מודלים מסחריים מאוד רציניים ופייסבוק משחררת בחינם את המודל הזה, שעלות האימון שלו נאמדת במיליונים רבים של דולרים! (פעם מישהו חכם אמר: אם נותנים לכם מוצר בחינם, כנראה שאתם המוצר)
זו בשורה מרעישה ומרגשת. אך אליה - וקוץ בה. למה קוץ? כי יש בעיה. מחקר שבוצע נכון לסוף שנת 2022, הציג בצורה מאוד מוחשית את קצב עליית הגודל של מודלים גדולים של שפה אל מול החומרה הקיימת בשוק והזיכרון שניתן להשתמש בו לטובת הרצת מודלים כאלה.
בגרף מטה, ניתן לראות בבירור באדום את עליית הגודל של המודלים, אל מול המקום בו נמצאת החומרה (בצהוב), עד כדי כך שכרטיס דגל של חברת NVIDIA הגדולה שנקרא A100, מכיל 80 גיגה זיכרון ״בלבד״, בעוד שמודל במשקל 530 מיליארד פרמטרים ידרוש כ-2 טרה (כ-2000 גיגה) זיכרון! (אם הפרמטרים מיוצגים ב-32 סיביות)
נקח למשל את כרטיס המסך שמקבלים בגוגל קולאב, הפלטפורמה להרצת קוד פייתון בענן שמתאפשרת בחינם על ידי גוגל. אנו מקבלים שם כרטיס מדגם T4 כברירת מחדל, זה כרטיס עם 16 גיגה זיכרון. אבל כיום מודלים ממוצעים שמבצעים בהם שימוש הם בעלי 70 מיליארד פרמטרים, שבחישוב פשוט מדובר ב-280 גיגה אם מייצגים מספרים ב-32 סיביות, ו-70 גיגה אם משתמשים בייצוג של 8. עדיין הרבה יותר ממה שהכרטיס יכול להתמודד איתו.
אז מה עושים? בעולם המחשוב בונים ״קלאסטרים״, שזה אומר שמצרפים מספר מחשבים ביחד כדי להגדיל את כוח העיבוד של החומרה. שילוב של מספר מחשבים וכרטיסי מסך ביחד תאפשר טעינת מודל שתתחלק על פני משאבים רבים, מה שיהיה כרוך בעלויות גבוהות.
כיוון שכך, אנשים חכמים מאוד הצליחו להמציא טכניקות ל-״דחיסת״ גודל של מודל כגון:
Pruning - הסרת משקולות מרשתות נוירונים. מנסים לבחון לאיזה משקולות אין ערך משמעותי ברשת, מסירים אותם ובכך מקטינים את גודל המודל.
Knowledge Distillation - טכניקה שבה לוקחים פלט של מודל שפה גדול ומאמנים באמצעותו מודל שפה קטן. כמו לקחת פרופסור, לשאול אותו שאלות, ואת התשובות שלו ללמד תלמיד. התלמיד קטן מהפרופסור אבל הוא יכול לקבל את חכמת הפרופסור. או רבו. מה שתרצו.
רענון זיכרון
אם זכור לכם, דיברנו במאמר הקודם על חישוב זיכרון שנדרש כדי להריץ מודל שפה על המחשב. אם אתם רוצים לרענן את הזיכרון אתם מוזמנים לקרוא ממש כאן:
בואו נחשב כמה זיכרון צריך כדי להריץ את לאמה-3.1 על המחשב שלנו
המודל הוא בגודל של 405 מיליארד פרמטרים. הסברנו שכל פרמטר הוא ערך מספרי. בעולם המחשוב ניתן לייצג ערכים מספריים באמצעות סיביות (bits, ביטים). למה שמם ביטים? כי הם מהווים קיצור לצמד המילים Binary Digits, ספרות בינאריות. מה זה אומר? נארי זה מספר, בי זה שניים. הכוונה היא לשני מספרים, 0 או 1. בינארי.
כדי לייצג מספר, אנו זקוקים לכל הפחות ל-8 סיביות (8 ביטים). ייצוג מספרי באמצעות 8 ביטים תופס בזיכרון של המחשב 8 תאים. כל ביט - תא אחד.
ככל שהמספרים מורכבים יותר, אנו זקוקים ליותר זיכרון לייצג אותם. יש הבדל בין לייצג את הספרה 7, לבין לייצג את המספר 7.83274893274829. כדי לייצג את 7 נוכל להשתמש ב-8 סיביות, אך כדי לייצג את המספר הארוך הזה נצטרך יותר מקומות בזיכרון. דמיינו שהערך המספרי האמיתי הוא 7.83 אך אנו משתמשים בייצוג מספרי עגול כך שהוא הופך ל-7. במקרה כזה איבדנו דיוק. פספסנו ב-0.83. אמרנו שהערך הוא 7 כאשר הוא 7.83. ואם הערך הוא בעצם 7.8327493 אז איבדנו אפילו יותר מידע כשייצגנו אותו ב-7.83 בלבד.
אנחנו מתחילים להבין מה קורה פה נכון? כדי לקבל דיוק מירבי אנו צריכים להשתמש ביותר ספרות, שזה אומר להשתמש ביותר תאים בזיכרון של המחשב. כמה יותר? כיום מקובל לייצג מספרים באמצעות 32 סיביות (4 ״בייטים״ או ״בתים״). זה מה שנקרא ייצוג באמצעות נקודה צפה באורך 32, Floating Point 32 או fp32.
ומה אם היינו רוצים לייצג ערך עם פחות סיביות? אין בעיה, אפשר ללכת גם על נקודה צפה באורך של 16 סיביות, fp16, וכך לצמצם את התאים בזיכרון בחצי (16 סיביות במקום 32, 2 בייטים במקום 4).
אם נמשיך כך נוכל ללכת אפילו על ייצוג של מספר ״שלם״, 7 במקום 7.83, זה אפשרי על ידי שימוש ב-8 סיביות, ״בייט״ אחד בלבד. חתכנו את המקום הדרוש בזיכרון מ-32 סיביות ל-8! כמעט רבע! זה משמעותי!
זול עולה ביוקר
אבל כמו שהבנו, אנחנו משלמים על ההפחתה הזו מחיר. איזה מחיר? דיוק. הדיוק שלנו נפגע כאשר אנו מנסים לחסוך. לכן יש כאן Trade Off: מה יותר משתלם לנו? להשתמש ביותר זיכרון ולשלם יותר על חומרה חזקה? או להתפשר על הדיוק של המודל ולהריץ אותו על חומרה פחות חזקה, אולי אפילו על המחשב האישי שלנו או Raspberry Pi? (מחשב בגודל כרטיס אשראי עם זיכרון מינימלי)
חזרה לחישוב:
405 מיליארד פרמטרים, בהנחה שכל מספר מיוצג ע״י fp32, המשמעות היא 405 כפול 4 (כי כל מספר מיוצג ע״י 4 בייטים):
405 כפול 4 = 1.620 טריליון(!!) בייטים, שזה 1620 גיגה של זיכרון. המחשב הביתי הממוצע יעמוד על כ-64 גיגה זיכרון. אנחנו מדברים על כמעט פי 30!
ואם נגיד: אוקיי, אז לא נשתמש ב-32 אלא ב-16? אחלה, אז נצטרך ״רק״ 810 גיגה. ואם נמשיך כך לכיוון ייצוג עם 8? מעולה, נצטרך ״רק״ 405 גיגה. אבל לאיזה מחשב ביתי יש יכולת להריץ כזו חומרה? אין. לכן הפיתרון יהיה שימוש במשאבי ענן (אך נצטרך לשלם בהתאם היות ומדובר בהמון משאבים). או שאנחנו נשכור משאבי מחשוב בענן, או שנשלם לספק אחר שמבצע זאת עבורנו ונשלם רק בכל פעם שאנחנו קוראים למודל כזה.
ומה לגבי הדיוק? הרי ירדנו מ-32 ל-8, זה אומר שהדיוק שלנו נפגע. הדיוק הוא לא רק מספר. המשמעות שלו היא איכות ההתנהגות של המודל, התגובות שנקבל, כל ההתנהלות, השיחה עצמה. ההקשר. הכל מושפע מזה. אז ירדנו במשקל, אחלה. אבל שילמנו המון על ה״בריאות״ של המודל שלנו.
אז זו ממש טעימה מעולם הקוונטיזציה. בעולם הקוד ניתן להשתמש בספריית הפייתון המדהימה PyTorch שמאפשרת לנו לצלול לעומק מדע הנתונים (Data Science) ולמידת המכונה (Machine Learning). הצלילה היא כל כך מדהימה שניתן אפילו להגדיר משתנים בייצוג מספרי משתנה ולראות הכל בעיניים. תוכלו לקרוא על PyTorch ממש כאן:
אז זה היה המבוא המהיר מ-0 ל-100 על קוונטיזציה, מקווה שקיבלתם ערך ואשמח לקרוא מה חשבתם בתגובות.
תודה שקראתם,
יובל