למיקרו-בקרים יש זיכרון RAM ואחסון מוגבלים, ולכן יש מגבלות על הגודל של מודלים של למידת מכונה. בנוסף, נכון לעכשיו, LiteRT for Microcontrollers תומך רק בחלק קטן מהפעולות, ולכן לא כל ארכיטקטורות המודלים אפשריות.
במאמר הזה מוסבר התהליך של המרת מודל TensorFlow להרצה במיקרו-בקרים. בנוסף, הוא מתאר את הפעולות הנתמכות ומספק הנחיות לתכנון ולאימון של מודל שמתאים לזיכרון מוגבל.
דוגמה מלאה שאפשר להריץ ליצירה ולהמרה של מודל מופיעה במאמר Hello World.
המרות לפי מודל
כדי להמיר מודל TensorFlow מאומן להרצה במיקרו-בקרים, צריך להשתמש ב-LiteRT converter Python API. הפעולה הזו תמיר את המודל ל-FlatBuffer, תקטין את גודל המודל ותשנה אותו כך שישתמש בפעולות LiteRT.
כדי לקבל את הגודל הכי קטן שאפשר של המודל, כדאי להשתמש בקוונטיזציה אחרי האימון.
המרה למערך C
בפלטפורמות רבות של מיקרו-בקרים אין תמיכה מובנית במערכת קבצים. הדרך הכי קלה להשתמש במודל מהתוכנית היא לכלול אותו כמערך C ולבצע קומפילציה שלו בתוכנית.
הפקודה הבאה ב-Unix תיצור קובץ מקור C שמכיל את מודל LiteRT כמערך char:
xxd -i converted_model.tflite > model_data.cc
הפלט אמור להיראות כך:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
אחרי שיוצרים את הקובץ, אפשר לכלול אותו בתוכנית. חשוב לשנות את הצהרת המערך ל-const כדי לשפר את יעילות הזיכרון בפלטפורמות מוטמעות.
דוגמה לאופן הכללה ושימוש במודל בתוכנית מופיעה בקטע hello_world_test.cc בדוגמה Hello World.
ארכיטקטורה ואימון של מודלים
כשמעצבים מודל לשימוש במיקרו-בקרים, חשוב לקחת בחשבון את גודל המודל, את נפח העבודה ואת הפעולות שבהן נעשה שימוש.
גודל המודל
המודל צריך להיות קטן מספיק כדי להיכנס לזיכרון של מכשיר היעד, לצד שאר התוכנית, גם כקובץ בינארי וגם בזמן הריצה.
כדי ליצור מודל קטן יותר, אפשר להשתמש בפחות שכבות ובשכבות קטנות יותר בארכיטקטורה. עם זאת, מודלים קטנים נוטים יותר לסבול מבעיית התאמה חסרה. כלומר, בהרבה מקרים כדאי לנסות להשתמש במודל הכי גדול שאפשר להכניס לזיכרון. עם זאת, שימוש במודלים גדולים יותר יוביל גם לעומס עבודה מוגבר על המעבד.
עומס עבודה
הגודל והמורכבות של המודל משפיעים על עומס העבודה. מודלים גדולים ומורכבים עשויים להוביל למחזור פעילות גבוה יותר, כלומר המעבד של המכשיר מבלה יותר זמן בעבודה ופחות זמן במצב חוסר פעילות. הפעולה הזו תגדיל את צריכת החשמל ואת פליטת החום, וזה עלול להיות בעייתי בהתאם לאפליקציה.
תמיכה בפעולות
נכון לעכשיו, LiteRT for Microcontrollers תומך רק בחלק קטן מהפעולות של TensorFlow, וזה משפיע על ארכיטקטורות המודלים שאפשר להריץ. אנחנו פועלים להרחבת התמיכה בפעולות, גם מבחינת יישומי הפניה וגם מבחינת אופטימיזציות לארכיטקטורות ספציפיות.
אפשר לראות את הפעולות הנתמכות בקובץ micro_mutable_ops_resolver.h