7.10. CMSIS-NN

TFLM이 순회하는 연산자 목록은 대부분 몇 가지 무거운 연산자로 이루어져 있습니다. 컨볼루션(convolution)은 학습된 가중치의 작은 격자를 입력 텐서 위에서 미끄러뜨리며 각 위치에 가중합을 기록합니다. 뎁스와이즈 컨볼루션(depthwise convolution)은 동일한 작업을 채널별로 수행합니다. 완전 연결(fully-connected)은 입력 벡터와 가중치 행렬 사이의 행렬 곱입니다. 풀링(pooling)은 작은 이웃 영역에서 최댓값 또는 평균을 취해 텐서를 축소합니다. ReLU나 sigmoid 같은 활성화 함수(activation functions)는 모든 값에 걸쳐 점별로 실행됩니다. 비전 추론은 사이클의 대부분을 이 몇 가지 연산자 안에서 소비합니다.

단순하게 구현하면 이러한 연산자는 마이크로컨트롤러에서 느릴 것입니다. CMSIS-NN은 Arm의 빠른 연산자 라이브러리입니다. 어셈블리로 손수 튜닝되었고, tensor I/O에서 설명한 int8uint8 값으로 정수 양자화되었으며, CPU의 SIMD 명령어에 맞추어 작성되었습니다. SIMD(Single Instruction, Multiple Data, 단일 명령 다중 데이터)는 CPU가 같은 사이클에 여러 값에 대해 하나의 산술 연산을 실행할 수 있게 합니다. 일반적인 스칼라 곱셈-덧셈은 사이클당 하나의 결과를 만들지만, SIMD 곱셈-덧셈은 여러 값을 넓은 레지스터에 묶어 한 번에 모두 만들어 냅니다.

H7와 RT1062에 탑재된 Cortex-M7에는 Arm의 DSP 확장(DSP extension)이 있는데, 이는 32비트 레지스터에 네 개의 int8 값을 담아 한 사이클 안에 이 네 값에 대한 곱셈-누산을 실행합니다. AE3에 탑재된 Cortex-M55에는 Helium이 있는데 – 공식적으로는 M-프로파일 벡터 확장(M-profile Vector Extension)인 MVE – 128비트 레지스터에 열여섯 개의 int8 레인을 담아 사이클당 처리량이 네 배에 달합니다. Helium은 더 넓은 CPU 명령어 집합이며 가속기가 아닙니다. 같은 다이에 있는 Ethos-U55 NPU가 가속기입니다.

출하되는 TFLM 빌드는 CMSIS-NN과 링크되며, TFLM은 런타임에 각 무거운 연산자를 해당 카메라에 맞는 적절한 SIMD 변형으로 디스패치합니다. AE3에서는 디스패치가 조금 더 복잡합니다. Vela 컴파일러가 이미 오프라인에서 모델을 순회하여 NPU에 적합한 연산자들이 연결된 조각, 즉 서브그래프(subgraphs)를 Ethos-U로 디스패치하도록 표시해 두었습니다. 추론 시점에는 이러한 서브그래프가 가속기에서 한 블록으로 실행되고, 나머지는 M55의 Helium CMSIS-NN으로 폴백합니다.

부동소수점 연산자는 CMSIS-NN을 완전히 우회하여 TFLM의 이식 가능한 참조 커널을 통해 실행됩니다. int8 모델과 부동소수점 모델 사이의 정확도 차이는 보통 작지만, 처리량 차이는 큽니다. 이러한 이유로 카메라에 출하되는 모델은 int8로 양자화됩니다.