目的
PC(Ubuntu)にクロスコンパイル環境を構築して、ディープラーニングフレームワークのncnnとベンチマークソフトウェアのbenchmarkビルドし、CoreMP135でncnn benchmarkを実行します。
また、こちらのリポジトリで、これまでにCoreMP135、Raspberry Pi Zero 2 W、M5Stack_UnitV2、LicheeNano RV、Luckfox Pico Maxでのncnn benchmarkを比較した結果を公開しています。
PC環境
まず以下のバージョンのUbuntuをインストールしたPC環境で、クロスコンパイル環境を構築します。
Ubuntu 22.04.3 LTS(x64)
コンパイルにツールチェインのインストール
コンパイルに必要なツールチェインを含むパッケージをaptからインストールします
$ sudo apt install crossbuild-essential-armhf crossbuild-essential-arm64
Raspberry Pi Zero 2 WのOSには、32Bit向けOS(bookworm 32Bit)と64Bit向けOS(bookworm 64Bit)とがあります。
以下のコマンドを実行して、それぞれのコンパイラのバージョン情報が出てれくれば、ツールチェインのインストールが完了です。
bookworm 32 Bit
$ arm-linux-gnueabihf-g++ -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/11/lto-wrapper
Target: arm-linux-gnueabihf
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
bookworm 64 Bit
$ aarch64-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper
Target: aarch64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
ncnnのインストール(bookworm 64Bit向け)
ncnnは、Tencentが開発しているモバイルプラットフォーム向けに最適化された高性能なニューラルネットワーク推論コンピューティングフレームワークです。
このシェルスクリプトで、bookworm 64Bit向けにncnnライブラリをgitからクローン、ビルド、そしてインストールします。
$ git clone https://github.com/Tencent/ncnn.git -b 20240410 --depth 1
$ cd ncnn/
$ cmake -B build/aarch64_raspi_zero -DCMAKE_TOOLCHAIN_FILE=./ toolchains/aarch64-linux-gnu.toolchain.cmake -DNCNN_SIMPLEOCV=ON -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=OFF .
$ cmake --build build/aarch64_raspi_zero && cmake --install build/aarch64_raspi_zero --prefix install/aarch64_raspi_zero
ncnn benckmarkのインストール(bookworm 64Bit向け)
ncnnディレクトリ内でbenckmarkのファイルを整理し、それをzip圧縮します。
$ cd ncnn
$ mkdir install/aarch64_raspi_zero/benchmark
$ cp ./build/aarch64_raspi_zero/benchmark/benchncnn ./install/aarch64_raspi_zero/benchmark
$ cp ./benchmark/*.param ./install/aarch64_raspi_zero/benchmark
$ zip -r ./install/arm_raspi_zero/aarch64_raspi_zero_ncnn_benchmark.zip ./install/aarch64_raspi_zero/benchmark
ncnnのインストール(bookworm 32Bit向け)
このシェルスクリプトで、bookworm 32Bit向けにncnnライブラリをgitからクローン、ビルド、そしてインストールします。
$ git clone https://github.com/Tencent/ncnn.git -b 20240410 --depth 1
$ cd ncnn/
$ cmake -B build/arm_raspi_zero -DCMAKE_TOOLCHAIN_FILE=./ toolchains/arm-linux-gnueabihf.toolchain.cmake -DNCNN_SIMPLEOCV=ON -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=OFF .
$ cmake --build build/arm_raspi_zero && cmake --install build/arm_raspi_zero --prefix install/arm_raspi_zero
ncnn benckmarkのインストール(bookworm 32Bit向け)
ncnnディレクトリ内でbenckmarkのファイルを整理し、それをzip圧縮します。
$ cd ncnn
$ mkdir install/arm_raspi_zero/benchmark
$ cp ./build/arm_raspi_zero/benchmark/benchncnn ./install/arm_raspi_zero/benchmark
$ cp ./benchmark/*.param ./install/arm_raspi_zero/benchmark
$ zip -r ./install/arm_raspi_zero/arm_raspi_zero_ncnn_benchmark.zip ./install/arm_raspi_zero/benchmark
Raspberry Pi Zero 2 Wでのベンチマークの実行
zipファイルをRaspberry Pi Zero 2 Wにscpでコピー、Raspberry Pi Zero 2 Wでncnn benchmarkを実行します。
# uname -a
Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
# unzip aarch64_raspi_zero_ncnn_benchmark.zip
# cd benchmark
# $ ./benchncnn 4 4 0 -1 1
loop_count = 4
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 94.88 max = 95.50 avg = 95.22
squeezenet_int8 min = 79.35 max = 80.08 avg = 79.68
mobilenet min = 127.13 max = 127.57 avg = 127.40
mobilenet_int8 min = 78.65 max = 78.98 avg = 78.81
mobilenet_v2 min = 128.54 max = 129.68 avg = 129.15
mobilenet_v3 min = 98.26 max = 98.43 avg = 98.33
shufflenet min = 66.90 max = 67.47 avg = 67.21
shufflenet_v2 min = 52.32 max = 52.75 avg = 52.57
mnasnet min = 111.90 max = 112.62 avg = 112.34
proxylessnasnet min = 118.48 max = 119.47 avg = 118.76
efficientnet_b0 min = 155.56 max = 157.07 avg = 155.99
efficientnetv2_b0 min = 171.39 max = 172.90 avg = 172.09
regnety_400m min = 135.76 max = 136.19 avg = 135.91
blazeface min = 17.39 max = 17.76 avg = 17.60
googlenet min = 264.43 max = 265.96 avg = 265.41
googlenet_int8 min = 211.98 max = 213.73 avg = 212.97
resnet18 min = 311.56 max = 319.92 avg = 314.21
resnet18_int8 min = 167.23 max = 169.53 avg = 167.99
alexnet min = 188.50 max = 189.31 avg = 188.94
vgg16 min = 73978.99 max = 82848.12 avg = 79031.31
vgg16_int8 min = 1361.84 max = 30602.68 avg = 14190.58
resnet50 min = 652.90 max = 1006.11 avg = 749.30
resnet50_int8 min = 442.29 max = 458.85 avg = 446.79
squeezenet_ssd min = 277.98 max = 281.90 avg = 279.82
squeezenet_ssd_int8 min = 200.31 max = 202.15 avg = 200.98
mobilenet_ssd min = 288.34 max = 291.08 avg = 289.81
mobilenet_ssd_int8 min = 161.44 max = 161.59 avg = 161.55
mobilenet_yolo min = 596.91 max = 598.30 avg = 597.71
mobilenetv2_yolov3 min = 408.89 max = 411.38 avg = 409.77
yolov4-tiny min = 474.56 max = 479.67 avg = 477.37
nanodet_m min = 145.40 max = 146.08 avg = 145.63
yolo-fastest-1.1 min = 94.99 max = 95.68 avg = 95.32
yolo-fastestv2 min = 73.39 max = 73.75 avg = 73.60
vision_transformer min = 4368.69 max = 4412.38 avg = 4396.93
FastestDet min = 76.88 max = 77.24 avg = 77.09
Raspberry Pi Zero 2 Wでncnnをクロスコンパイルしてbenckmarkを実行することができました。
参考資料