קוונטיזציה של רשתות למידה עמוקה – מדריך מעשי
איך להקטין את זמני הפעולה של רשתות Deep learning, את כמות המשאבים והאנרגיה שהן צורכות ואת עלות החומרה עליה הן ירוצו, וכל זה תוך שמירה על דיוק התוצאות – מדריך מעשי
מודלים של למידה עמוקה הפכו לחלק בלתי נפרד מחיינו, אך גודלם והמורכבות שלהם יכולה להיות מכשול בפני ההטמעה שלהם בעולם האמיתי – על גבי מכשירים ניידים ומערכות Embedded. פתרון יעיל לבעיה זו יכול להיות קוונטיזציה. קוונטיזציה מאפשרת לנו להקטין באופן משמעותי את גודל המודלים ולשפר את יעילותם האנרגטית.
אז מהי בכלל קוונטיזציה של רשתות עצביות?
קוונטיזציה היא תהליך שגורם להפחתת הדיוק המספרי של הפרמטרים ברשת עצבית. במקום להשתמש במספרים שמיוצגים ב-floating point על ידי 32 סיביות, אנו עוברים למספרים שלמים של 8 סיביות. זה נשמע פשוט, אך ההשפעה יכולה להיות דרמטית: הקטנת גודל הזיכרון הנדרש, האצת זמני הריצה של הרשת והפחתת צריכת האנרגיה שהרשת דורשת.
ולמה זה חשוב?
- ביצועים משופרים: רשתות מקוונטזות רצות מהר יותר ודורשות פחות משאבי חישוב.
- חיסכון בזיכרון: ניתן להתאים יותר מודלים או לוגיקה נוספת באותו שבב.
- חיי סוללה ארוכים יותר: חשוב במיוחד במכשירים ניידים ומערכות IoT.
- עלות נמוכה יותר: אפשר להשתמש בחומרה פשוטה וזולה יותר.
יחד עם זאת צריך לזכור כי קוונטיזציה גורמת בהגדרה לאובדן של דיוק, מאחר ואנחנו משתמשים בפחות סיביות ולא משתמשים בנקודה עשרונית.
בואו נראה דוגמה מעשית ונבצע קוונטיזציה לרשת למידה עמוקה שמבצעת סגמנטציה סמנטית.
סגמנטציה סמנטית היא אלגוריתם בלמידה עמוקה שמשייך קטגוריה או Label לכל אחד מהפיקסלים שבתמונה.
נסתכל על מקרה שבו נרצה לבצע סגמנטציה סמנטית לתצלומי אוויר. המטרה של הרשת היא לזהות ולסווג אזורים שונים בתמונה לפי האם בפיקסלים מופיעה צמחייה או שלא מופיעה צמחייה. הרשת שנבחרה היא וריאציה של U-Net שידועה ביעילותה במשימות של סגמנטציה.
תהליך הקוונטיזציה:
- איסוף נתונים: שימוש במדגם תמונות לכיול הרשת.
- כיול: איסוף מידע על טווחי הערכים בכל שכבה.
- קוונטיזציה: המרת השכבות הכבדות חישובית (כמו קונבולוציה) ל-8 סיביות.
- תיקוף: בדיקת הדיוק לאחר הקוונטיזציה.
- יצירת קוד: הפקת קוד מותאם למטרה – CPU, GPU או FPGA.
בדוגמה שלנו נוריד את ה dataset RIT-18 שמכיל תמונות עם labels – הדאטה-סט נמצא כאן.
לאחר מכן נכניס את התמונות האלה לרשת המאומנת – הרשת נמצאת כאן.
לפנינו דוגמה לתוצאה שהתקבלה עבור תמונה מתוך המאגר שעברה ברשת שאומנה מראש.
כעת נפתח את אפליקציית Deep Network Quantizer, האפליקציה הזו היא ממשק משתמש שמאפשר לבצע את כל ה-workflow של הקוונטיזציה ללא כתיבת קוד. כמובן שניתן לבצע את התהליך כולו גם ללא האפליקציה באמצעות כתיבת קוד.
ועכשיו נבצע את הקליברציה של הרשת. MATLAB עושה זאת באמצעות בדיקת הערך המינימלי והערך המקסימלי של ה-Weights, ה-Bias וה-Activations של כל שכבה. על ידי בדיקת הערכים האלה ניתן לדעת איך לייצג את הערכים השונים באמצעות UINT8 תוך הקטנה ככל האפשר של overflow ו-underflow ובכך לשמור על הדיוק של ביצועי הרשת.
לחיצה על Quantize תבצע את הקוונטיזציה בהתאם.
אחר כך ב-Hardware Settings אפשר לבחור את הסביבה שבה נבצע את הוולידציה, ובלחיצה על Validate נבצע את הוולידציה עצמה.
לחיצה על Export תייצא לנו את הרשת ל-Workspace.
כמו שאמרנו קודם לכן ההטמעה של הרשת יכולה להיות ל-CPU, GPU ו-FPGA. כאן לדוגמה אפשר לראות איך להטמיע רשת מקוונטטת על FPGA.
אם נסתכל על ההפרש בביצועים ובגודל הרשת בדוגמה שלנו, הפחתנו את גודל הזיכרון הנדרש בכ-65 אחוזים, עם ירידה מינימלית בדיוק של תוצאות הרשת (מ-98% ל-96%). ההמחשה הזו מראה לנו שניתן לדחוס רשתות עמוקות תוך שמירה על ביצועים גבוהים.
את הדוגמה המלאה, שכוללת גם את קוד ה-MATLAB המלא, ניתן למצוא בקישור הזה.
לסיכום,
קוונטיזציה היא כלי חיוני בארגז הכלים של כל מי שעוסק בהטמעת מודלים של למידה עמוקה בחומרה. היא מאפשרת לנו להביא את העוצמה של הבינה המלאכותית למכשירים קטנים וחסכוניים, ובכך פותחת דלת לאינספור יישומים חדשים בתחומים מגוונים כמו ערים חכמות, רכבים אוטונומיים, מכשירים רפואיים מתקדמים ועוד. העתיד של הבינה המלאכותית נמצא לא רק בענן, אלא גם במכשיר הקטן שבכיס שלכם!
מידע נוסף על קוונטיזציה של רשתות למידה עמוקה ניתן למצוא בדף הזה.
במידה ותרצו לשמוע עוד, אתם מוזמנים ליצור אתנו קשר ולראות כיצד אנחנו יכולים ללוות ולעזור לכם להגיע למטרות שלכם 😊