7.10. CMSIS-NN¶
רשימת האופרטורים ש-TFLM עוברת עליה מורכבת בעיקר ממקבץ של אופרטורים כבדים: convolution המחליק רשת קטנה של משקלים נלמדים על פני טנזור קלט וכותב את הסכום המשוקלל בכל מיקום; depthwise convolution העושה את אותו דבר לכל ערוץ בנפרד; fully-connected המבצע כפל מטריצות בין וקטור קלטים למטריצת משקלים; pooling המכווץ טנזור על ידי לקיחת המקסימום או הממוצע על פני סביבות קטנות; activation functions כמו ReLU ו-sigmoid הפועלים נקודתית על כל ערך. הסקת ראייה מבלה את רוב המחזורים שלה בתוך אותם אופרטורים מעטים.
אם היו ממומשים בדרך הישירה, הם היו איטיים על מיקרו-בקר. CMSIS-NN היא ספריית האופרטורים המהירים של Arm – מכווננים ידנית באסמבלי, מקוונטטים למספרים שלמים אל ערכי ה-int8 וה-uint8 שתוארו בקלט/פלט הטנזור, ונכתבו כנגד הוראות ה-SIMD של המעבד. SIMD – Single Instruction, Multiple Data – מאפשר למעבד להריץ פעולה אריתמטית אחת על פני מספר ערכים באותו מחזור. כפל-וחיבור סקלרי פשוט מייצר תוצאה אחת למחזור; כפל-וחיבור מסוג SIMD אורז מספר ערכים באוגר רחב ומייצר את כולם בבת אחת.
ה-Cortex-M7 שעל ה-H7 וה-RT1062 מצויד ב-DSP extension של Arm, המחזיק ארבעה ערכי int8 באוגר 32 סיביות ומריץ כפל-וחיבור על כל הארבעה במחזור אחד. ה-Cortex-M55 שעל ה-AE3 מצויד ב-Helium – רשמית MVE, הרחבת הווקטור של פרופיל-M – המחזיק שישה-עשר נתיבי int8 באוגר 128 סיביות, פי ארבעה תפוקה למחזור. Helium הוא סט הוראות מעבד רחב יותר, לא מאיץ; הEthos-U55 NPU שעל אותה שבבייה הוא המאיץ.
גרסאות ה-TFLM הנשלחות מקושרות אל CMSIS-NN, ו-TFLM מנתבת כל אופרטור כבד אל וריאנט ה-SIMD המתאים למצלמה בזמן ריצה. על ה-AE3 הניתוב מעט מורכב יותר: מהדר ה-Vela כבר עבר על המודל באופן לא-מקוון וסימן פלחים מחוברים של אופרטורים זכאים-NPU – subgraphs – לניתוב אל ה-Ethos-U. בזמן ההסקה אותם subgraphs רצים על המאיץ בבלוק אחד, והשאר נסוגים אל Helium CMSIS-NN על ה-M55.
אופרטורי Float עוקפים את CMSIS-NN לחלוטין ורצים דרך ליבות הייחוס הניידות של TFLM. פער הדיוק בין מודל int8 למודל float הוא בדרך כלל קטן; פער התפוקה גדול. מודלים הנשלחים על המצלמה מקוונטטים ל-int8 מסיבה זו.