目的
PC(Ubuntu)にクロスコンパイル環境を構築して、ディープラーニングフレームワークのncnnとベンチマークソフトウェアのbenchmarkビルドし、LuckfoxPicoMaxで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
以下のコマンドを実行して、コンパイラのバージョン情報が出てれくれば、ツールチェインのインストールが完了です。
$ 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)
ncnnのインストール
ncnnは、Tencentが開発しているモバイルプラットフォーム向けに最適化された高性能なニューラルネットワーク推論コンピューティングフレームワークです。
このシェルスクリプトで、ARMプロセッサ向けにncnnライブラリをgitからクローン、ビルド、そしてインストールします。
$ git clone https://github.com/Tencent/ncnn.git -b 20240410 --depth 1
$ cd ncnn/
$ cmake -B build/arm_luckfox -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_luckfox && cmake --install build/arm_luckfox --prefix install/arm_luckfox
ncnn benckmarkのインストール
ncnnディレクトリ内でbenckmarkのファイルを整理し、それをzip圧縮します。
$ cd ncnn
$ mkdir install/arm_luckfox/benchmark
$ cp ./build/arm_luckfox/benchmark/benchncnn ./install/arm_luckfox/benchmark
$ cp ./benchmark/*.param ./install/arm_luckfox/benchmark
$ zip -r ./install/arm_coremp135/arm_luckfox_ncnn_benchmark.zip ./install/arm_luckfox/benchmark
LuckfoxPicoMaxでのベンチマークの実行
zipファイルをLuckfoxPicoMaxにscpでコピー、LuckfoxPicoMaxでncnn benchmarkを実行します。
# unzip arm_luckfox_ncnn_benchmark.zip
# cd benchmark
# ./benchncnn 4 1 0 -1 1
loop_count = 4
num_threads = 1
powersave = 0
gpu_device = -1
cooling_down = 1
squeezenet min = 459.52 max = 460.33 avg = 459.80
squeezenet_int8 min = 309.75 max = 310.10 avg = 309.92
mobilenet min = 797.15 max = 797.50 avg = 797.37
mobilenet_int8 min = 414.08 max = 414.60 avg = 414.35
mobilenet_v2 min = 517.26 max = 518.28 avg = 517.69
mobilenet_v3 min = 422.17 max = 422.56 avg = 422.37
shufflenet min = 275.52 max = 276.03 avg = 275.78
shufflenet_v2 min = 247.08 max = 247.42 avg = 247.29
mnasnet min = 514.06 max = 514.51 avg = 514.22
proxylessnasnet min = 590.52 max = 590.94 avg = 590.71
efficientnet_b0 min = 873.99 max = 874.59 avg = 874.19
efficientnetv2_b0 min = 1028.21 max = 1029.42 avg = 1028.89
regnety_400m min = 628.44 max = 628.85 avg = 628.62
blazeface min = 73.65 max = 74.32 avg = 74.12
googlenet min = 1477.98 max = 1479.47 avg = 1478.75
googlenet_int8 min = 947.31 max = 949.72 avg = 948.40
Killed
LuckfoxPicoMaxでncnnをクロスコンパイルしてbenckmarkを実行することができました。
参考資料