7.10. CMSIS-NN¶
Az operátorlista, amelyet a TFLM végigjár, többnyire néhány nehéz operátorból áll: a konvolúció tanult súlyok kis rácsát csúsztatja végig egy bemeneti tenzoron, és minden pozícióba beírja a súlyozott összeget; a mélységi (depthwise) konvolúció ugyanezt teszi csatornánként; a teljesen összekapcsolt (fully-connected) réteg mátrixszorzásokat végez egy bemeneti vektor és egy súlymátrix között; a pooling zsugorítja a tenzort azzal, hogy kis környezetekből a maximumot vagy az átlagot veszi; az aktivációs függvények, mint a ReLU és a sigmoid, pontonként futnak végig minden értéken. Egy látási következtetés a ciklusainak nagy részét ebben a néhány operátorban tölti.
Az egyszerű módon megvalósítva ezek lassúak lennének egy mikrovezérlőn. A CMSIS-NN az Arm gyors implementációkat tartalmazó könyvtára – kézzel hangolva assemblyben, egész számra kvantálva a int8 és uint8 értékekre, amelyeket a tensor I/O leír, és a CPU SIMD utasításaira írva. A SIMD – Single Instruction, Multiple Data – lehetővé teszi, hogy a CPU egyetlen aritmetikai műveletet futtasson több értéken ugyanabban a ciklusban. Egy egyszerű skalár szorzás-összeadás ciklusonként egy eredményt állít elő; egy SIMD szorzás-összeadás több értéket csomagol egy széles regiszterbe, és egyszerre állítja elő mindegyiket.
A H7-en és az RT1062-n lévő Cortex-M7 rendelkezik az Arm DSP-bővítményével, amely négy int8 értéket tárol egy 32 bites regiszterben, és egy ciklus alatt futtat le egy szorzás-összeadást mind a négyen. Az AE3-on lévő Cortex-M55 a Helium bővítménnyel rendelkezik – formálisan MVE, az M-profil Vector Extension –, amely tizenhat int8 sávot tárol egy 128 bites regiszterben, ami négyszeres ciklusonkénti átviteli teljesítmény. A Helium egy szélesebb CPU-utasításkészlet, nem gyorsító; a gyorsító az ugyanazon a lapkán lévő Ethos-U55 NPU.
A szállított TFLM-buildek a CMSIS-NN-hez vannak linkelve, és a TFLM futásidőben az egyes nehéz operátorokat a kamerához megfelelő SIMD-változathoz irányítja. Az AE3-on a kiosztás valamivel összetettebb: a Vela fordító már offline végigjárta a modellt, és az NPU-ra alkalmas operátorok összefüggő szeleteit – részgráfokat (subgraphs) – megjelölte az Ethos-U-hoz való kiosztásra. Következtetéskor ezek a részgráfok egy blokkban futnak a gyorsítón, a többi pedig visszaesik a Helium CMSIS-NN-re az M55-ön.
A lebegőpontos operátorok teljesen megkerülik a CMSIS-NN-t, és a TFLM hordozható referencia-kerneljein keresztül futnak. Egy int8 és egy lebegőpontos modell közötti pontosságbeli különbség általában kicsi; az átviteli teljesítményben lévő különbség nagy. A kamerára szállított modellek emiatt vannak int8 értékre kvantálva.