Raspberry Pi Zero 2 W(bookworm 32bit/64bit)でncnnをクロスコンパイルしてbenckmarkを実行する手順


## 目的

PC(Ubuntu)にクロスコンパイル環境を構築して、ディープラーニングフレームワークのncnnとベンチマークソフトウェアのbenchmarkビルドし、CoreMP135でncnn benchmarkを実行します。

https://github.com/nnn112358/ncnn_benchmark_test

また、こちらのリポジトリで、これまでに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を実行することができました。


## 参考資料

https://github.com/nnn112358/ncnn_benchmark_test

https://qiita.com/nnn112358/items/5b978464b005e7209fd8

https://qiita.com/nnn112358/items/5cfc32fd6cd1c8f4fe47

https://qiita.com/nnn112358/items/a4e262efd91641684402

https://qiita.com/nnn112358/items/67847f6779a3deadd5d4

https://qiita.com/nnn112358/items/25f2e08b00d3ca360e97