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


דוגמה למודלים שעברו אופטימיזציה למכשירים ניידים היא MobileNets, שעברו אופטימיזציה לאפליקציות לראייה בנייד. ב-Kaggle Models מפורטים עוד כמה מודלים שעברו אופטימיזציה במיוחד למכשירים ניידים ולמכשירים מוטמעים.
אתם יכולים לאמן מחדש את המודלים שמופיעים ברשימה על מערך הנתונים שלכם באמצעות העברת למידה.
יצירת פרופיל של המודל
אחרי שבוחרים מודל מתאים למשימה, מומלץ ליצור פרופיל של המודל ולהשוות אותו למודלים אחרים. ל-LiteRT יש כלי להשוואה בין ביצועים עם פרופילן מובנה שמציג נתונים סטטיסטיים של פרופילים לכל אופרטור. הנתונים האלה יכולים לעזור לכם להבין איפה יש צווארי בקבוק בביצועים ואילו אופרטורים תופסים את רוב זמן החישוב.
אפשר גם להשתמש במעקב LiteRT כדי ליצור פרופיל של המודל באפליקציית Android באמצעות מעקב מערכת Android רגיל, וכדי להציג את הפעלות האופרטורים לפי זמן באמצעות כלי ליצירת פרופילים מבוססי GUI.
הצגה של אופרטורים בתרשים ואופטימיזציה שלהם
אם אופרטור מסוים מופיע לעיתים קרובות במודל, ואחרי ניתוח פרופילים אתם מגלים שהוא צורך את הכי הרבה זמן, תוכלו לבדוק איך אפשר לבצע אופטימיזציה לאופרטור הזה. תרחיש כזה אמור להיות נדיר, כי לרוב האופרטורים יש גרסאות מותאמות ב-TensorFlow Lite. עם זאת, אם אתם יודעים את האילוצים שבהם מופעל האופרטור, יכול להיות שתוכלו לכתוב גרסה מהירה יותר של אופרטור בהתאמה אישית. כדאי לעיין במדריך לאופרטורים מותאמים אישית.
אופטימיזציה של המודל
אופטימיזציה של מודלים נועדה ליצור מודלים קטנים יותר, שבדרך כלל מהירים יותר וצורכים פחות אנרגיה, כדי שאפשר יהיה לפרוס אותם במכשירים ניידים. LiteRT תומך בטכניקות אופטימיזציה שונות, כמו קוונטיזציה.
פרטים נוספים זמינים במסמכים בנושא אופטימיזציה של מודלים.
שינוי מספר השרשורים
LiteRT תומך בגרעיני מערכת מרובי-הליכים עבור הרבה אופרטורים. אתם יכולים להגדיל את מספר השרשורים ולהאיץ את ההפעלה של האופרטורים. עם זאת, הגדלת מספר ה-threads תגרום למודל להשתמש ביותר משאבים וחשמל.
באפליקציות מסוימות, זמן האחזור חשוב יותר מיעילות אנרגטית. אפשר להגדיל את מספר השרשורים על ידי הגדרת מספר השרשורים של המפענח. עם זאת, ביצוע מרובה-הליכי עבודה כרוך בעלייה בשונות בביצועים, בהתאם לפעולות אחרות שמבוצעות במקביל. זה נכון במיוחד לגבי אפליקציות לנייד. לדוגמה, בדיקות מבודדות עשויות להראות האצה של פי 2 לעומת ריבוי תהליכים, אבל אם אפליקציה אחרת פועלת באותו הזמן, יכול להיות שהביצועים יהיו גרועים יותר מאשר בריבוי תהליכים.
הסרת עותקים מיותרים
אם האפליקציה לא מתוכננת בקפידה, יכולים להיות עותקים מיותרים כשמזינים את הקלט למודל וקוראים את הפלט ממנו. חשוב לוודא שאין עותקים מיותרים. אם אתם משתמשים בממשקי API ברמה גבוהה יותר, כמו Java, הקפידו לבדוק היטב את התיעוד כדי לראות אזהרות לגבי ביצועים. לדוגמה, Java API מהיר הרבה יותר אם משתמשים ב-ByteBuffers כקלט.
יצירת פרופיל לאפליקציה באמצעות כלים ספציפיים לפלטפורמה
כלים ספציפיים לפלטפורמה כמו Android profiler ו-Instruments מספקים מידע רב על פרופילים שאפשר להשתמש בו כדי לנפות באגים באפליקציה. לפעמים הבאג שקשור לביצועים לא נמצא במודל, אלא בחלקים של קוד האפליקציה שמתקשרים עם המודל. חשוב להכיר את כלי הפרופיל הספציפיים לפלטפורמה ואת השיטות המומלצות לפלטפורמה שלכם.
הערכה אם המודל שלכם נהנה משימוש במאיצי חומרה שזמינים במכשיר
ב-LiteRT נוספו דרכים חדשות להאצת מודלים באמצעות חומרה מהירה יותר כמו GPU, DSP ומאיצים עצביים. בדרך כלל, המאיצים האלה נחשפים דרך מודולי משנה של delegate שמבצעים חלקים מההרצה של המפענח. כדי להשתמש בנציגים, LiteRT יכול:
- ההקצאה של GPU זמינה ב-Android וב-iOS, באמצעות OpenGL/OpenCL ו-Metal, בהתאמה. כדי לנסות אותם, אפשר לעיין בנציג ה-GPU.
- אפשר ליצור נציג משלכם אם יש לכם גישה לחומרה לא סטנדרטית. מידע נוסף זמין במאמר בנושא נציגי LiteRT.
חשוב לדעת שחלק מההאצות מתאימות יותר לסוגים שונים של מודלים. חלק מהנציגים תומכים רק במודלים של float או במודלים שעברו אופטימיזציה בדרך ספציפית. חשוב להשוות בין כל ההרשאות כדי לראות אם הן מתאימות לאפליקציה שלכם. לדוגמה, אם יש לכם מודל קטן מאוד, יכול להיות שלא כדאי להקצות את המודל ל-GPU. לעומת זאת, מאיצים הם בחירה מצוינת למודלים גדולים עם עוצמה אריתמטית גבוהה.