环境
OS ubuntu 18.04
GPU GeForce GTX 1080 Ti
python 3.7.5
pytorch 1.2.0
cuda 10.0.130
cudnn 7602
记录
在工作目录下,运行
git clone https://github.com/pjreddie/darknet
cd darknet
进入darknet
目录,因为要使用GPU训练,所以要修改配置文件Makefile
,将第一行的
GPU=0
修改为GPU=1
然后运行
make
出现报错,关键报错信息如下:
./src/gemm.c: In function ‘time_gpu’:
./src/gemm.c:232:9: warning: ‘cudaThreadSynchronize’ is deprecated [-Wdeprecated-declarations]
这是因为cuda在10.0及之后的版本中删除了cudaThreadSynchronize
函数。需要使用另一个函数cudaDeviceSynchronize
。观察报错知error出现在gemm.c
的232行。
于是将gemm.c
的第232行的cudaThreadSynchronize()
改为cudaDeviceSynchronize()
再运行一次make
又出现报错
/bin/sh: 1: nvcc: not found
Makefile:92: recipe for target 'obj/convolutional_kernels.o' failed
make: *** [obj/convolutional_kernels.o] Error 127
这是因为程序找不到nvcc才产生报错。于是找到自己的nvcc安装位置。比如我用的机器是/usr/local/cuda-10.0/bin/nvcc
再次修改Makefile
文件,将其中NVCC=nvcc
修改为NVCC=/usr/local/cuda-10.0/bin/nvcc
重新运行make。编译成功。
接着运行测试命令,测试YOLOv3在本机上是否成功运行
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
得到报错
./darknet: error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory
运行命令查看darknet的动态库依赖关系
ldd darknet
得到输出:
linux-vdso.so.1 (0x00007ffd26389000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f78d0d2c000)
libmvec.so.1 => /lib/x86_64-linux-gnu/libmvec.so.1 (0x00007f78d0b02000)
libcudart.so.10.0 => not found
libcublas.so.10.0 => not found
libcurand.so.10.0 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f78d08e3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78d04f2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78d1499000)
由not found可知,程序是找不到libcudart.so.10.0
, libcublas.so.10.0
, libcurand.so.10.0
这三个库。也就是动态链接库的链接问题。
修改.bashrc文件,在文件末尾添加
export PATH=/usr/local/cuda-10.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64/
然后执行下面的命令,使修改生效
source ~/.bashrc
再执行ldd命令查看依赖是否能找到
(cdx) name@machine:~/my/YOLOv3/path$ ldd darknet
linux-vdso.so.1 (0x00007fff05164000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efc3153e000)
libmvec.so.1 => /lib/x86_64-linux-gnu/libmvec.so.1 (0x00007efc31314000)
libcudart.so.10.0 => /usr/local/cuda-10.0/lib64/libcudart.so.10.0 (0x00007efc3109a000)
libcublas.so.10.0 => /usr/local/cuda-10.0/lib64/libcublas.so.10.0 (0x00007efc2cb04000)
libcurand.so.10.0 => /usr/local/cuda-10.0/lib64/libcurand.so.10.0 (0x00007efc2899d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007efc2877e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efc2838d000)
/lib64/ld-linux-x86-64.so.2 (0x00007efc31cab000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007efc28189000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007efc27f81000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007efc27bf8000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007efc279e0000)
一切正常,运行下面的命令看是否能正常使用
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
得到输出:
data/dog.jpg: Predicted in 0.427469 seconds.
dog: 100%
truck: 92%
bicycle: 99%
YOLOv3-GPU的Demo成功运行!