אופטימיזציה של מודל

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

TensorFlow Lite ו-TensorFlow Model Optimization Toolkit מספקים כלים למזעור המורכבות של ביצוע אופטימיזציה להסקת מסקנות.

מומלץ לשקול אופטימיזציה של המודל במהלך פיתוח האפליקציה. במסמך הזה מפורטות כמה שיטות מומלצות לאופטימיזציה של מודלים של TensorFlow לפריסה בחומרה מקצה לקצה.

למה כדאי לבצע אופטימיזציה למודלים

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

הקטנת גודל

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

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

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

הפחתת זמן אחזור

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

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

תאימות ל-מאיץ

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

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

הפתעות

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

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

סוגי אופטימיזציה

ב-TensorFlow Lite יש כרגע תמיכה באופטימיזציה באמצעות קוונטיזציה, חיתוך וקיבוץ.

אלה הן חלק מ-TensorFlow Model Optimization Toolkit, שמספק משאבים לשיטות אופטימיזציה של מודלים שתואמות ל-TensorFlow Lite.

כמות

קוונטיזציה פועלת על ידי הפחתת רמת הדיוק של המספרים שמשמשים לייצוג הפרמטרים של המודל, שהם כברירת מחדל מספרי נקודה צפה (floating-point) של 32 ביט. התוצאה היא מודל קטן יותר וחישוב מהיר יותר.

אלה סוגי הקוונטיזציה שזמינים ב-TensorFlow Lite:

שיטה הדרישות לגבי הנתונים הקטנת גודל דיוק חומרה נתמכת
קוונטיזציה של float16 אחרי אימון אין נתונים עד 50% אובדן משמעותי של דיוק CPU, GPU
קוונטיזציה של טווח דינמי לאחר אימון אין נתונים עד 75% אובדן הדיוק הקטן ביותר מעבד (CPU), GPU (Android)
קוונטיזציה של מספרים שלמים אחרי אימון דגימה מייצגת ללא תווית עד 75% אובדן דיוק קטן מעבד (CPU), GPU (Android), EdgeTPU
הדרכה מבוססת-קונטיזציה נתוני אימון עם תווית עד 75% אובדן הדיוק הקטן ביותר מעבד (CPU), GPU (Android), EdgeTPU

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

עץ החלטות-קוונטיות

בהמשך מוצגות תוצאות זמן האחזור והדיוק לאימון לאחר אימון לקוונטיזציה ולבקרת קוונטיזציה בכמה מודלים. כל מספרי זמן האחזור נמדדים במכשירי Pixel 2 באמצעות מעבד מרכזי (CPU) אחד גדול. ככל שערכת הכלים משתפרת, כך גם המספרים כאן:

דגם רמת דיוק 1+ (מקורית) דיוק מוביל (לאחר הדרכה חלקית) דיוק מוביל (הדרכה לגבי בקרת כמות) זמן אחזור (מקורי) (אלפיות שנייה) זמן אחזור (לאחר אימון שלאחר האימון) (באלפיות השנייה) זמן אחזור (הדרכה מבוססת-Quantization Aware) (אלפיות שנייה) גודל (מקורי) (MB) גודל (לאחר אופטימיזציה) (MB)
Mobilenet-v1-1-2240.7090.6570.70 1241126416.94.3
Mobilenet-v2-1-2240.7190.6370.709 899854143.6
Inception_v30.780.7720.775 113084554395.723.9
Resnet_v2_1010.7700.768לא רלוונטי 39732868לא רלוונטי178.344.9
טבלה 1 יתרונות הקוונטיזציה של מודלים בדגמי CNN נבחרים

קוונטיזציה של מספרים שלמים מלאים עם הפעלות של int16 ומשקולות של int8

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

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

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

דגם סוג מדד דיוק דיוק (הפעלות של float32) דיוק (הפעלות inint8) דיוק (הפעלות inint16)
Wav2letterWER6.7%7.7% 7.2%
DeepSpeech 0.5.1 (לא זמין)CER6.13%43.67% 6.52%
YoloV3mAP(IOU=0.5)0.5770.563 0.574
MobileNetV1רמת הדיוק הגבוהה ביותר0.70620.694 0.6936
MobileNetV2רמת הדיוק הגבוהה ביותר0.7180.7126 0.7137
MobileBertF1(התאמה מדויקת)88.81(81.23)2.08(0) 88.73(81.15)
טבלה 2 יתרונות הקוונטיזציה של מודלים עם הפעלות של int16

גיזום

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

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

סידור באשכול

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

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

זרימת עבודה של פיתוח

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

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

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