はじめに
OpenCVの画像処理をGPU(CUDA)で高速化する
というPostをみて、XavierNXでも同様にGPUMATを使った高速化について確認しました。
手順
- XavierNXのJetpack4.4でOpenCV4をビルドし、GPUMAT(CUDA)を使えるようにします。
-もともとJetpack4.4にはOpenCVの4.1.1が入っていますが、GPUMATがイネーブルにされずにビルドされています。 - OpenCVの画像処理をGPU(CUDA)で高速化するにあるスクリプトを実行します。
XavierNXのJetpack4.4でOpenCV4をビルドし、GPUMAT(CUDA)を使えるようにします。
XavierNXで、GPUMAT(CUDA)を使おうとすると
cv2.error: OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/core/include/opencv2/core/private.cuda.hpp:107: error: (-216:No CUDA support) The library is compiled without CUDA support in function 'throw_no_cuda'
といわれGPUMATが使えません。
Jetson Xavier NXでDNN_BACKEND_CUDAが使えるOpenCV4.3をDockerでビルドでOpenCV4.3なGPUMAT(CUDA)がイネーブルなイメージをビルドします。
OpenCVの画像処理をGPU(CUDA)で高速化するにあるスクリプトを実行します。
作成したイメージを実行 # ここでは作成したイメージにopencv430:100 というタグをつけてあります。
sudo docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix opencv430:100
その後Docker上で
https://github.com/iwatake2222/OpenCV_CUDA
にあるスクリプトを実行します。
python3 opencv_cuda.py
結果
各一回づつしか実行してないので、ばらつきはありますが、CPUはJetsonNanoよりはやいですが、GPUはむしろ遅い感じ
GPUの計測時には、
1,GPU側へのコピー、
2,リサイズ、
3,CPU側への返送
なので、実際には2だけがGPUの恩恵を受けるので値そのものはこんなものかとおもいますが、OpenCVの画像処理をGPU(CUDA)で高速化するの結果と比較するとJetsonNanoより遅くなるのはなぜでしょう。。。どなたか知見のある方いらっしゃれば
nvpmodel -m 0
CPU = 0.8271254301071167[msec]
GPU = 0.9963115930557251[msec]
1
nvpmodel -m 1
CPU = 1.1097469329833984[msec]
GPU = 0.8339884281158447[msec]
1
nvpmodel -m 2
CPU = 1.107427430152893[msec]
GPU = 1.0129541397094726[msec]
1
nvpmodel -m 3
CPU = 1.0416812896728516[msec]
GPU = 0.9837974786758423[msec]
1
nvpmodel -m 4
CPU = 1.3258913993835448[msec]
GPU = 1.004795241355896[msec]
1
5/27追記
ふとjetson_clocksを実行して測定してみたら
CPU = 1.1041647672653199[msec]
GPU = 0.3990261316299438[msec]
1
となりました。
/etc/nvpmodel.conf
を見る限り、最大Clockはかわらないのですが、jetson_clocksを実行するとGorvernorが停止され最大クロックに固定されます。検証してませんが、転送はCPU処理、リサイズはGPU処理でこまめに切り替わることで、Gorvernorの動作が間に合ってない可能性があるかもしれません。気が向いたら確認してみます。