כיצד להריץ מודל למידת מכונה "Hello World" על מיקרו-בקרים STM32

מאת ‎Jacob Beningo

באדיבות ‎DigiKey's North American Editors

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

מאמר זה בוחן כיצד מפתחי התקנים משובצים יכולים להתחיל עם ML באמצעות המיקרו-בקרים STM32 של STMicroelectronics. לשם כך הוא מציג כיצד ליצור יישום "Hello World" על ידי המרת מודל TensorFlow Lite עבור מיקרו-בקריםלשימוש ב-STM32CubeIDE‏ באמצעות X-CUBE-AI.

הצגת מקרי שימוש ב-tinyML

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

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

תמונה של איתור מילות מפתח שהוא מקרה שימוש מעניין עבור tinyML (לחצו להגדלה)איור 1: איתור מילות מפתח הוא מקרה שימוש מעניין עבור tinyML. הדיבור בכניסה מומר לספקטרוגרם ולאחר מכן מוזן לרשת נוירונית מאומנת כדי לקבוע אם קיימת מילה שנלמדה-מראש. (מקור התמונה: ®ARM‏)

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

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

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

  • סיווג תנועות-יד
  • זיהוי חריגות
  • קורא מונה אנלוגי
  • הנחיה ובקרה (GNC‏)
  • זיהוי חבילות

לא משנה מקרה השימוש, הדרך הטובה ביותר להתחיל להכיר tinyML היא באמצעות אפליקציית "Hello World", העוזרת למפתחים ללמוד ולהבין את התהליך הבסיסי שיבצעו כדי להפעיל מערכת מינימלית. ישנם חמישה שלבים הכרחיים להרצת מודל tinyML על מיקרו-בקר STM32:

  1. קליטת נתונים
  2. תיוג נתונים
  3. אימון הרשת הנוירונית
  4. המרת המודל
  5. הרצת המודל על המיקרו-בקר

קליטה, תיוג ואימון של מודל "Hello World‏"

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

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

הדוגמה של "Hello World" הנחקרת כאן מראה כיצד לאמן מודל ליצור גל סינוס ולפרוס אותו ל- STM32. את הדוגמה הרכיבו Pete Warden ו-Daniel Situnayake כחלק מעבודתם בגוגל על TensorFlow Lite for Microcontrollers. זה מקל על העבודה מכיוון שהם הרכיבו מדריך פשוט ופומבי על קליטה, תיוג ואימון של המודל. ניתן למצוא אותו ב-Github‏ כאן; כשהם שם, המפתחים צריכים ללחוץ על כפתור "Run in Google Colab". Google Colab, קיצור של Google Collaboratory, מאפשר למפתחים לכתוב ולהריץ Python בדפדפן שלהם עם אפס תצורה ומעניק גישה חופשית ל-GPU של גוגל.

הפלט של הרצת דוגמת האימון יכלול שני קובצי מודל שונים; מודל model.tflite TensorFlow העובר קוונטיזציה עבור מיקרו-בקרים ומודל model_no_quant.tflite שאינו עובר קוונטיזציה. הקוונטיזציה מציינת כיצד הפעלת המודל וה-Bias‏ מאוחסנים מספרית. הגרסה שעברה קוונטיזציה מייצרת מודל קטן יותר המתאים יותר למיקרו-בקר. עבור הקוראים הסקרנים, ניתן לראות את תוצאות המודל המאומן לעומת תוצאות גלי הסינוס בפועל באיור 2. הפלט של המודל הוא באדום. פלט גל הסינוס אינו מושלם, אך הוא עובד מספיק טוב עבור תוכנית "Hello World".

גרף של הניבויים של מודל TensorFlow עבור גל סינוס לעומת הערכים בפועלאיור 2: השוואה בין ניבויי מודל TensorFlow עבור גל סינוס לעומת הערכים בפועל. (מקור התמונה: Beningo Embedded Group)

בחירת לוח הפיתוח

לפני שבוחנים כיצד להמיר את מודל TensorFlow להרצה על מיקרו-בקר, יש לבחור מיקרו-בקר עבור פריסת המודל. מאמר זה יתמקד במיקרו-בקרים STM32 מכיוון של-STMicroelectronics יש הרבה כלי tinyML/ML העובדים היטב עבור המרה והרצת מודלים. בנוסף, ל-STMicroelectronics יש מגוון רחב של חלקים התואמים לכלי ML שלהם (איור 3).

טבלה של האקוסיסטם STMicroelectronics AI (לחצו להגדלה)איור 3: כאן מוצגים המיקרו-בקרים ויחידת המיקרו-מעבד (MPU) הנתמכים כיום על ידי האקוסיסטם STMicroelectronics AI. (מקור תמונה: STMicroelectronics)

אם אחד מלוחות אלו נמצא איפה שהוא במשרד, הוא יהיה מושלם להרצת האפליקציה "Hello World". עם זאת, למי שמעוניין לחרוג מעבר לדוגמה זו ולהיכנס לבקרת תנועות-יד או איתור מילות מפתח, בחרו ב- Discovery IoT Node‏ STM32 B-L4S5I-IOT01A‏ (איור 4).

ללוח זה יש מעבד Arm Cortex®-M4 המבוסס על סדרת +STM32L4‏. למעבד יש 2 מגה-בייט (Mbytes) של זיכרון Flash‏ ו-640 קילו-בייט (Kbytes) של זיכרון RAM, המספקים הרבה מקום עבור מודלים tinyML. המודול ניתן להתאמה לניסויי מקרי שימוש של tinyML מכיוון שיש לו גם מיקרופון מערכות מיקרו-אלקטרו-מכניות (MEMS‏) MP34DT01‏ של STMicroelectronics שניתן להשתמש בו לפיתוח אפליקציות איתור מילות מפתח. בנוסף, מד התאוצה התלת-צירי המשולב LIS3MDLTR, גם הוא של STMicroelectronics, יכול לשמש לזיהוי תנועות-יד מבוסס-tinyML‏.

תמונה של STM32 B-L4S5I-IOT01A Discovery IoT Node של STMicroelectronicsאיור 4: STM32 B-L4S5I-IOT01A Discovery IoT Node הוא פלטפורמת ניסויים ניתנת להתאמה עבור tinyML הודות למעבד Arm Cortex-M4 המובנה, מיקרופון MEMS ומד-תאוצה תלת-צירי. (מקור תמונה: STMicroelectronics)

המרה והרצה של מודל TensorFlow Lite באמצעות STM32Cube.AI

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

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

תרשים של זרימת נתונים מחיישנים לזמן-ריצה ולאחר מכן לפלטאיור 5: כיצד זורמים נתונים מחיישנים אל זמן-ריצה ולאחר מכן אל הפלט באפליקציית tinyML. (מקור התמונה: Beningo Embedded Group)

הפלאגין X-CUBE-AI ל-STM32CubeMx מספק את סביבת זמן-ריצה לפענוח מודל TensorFlow Lite ומציע זמני-ריצה וכלי המרה חלופיים שהמפתחים יכולים למנף. הפלאגין X-CUBE-AI אינו מאופשר בפרויקט כברירת מחדל. עם זאת, לאחר יצירת פרויקט חדש ואתחול הלוח, תחת חבילות תוכנה-> בחרו רכיבים, ישנה אפשרות לאפשר את זמן-הריצה AI. כאן קיימות מספר אפשרויות; ודאו שתבנית האפליקציה משמשת עבור דוגמה זו, כפי שמוצג באיור 6.

תמונה של פלאגין X-CUBE-AI‏ שאותו יש לאפשראיור 6: יש לאפשר את הפלאגין X-CUBE-AI באמצעות תבנית האפליקציה עבור דוגמה זו. (מקור התמונה: Beningo Embedded Group)

לאחר אפשור X-CUBE-AI, תופיע קטגוריית STMicroelectronics X-CUBE-AI בשרשרת-הכלים. לחיצה על הקטגוריה תעניק למפתח את היכולת לבחור את קובץ המודל שיצרו ולקבוע את פרמטרי הדגם, כפי שמוצג באיור 7. כפתור ניתוח גם ינתח את המודל ויספק למפתחים מידע על זיכרון RAM, ROM ומחזור הביצוע. מומלץ מאוד למפתחים להשוות את אפשרויות המודל Keras ו- TFLite. בדוגמה של מודל גל הסינוס, שהוא קטן, לא יהיה הבדל עצום, אבל הוא מורגש. לאחר מכן ניתן ליצור את הפרויקט על ידי לחיצה על "יצירת קוד".

תמונה של הפרטים של זיכרון RAM, ROM ומחזור הביצועאיור 7: כפתור הניתוח יספק למפתחים מידע על זיכרון RAM, ROM ומחזור הביצוע. (מקור התמונה: Beningo Embedded Group)

מחולל הקוד יאתחל את הפרויקט ויבנה בסביבת זמן-הריצה עבור מודל tinyML. עם זאת, כברירת מחדל, שום דבר לא מזין את המודל. המפתחים צריכים להוסיף קוד כדי לספק את ערכי הקלט של המודל - ערכי x - שאותם המודל יפענח וישתמש כדי ליצור את ערכי הסינוס y. יש להוסיף כמה פיסות קוד לפונקציות acquisit_and_process_data ו-post_process, כפי שמוצג באיור 8.

תמונה של הקוד המוצג שתחבר ערכי חיישן קלט מזויפיםאיור 8: הקוד המוצג יחבר ערכי חיישן קלט מזויפים למודל גל הסינוס. (מקור התמונה: Beningo Embedded Group)

בשלב זה, הדוגמה מוכנה כעת להרצה. הערה: הוסיפו כמה הצהרות printf כדי לקבל את פלט המודל עבור אימות מהיר. קומפילציה ופריסה מהירה מביאה להרצת מודל tinyML "Hello World". משיכת פלט המודל למשך מחזור מלא מביאה לגל הסינוס המוצג באיור 9. זה אינו מושלם, אך זה מצוין עבור אפליקציית tinyML ראשונה. מכאן המפתחים יוכלו לקשור את הפלט למאפנן רוחב פולס (PWM) וליצור את גל הסינוס.

תמונה של פלט מודל גל סינוס "Hello World" (לחצו להגדלה)איור 9: פלט מודל גל הסינוס "Hello World" כאשר הוא רץ על STM32. (מקור התמונה: Beningo Embedded Group)

טיפים וטריקים עבור ML במערכות משובצות

למפתחים המעוניינים להתחיל עם ML במערכות מבוססות מיקרו-בקר יהיה לא מעט עבודה כדי להפעיל את אפליקציית tinyML הראשונה שלהם. עם זאת, יש לזכור כמה "טיפים וטריקים" היכולים לפשט ולהאיץ את הפיתוח:

  • עיינו בדוגמה של TensorFlow Lite עבור מיקרו-בקרים "Hello World", כולל קובץ Google Colab. קחו קצת זמן כדי להתאים פרמטרים ולהבין כיצד הם משפיעים על המודל המאומן.
  • השתמש במודלים עם קוונטיזציה עבור יישומי מיקרו-בקר. המודל עם קוונטיזציה נדחס לעבודה עם uint8_t ולא עם מספרי נקודה-צפה Bit‏-32‏. כתוצאה מכך המודל יהיה קטן יותר ויתבצע מהר יותר.
  • חקרו את הדוגמאות הנוספות במאגר TensorFlow Lite for Microcontrollers. דוגמאות אחרות כוללות זיהוי תנועות-יד וזיהוי מילות מפתח.
  • קחו את הדוגמה של "Hello World" על ידי חיבור פלט המודל ל-PWM ומסנן מעביר-נמוכים כדי לראות את גל הסינוס שנוצר. התנסו עם זמן-הריצה כדי להגדיל ולהקטין את תדר גל הסינוס.
  • בחרו לוח פיתוח הכולל חיישנים "נוספים" שיאפשרו לנסות מגוון רחב של אפליקציות ML.
  • עד כמה שאיסוף נתונים יכול להיות מהנה, בדרך כלל קל יותר לרכוש או להשתמש במסד נתונים בקוד פתוח כדי לאמן את המודל.

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

סיכום

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

DigiKey logo

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

אודות כותב זה

Image of Jacob Beningo

Jacob Beningo

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

אודות מוציא לאור זה

DigiKey's North American Editors