背景
やむを得ない理由で、cuda10.0が入っているJetsonNanoにdarknetとyolov4-tinyを入れる必要があったのですが、その際ちょっと手間取ったのでそのメモ。
環境
$ jetson_release
- NVIDIA Jetson NANO/TX1
* Jetpack 4.3 [L4T 32.3.1]
* CUDA GPU architecture 5.3
- Libraries:
* CUDA 10.0.326
* cuDNN 7.6.3.28-1+cuda10.0
* TensorRT 6.0.1.10-1+cuda10.0
* Visionworks 1.6.0.500n
* OpenCV 4.1.1 compiled CUDA: YES
- Jetson Performance: inactive
手順
1. フレームワークであるdarknetを入れる
$ git clone https://github.com/AlexeyAB/darknet
2. Makefileを修正する
$ cd darknet
$ vim Makefile
以下の様に修正
GPU=1
CUDNN=1
CUDNN_HALF=0 # jetson nanoの場合は0でok
OPENCV=1
libso=1
# 64行目あたり
NVCC=/usr/local/cuda/bin/nvcc
3. yolov4-tinyを入れる
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights
4. コンパイルする
$ make -j5
※時短の為に5スレッドでの分散ビルドをしています(以下記事参考)
ビルドの途中でエラー
このまま上手くいけばいいな~と思っていたら案の定、途中でidentifier "cudaStreamCaptureModeGlobal" is undefined
というエラーが出ました
./src/network_kernels.cu(721): error: identifier "cudaStreamCaptureModeGlobal" is undefined
./src/network_kernels.cu(721): error: too many arguments in function call
2 errors detected in the compilation of "/tmp/tmpxft_00005fdb_00000000-6_network_kernels.cpp1.ii".
Makefile:184: recipe for target 'obj/network_kernels.o' failed
make: *** [obj/network_kernels.o] Error 1
原因
調べたらgithubのissueにちゃんと書いてありました
このissueでのやり取りを見ていくと大体つかめると思います
原因となっていたのはnetwork_kernels.cu
の以下の部分
CHECK_CUDA(cudaStreamBeginCapture(stream0,cudaStreamCaptureModeGlobal));
↑はCUDA10.1以降向けに追加されたもので、CUDA10.0の際に発生していたissueを解決するための関数
この関数によって推論の実行スピードが20%上昇するとの事
It seems yes, it was added in CUDA 10.1, because there was an issue for CUDA 10.0 triton-inference-server/server#635 (comment)
In general this is related to this feature, that can accelerate any neural network +20% for Inference (Detection): #7444
解決策
因みに無くても動くとの事なので、コメントアウトしてもう一度makeしてみます
// CHECK_CUDA(cudaStreamBeginCapture(stream0,cudaStreamCaptureModeGlobal));
$ make clean
$ make -j5
今度はエラーが起きず無事に終了しました(darknetという名前のファイルが出来ていれば成功です)
5. 正常に動作するか確認
$ ./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg
こんな感じのログが出ます
CUDA-version: 10000 (10000), cuDNN: 7.6.3, GPU count: 1
OpenCV version: 4.1.1
0 : compute_capability = 530, cudnn_half = 0, GPU: NVIDIA Tegra X1
net.optimized_memory = 0
mini_batch = 1, batch = 1, time_steps = 1, train = 0
...
(途中略)
...
[yolo] params: iou loss: ciou (4), iou_norm: 0.07, obj_norm: 1.00, cls_norm: 1.00, delta_norm: 1.00, scale_x_y: 1.05
nms_kind: greedynms (1), beta = 0.600000
Total BFLOPS 6.910
avg_outputs = 310203
Allocate additional workspace_size = 26.22 MB
Loading weights from weights/yolov4-tiny.weights...
seen 64, trained: 0 K-images (0 Kilo-batches_64)
Done! Loaded 38 layers from weights-file
Detection layer: 30 - type = 28
Detection layer: 37 - type = 28
data/dog.jpg: Predicted in 67.070000 milli-seconds.
bicycle: 60%
dog: 84%
truck: 79%
car: 46%
無事動作しました!
ちなみに推論のスピードは67ミリ秒(0.067秒)でした
参考