7.10. CMSIS-NN¶
Lista operatorów, którą przechodzi TFLM, to w większości garstka ciężkich operatorów: konwolucja przesuwająca niewielką siatkę wyuczonych wag po tensorze wejściowym i zapisująca ważoną sumę w każdej pozycji; konwolucja głębokościowa (depthwise) robiąca to samo dla każdego kanału; fully-connected mnożące macierzowo wektor wejść przez macierz wag; pooling zmniejszający tensor przez wzięcie maksimum lub średniej z małych sąsiedztw; funkcje aktywacji takie jak ReLU i sigmoid działające punktowo na każdej wartości. Wnioskowanie wizyjne spędza większość swoich cykli wewnątrz tych kilku operatorów.
Zaimplementowane w prosty sposób, byłyby wolne na mikrokontrolerze. CMSIS-NN to biblioteka szybkich wersji od Arm – ręcznie zoptymalizowanych w asemblerze, skwantyzowanych do wartości całkowitych int8 i uint8 opisanych w wejściu/wyjściu tensorów i napisanych z wykorzystaniem instrukcji SIMD procesora. SIMD – Single Instruction, Multiple Data – pozwala procesorowi wykonać jedną operację arytmetyczną na kilku wartościach w tym samym cyklu. Zwykłe skalarne mnożenie z dodawaniem daje jeden wynik na cykl; mnożenie z dodawaniem SIMD pakuje kilka wartości do szerokiego rejestru i produkuje je wszystkie naraz.
Cortex-M7 na H7 i RT1062 ma rozszerzenie DSP firmy Arm, które przechowuje cztery wartości int8 w 32-bitowym rejestrze i wykonuje mnożenie z dodawaniem na wszystkich czterech w jednym cyklu. Cortex-M55 na AE3 ma Helium – formalnie MVE, czyli M-profile Vector Extension – które przechowuje szesnaście pasów (lane) int8 w 128-bitowym rejestrze, czyli czterokrotną przepustowość na cykl. Helium to szerszy zestaw instrukcji procesora, a nie akcelerator; akceleratorem jest NPU Ethos-U55 na tej samej płytce krzemowej.
Dostarczane buildy TFLM są linkowane z CMSIS-NN, a TFLM kieruje każdy ciężki operator do właściwego wariantu SIMD dla danej kamery w czasie wykonania. Na AE3 ten rozdział jest nieco bardziej złożony: kompilator Vela przeszedł już model offline i oznaczył połączone wycinki operatorów kwalifikujących się do NPU – podgrafy – do skierowania na Ethos-U. W czasie wnioskowania te podgrafy działają na akceleratorze w jednym bloku, a reszta wraca do Helium CMSIS-NN na M55.
Operatory zmiennoprzecinkowe całkowicie omijają CMSIS-NN i działają poprzez przenośne kernele referencyjne TFLM. Różnica dokładności między modelem int8 a modelem zmiennoprzecinkowym jest zwykle niewielka; różnica przepustowości jest duża. Z tego powodu modele dostarczane na kamerę są kwantyzowane do int8.