2月に入ってMAXON Motorの動作確認をしていたため、全く記事を書いていませんでした。
今回は(また)Darknet関連の備忘録的なものを書きます。
AlexeyAB実装のDarknetでは、Makefileをいろいろと弄ることがあります。
ここでは、そのコンパイルオプションの変更によってどれくらいの速度差が出るのかを検証してみました。1ファイルの読み込みによる速度は実際の動作(いわゆるdemoコマンドやdarknet-ros)での速度とは少し違います。ご注意ください。
環境
検証は次の環境で行いました。
ハードウェア
CPU:Ryzen7 2700x (4.35GHz 16thread)
GPU:ROG-STRIX-RTX2080TI (11GB VRAM・OC)
Memory:16GB・2933MHz (HyperX Predator DDR4 RGB)
ソフトウェア
OS:Ubuntu18.04LTS
CUDA:CUDA10.2
cuDNN:7.6.5
OPENMP:201511 (libomp-devで導入)
調整するパラメータ
次の3項目を調整します。
CUDNN・CUDNN_HALF(どちらかが0だと無効)
注:CUDNN_HALFが有効になっていなかったので再検証したい
また、OPENCV=0
としました。
コマンドは次のとおりです。
$ ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
結果
次のグラフのようになりました。右のグラフは、通常の表記なのですが、あまりにも差が大きすぎたので、左に対数表記のグラフも載せました。縦軸の単位はミリ秒(ms)、横軸は、識別のための番号です。下の表の番号とも対応しています。
GPUのON/OFFについて
cuDNNのON/OFFについて
GPUの時点で速いのだから、cuDNNの速度差はあまりないだろうと思い込んでいたのですが、さすがにこの差は大きい…特に組み込みコンピュータなどの低スペックGPUだと必須でしょう。
OpenMPのON/OFFについて
- OpenMPとは並列処理を効率化するライブラリらしいです。GPUだと少ししか差が出ません(1ms程度速くなったかな?程度)が、CPUだとマルチスレッド性能相応に速くなるみたいです。実際、Ryzen7シリーズは16スレッドあるので、CPU処理におけるOpenMPの効果は大きいと思われます。
最近は、シングルスレッド性能やCPU内のバス速度が向上しているので、さらなる効果が期待できそうです。GPU使用時はあまり気にするほどでもないような気がします。
まとめ
- cuDNNの使用時・未使用時の差が想像以上に大きくて驚きました。できればCUDAインストール時にcuDNNも一緒に入れてほしいなーと思いつつ、検証を終わります。
Darknetでは、条件を満たせば、Tensorコアも使ってくれるらしいので、その貢献がどれくらいのものなのかも気になるところです。