Coelacanth's Dream

RADV/ACO検証: ncnn Benchmark

おまけ的な記事。

これまで waifu2x-ncnn-vulkan を検証に用いてきたが、そのフレームワークである ncnn はビルド時にライブラリだけでなく、ベンチマークのバイナリも生成される。
waifu2x-ncnn-vulkan のような一般ユーザーにとって実用的なソフトウェアからは少し外れるが、数少ない純粋な Vulkan Compute が実装されたベンチマークだ、試さない理由はないだろう。

インデックス

環境

Hardware/Software Description
CPU Ryzen 5 2600
(6-Core/12-Thread, 3.4GHz)
Memory 16GB 2933MHz
GPU AMD Radeon RX 560
(16CU/1024SP, 1080MHz,
VRAM 4GB, 1750MHz/7Gbps)
Linux Kernel 5.4.21
User Mode Driver Mesa 20.1.0-devel (git-a64d266134)
Vulkan Driver AMD RADV(LLVM) POLARIS11 (LLVM 9.0.1)
AMD RADV/ACO POLARIS11 (LLVM 9.0.1)
ncnn version commit: b2d9325c0dec51aafeceb077ff2fadf2510afc19

計測方法

準備

簡単なビルド方法は以下の記事にまとめているため、ここではベンチマークに関して補足をする。
waifu2x-ncnn-vulkan ビルド方法(Linux向け) 【2020/04/29 追記修正】 | Coelacanth’s Dream

これまではGPU RX 560 だけでの検証だったが、ベンチマーク実行バイナリ benchncnn にはCPUで実行することも可能だ。
そして cmake オプションに AVX2命令セットをサポートした x86環境への最適化を行なうか選択するものがあり、自分が所有している Ryzen 5 2600 はネイティブという訳ではないがサポートしているため、それを有効にしてビルドを行なった。
具体的には、cmake 実行時に -DNCNN_AVX2=ON を付けた。

benchncnn はデフォルトの状態ではビルドされるようになっており、cmake コマンド実行時に -DNCNN_BUILD_BENCHMARK=OFF のオプションを付けなければ、ビルドに選択したディレクトリ下に benchmark/ ディレクトリが存在するはずだ。
そしてその下に benchncnn がある。
これを実行すれば……となるが、これだけでは不十分であり、深層学習ネットワークのパラメータが記述されたファイル達を bechncnn と同一のディレクトリに置く必要がある。
それらファイルは ncnn/ ルートディレクトリ下の bechmark/ に収められている。
逆に benchncnn をそっちに移してもいい。こっちの方が手軽かも。
だらだらと言葉で説明してややこしくなってしまった。そこで各ディレクトリ、ファイルの関係性を表したのが下図。

検証では実行バイナリとパラメータを収めたファイルを /tmp に置いて行なった。
また、Ryzen 5 2600 で実行する際、全12スレッドを使用するのではなく、物理コアのみを使用するように設定した。
理由をここでは簡潔に書くが、性能が下がるからだ。詳細な理屈は以下の記事で。
Zen検証 ―― 物理6-Core 2CCX vs 6-Thread 1CCX | Coelacanth’s Dream

実行コマンド:

Ryzen 5 2600:  
    $ taskset -c 0-5 ./benchncnn 64 6 0 -1 0

RADV/LLVM:  
    $ ./benchncnn 64 1 0 0 0

RADV/ACO:  
    $ RADV_PERFTEST="aco" ./benchncnn 64 1 0 0 0

実行コマンドには benchmark/ 下にある README.md を参考とした。1

結果には、 min 、max 、avg の3つが出力されるが、今回の検証では avg をスコアとして採用した。
また、実行する項目は CPU Ryzen 5 2600 の方が多いが、GPU RX 560 と合わせるため、一部項目の結果を省いている。
実行結果は gist.github.com にほぼそのまま投稿してある。別環境、別デバイスとの比較にはそちらの方が使いやすい。
ncnn benchmark result

結果

benchncnn
Result (.avg)
(lower is better)
Ryzen 5 2600
(6-Core, AVX2)
RX 560
RADV/LLVM
RX 560
RADV/ACO
squeezenet 8.13 6.91 3.16
mobilenet 8.45 8.67 3.90
mobilenet_v2 9.88 8.71 4.75
mobilenet_v3 60.50 14.27 6.69
shufflenet 14.93 4.43 3.00
shufflenet_v2 5.66 6.08 3.90
mnasnet 112.48 11.02 5.39
proxylessnasnet 168.46 11.61 5.42
googlenet 32.74 28.76 12.15
resnet18 25.59 23.13 7.58
alexnet 14.51 22.73 12.42
vgg16 174.78 161.59 38.17
resnet50 73.55 54.83 18.83
squeezenet_ssd 30.50 32.41 13.46
mobilenet_ssd 20.53 18.85 9.24
mobilenet_yolo 41.87 36.49 14.38
mobilenetv2_yolov3 28.60 18.58 8.88

感想

waifu2x-ncnn-vulkan でも見られたように、やはり RADV/LLVM より RADV/ACO が高速結果を出した。
18項目中全てで RADV/LLVM に勝っており、中でも vgg16 における性能向上が著しく、約4.23倍の速度だ。

実行において、waifu2x-ncnn-vulkan の程 VRAMを使用しなかったあたりメモリコストが小さく、より ACOバックエンド の効果が出たのかもしれない。

benchmark/ の README.md1 にある RTX 2060RTX 2080 の結果と比較するとさすがに RX 560 が負けるが、かなり健闘している方ではないかと思う。その点では結構嬉しい。
規模が RX 560 よりも大きく、FP16のPacked実行にも対応している GFX9GFX10 のdGPUであれば勝てる可能性がある。

ncnn はオープンソースで開発されており、広くシステムに対応している。ソースコードからビルドする必要があるとはいえ、Windows、MacOSでも実行可能だ。
他のRadeon搭載システム環境下での実行結果があれば、RADV/ACO の価値をより正しく測れる。そうでなくとも、純粋な Vulkan Compute で実装されたベンチマークとして ncnn は貴重だろう。
ncnn とそのベンチマーク機能の存在がもっと知られることを願っている。