Benchmark

April 13, 2023 ยท View on GitHub

Test Models

mnist

mnist: 28x28x1 input,4->8->16, pad valid
mnist_q_valid.h 2.4KB Flash 1.4KB RAM
suit for MCU have >=16KB Flash, >=2KB RAM

cifar

cifar: 32x32x3 input, 32->32->64->1024->10, 5x5 conv
cifar10_q.h 89KB Flash 11KB RAM
suit for MCU have >=128KB Flash, >=20KB RAM

vww96

vww96: vww model based on mobile net v1 0.25 96x96x3 input
vww96_q.tmdl 227KB Flash 54KB RAM
suit for MCU have >=256KB Flash, >=64KB RAM
https://mlcommons.org/en/inference-tiny-07/

mbnet128

mbnet128: mobile net v1 0.25 128x128x3 input
mbnet128_0.25_q.tmdl 485KB Flash 96KB RAM
suit for MCU have >=512KB Flash, >=128KB RAM
https://github.com/fchollet/deep-learning-models/releases

Test Record

model infer time unit is ms;
Sort by performance, compare priority: mbnet128 > vww96 > cifar > mnist

Note1: arduino run another smaller mnist model due to limited memory
Note2: all model record fastest model type's infer time, for example, C906 use FP16 result. Note3: XXX means impossible run this model on that chip

Chip/BoardCoreFlashRAMFreqmbnetvww96cifarmnistNote
BL808's NPUBLAI16MB0.8+64MB320M53<1<1
i5-4590TAMD64256GB8GB2000M7/245/170.9/40.04/<1native/wasm
RK3399's A72ARM A7232GB4GB1800M151030.07
TH1520RV64V(C910)16GB4GB1848M1710.43.60.15fp16
RK3399's A53ARM A5332GB4GB1600M291950.14
D1-HRV64V128GB2GB1008M43223.50.29
SSD201ARM A7128MB64MB1200M6642100.23
ZYNQ7010's A9ARM A932GB1GB667M66447.80.34
BL808's C906RV64V16MB0.8+64MB480M815710<1
STM32H750ARM CM71MB1024KB480M946415<1
V851S' E907RV32P128MB4MB600M10899320.5
HPM6750Andes D45
RV32IMAFDCP
8MB2MB+32MB816M174112330.45
BL808's E907RV32P16MB0.8+64MB320M18814935<1mdl in psram
F1C200SARM926EJ-S16MB64MB608M21314538.50.75
MT7621AMIPS1004Kc128MB128MB880M413244411need confirm
AT32F403AARM CM41MB96KB240M477136300.6mbnet in 224k ram mode
STM32G474REARM CM4512KB128KB170MXXX195431
CH32V307RV32F
QingKe V4F
480KB128KB144MXXX357641
STM32F411CEARM CM4512KB128KB150M558366752
W801CSKYV2 ck804ef2MB160+128KB+8MB240M60636452<2mdl in psram/(or sram if fit)
ESP32-S3Xtensa LX78MB512KB240M610381865mdl in flash
LPC4337ARM CM4F1MB136KB204M654627913need confirm
XR806ARMv8-M
Star-MC1
2MB288KB160M7124531041
ESP32Xtensa LX64MB520KB240M7554761322mdl in flash
ACM32F403ARM CM33512KB192KB180MXXX4581392
STM32F767ARM CM72MB512KB216M8696401853need confirm
SC5864B's DSPHIFI332MB8MB+192KB160M805------15need confirm
STM32L496ARM CM41MB320KB80M8096951623
BK7256RISC-V4MB512KB320M10366781862.8
NRF52832ARM CM4512KB64KB64MXXXxxx2174
ESP32-S2Xtensa LX74MB320KB240M10796592412.5need confirm
RP2040ARM CM0+16MB264KB280M12117162002overclock 280M
CH32V203G6RV32
QingKe V4B
32KB10KB144MXXXXXXXXX2.5
ESP32-C3RV324MB400KB160M237014301276mdl in flash
MM32F3270ARM CM3512KB128KB96M3126291925711
Nuclei N300RV32IMAFDC16MB512KB16MXXXX294679511need confirm
STM32F103RCARM CM3256KB48KB72MXXXXXX4457
STM32F103C8ARM CM364KB20KB72MXXXXXXXXX7
RiscyD2RV32IM48KB8KB100MXXXXXXXXX12Digilent Arty A7-35T
CH32V103RV32
QingKe V3A
64KB20KB72MXXXXXXXXX13
SAMD21G18ARM CM0+256KB32KB48MXXXXXX70014seeed XIAO
APM32F072CBARM CM0+128KB16KB48MXXXXXXXXX17
STM32G030F6ARM CM0+32KB8KB64MXXXXXXXXX18
CM0(Kintex-7)ARM CM0---1024KB50MXXXXXX136223Kintex-7
CH582RV32
QingKe V4A
448KB32KB60MXXXXXXXXX31
STC32G12K12880251128KB12KB35MXXXXXXXXX37
PicoRV32(GW2A)RV321MB64KB54MXXXXXX26935385Tang Primer 20K
Atmega328AVR32KB2KB16MXXXXXXXXX50(*)

Normalization to 100M freq to compare CPU efficiency, using cifar model:

Chip/BoardCorecifar(ms)
BL808's NPUBLAI2
D1-HRV64V35
BL808's C906RV64V48
RK3399's A72ARM A7252
ZYNQ7010's A9ARM A952
TH1520RV64V(C910)66
STM32H750ARM CM772
AT32F403AARM CM472
STM32G474REARM CM473
RK3399's A53ARM A5379
CH32V307RV32 IMAC92
BL808's E907RV32P112
STM32F411CEARM CM4113
SSD201ARM A7123
W801CSKYV2 ck804ef125
Nuclei N300RV32IMAFDC127
STM32L496ARM CM4130
NRF52832ARM CM4139
XR806ARMv8-M
Star-MC1
166
ESP32-C3RV32203
ESP32-S3Xtensa LX7206
F1C200SARM926EJ-S234
MM32F3270ARM CM3247
ACM32F403ARM CM33250
ESP32Xtensa LX6317
STM32F103RCARM cM3320
SAMD21G18ARM CM0+336
MT7621AMIPS1004Kc360
RP2040ARM CM0+560
ESP32-S2Xtensa LX7578
CM0(Kintex-7)ARM CM0681
PicoRV32(GW2A)RV3214545

Infer Time & Input Size

mbnet infer time under different input size
BL808 C906 core 480M, use RV64V, FP16 model

input sizeinfer time
96x 9660ms
128x12881ms
160x160156ms
192x192183ms
224x224296ms

Optimization

TM_FASTSCALE

Optimization for MCU which don't have FPU
STM32F103C8 run mnist

Optionsinfer time
TM_FASTSCALE=016ms
TM_FASTSCALE=110ms

TM_ARCH_ARM_SIMD

Optimization for ARM MCU which have DSP (Cortex-M4,M7,etc.), suoport INT8 acceleration
STM32F411CE run mbnet 0.25, 128x128x3 input

Optionsinfer time
TM_ARCH_OPT0 && INT81199ms
TM_ARCH_ARM_SIMD && INT8840ms

TM_ARCH_ARM_MVEI

Optimization for ARM MCU which have MVEI instructions (Cortex-M55,etc.), suoport INT8 acceleration.

Experimental, not test data.

TM_ARCH_ARM_NEON

Optimization for ARM MPU which have NEON instructions (Cortex-A7 and newer), suoport INT8/FP32 acceleration

Raspberry Pi4 single core run mbnet 1.0, 224x224x3 input
(NEON INT8 not well optimized)

ARCHMDL_TYPEOPT0 timeOPT1 time
TM_ARCH_CPUINT8860ms821ms
TM_ARCH_CPUFP322307ms2271ms
TM_ARCH_ARM_NEONFP321275ms1223ms
TM_ARCH_ARM_NEONINT8959ms923ms

TM_ARCH_RV32P

Optimization for RISC-V MCU which have P-extend instructions (like T-Head E907), suoport INT8 acceleration
BL808 E907 core run mbnet 0.25, 128x128x3 input (mdl in psram, cpu run in 320M, O2)

ARCHMDL_TYPEOPT0 timeOPT1 time
TM_ARCH_CPUINT8443ms283ms
TM_ARCH_RV32PINT8345ms188ms

TM_ARCH_RV64V

Optimization for RISC-V MCU which have V-extend instructions (like T-Head C906), suoport INT8/FP32 acceleration
BL808 C906 core run mbnet 0.25, 128x128x3 input (mdl in psram, VLEN=128, cpu run in 480M, O2)

ARCHMDL_TYPEOPT0 timeOPT1 time
TM_ARCH_CPUINT8153ms125ms
TM_ARCH_CPUFP32215ms177ms
TM_ARCH_RV64VINT8123ms95ms
TM_ARCH_RV64VFP32160ms121ms
TM_ARCH_RV64VFP16129ms81ms

TM_ARCH_CSKYV2

Optimization for CskyV2 MCU which have DSP instructions (like ck804ef), suoport INT8 acceleration
w801 ck804ef core run mbnet 0.25, 128x128x3 input (mdl in psram, cpu run at 240M,psram overclock to 120M, O3, with data cache on)

ARCHMDL_TYPEOPT0 timeOPT1 time
TM_ARCH_CPUINT8950ms816ms
TM_ARCH_CSKYV2INT8724ms606ms

Compare to other infer library

Use SmallCifar model. TinyMaix use stride=2's time multipy by 4.
NNoM&TinyMaix run with STM32H750@218M, other run with STM32F746@216M

InferLibtime(ms)
TFlite-micro393
MicroTVM untuned294
TinyMaix CPU O0224
TinyMaix CPU O1204
TinyMaix SIMD O0176
NNoM159
MicroTVM tuned157
CMSIS-NN136
TinyMaix SIMD O1132
tinyengine129