YOLO3+GPU(gtx1060)

安装参加yolo3官网,较为简单。

此文主要针对配置与问题解决。

一.配置GPU和CUDA信息

Darknet在GPU上运行可以得到500倍的提速,编译使用GPU要求显卡是Nvidia卡并且正确安装了CUDA。

GPU环境下的编译配置都是在 /darknet/Makefile 文件中定义的,GPU环境的编译有3点更改需要注意。


1. 更改Makefile前两行GPU和CUDNN的配置:

(备注:makefile 用vim打开,按ESC,再输入:wq,实现保存退出)
GPU=1

CUDNN=1


2. 更改CUDA的路径

48~51行,在"ifeq ($(GPU), 1)"语句块中修改为自己的CUDA安装路径,更改前默认路径如下:


ifeq ($(GPU), 1)

COMMON+= -DGPU -I/usr/local/cuda/include/

CFLAGS+= -DGPU

LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand


例如修改为:


ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda-9.0/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand

23行,修改NVCC的路径:


NVCC=/usr/local/cuda-8.0/bin/nvcc


3. 修改ARCH配置


如果经过1和2的配置修改后编译的darknet运行可能会报以下错误:

Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)

这是因为配置文件Makefile中配置的GPU架构和本机GPU型号不一致导致的。
更改前默认配置如下(不同版本可能有变):

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52]
#      -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52

compute_30表示显卡的计算能力是3.0,几款主流GPU的compute capability列表:

        GTX Titan x : 5.2
        GTX 980      : 5.2
        Tesla K80    : 3.7
        Tesla K40    : 3.5
        K4200         : 3.0


所以Tesla K80对应compute_30,Tesla K40c对应compute_35,Titan X对应compute_52,根据自己的GPU型号的计算能力进行配置,例如配置为:

我的gtx1060,对应5.2

对应改成这样就好:

ARCH= -gencode arch=compute_52,code=compute_52 \

【转载自:https://blog.csdn.net/dcrmg/article/details/78565350  】

二.遇到的报错

2.1 ./darknet: error while loading shared libraries: libcudnn.so.7: cannot open shared object file: No such file or directory

报错就是没找到相关的文件

sudo cp /usr/local/cuda-9.0/lib64/libcudnn.so.7 /usr/local/lib/libcudnn.so.7


(sudo cp 源文件位置   复制后的文件位置:就是从usr/local/cuda-9.0/lib64/libcudnn.so.7找出来,粘贴到/usr/local/lib文件夹里面)

需要权限的复制粘贴还可以这样:

 第一步:打开终端,在命令行里输入sudo nautilus
  第二步:输入你的用户的密码
  第三步:在弹出的窗口中打开需要操作的目录
  第四步:把你所需要的其他目录中的文件进行复制,并且粘贴到当前的

2.2 报错

    0 Cuda malloc failed
: File exists
darknet: ./src/utils.c:256: error: Assertion `0' failed.
已放弃 (核心已转储)


解决方案:

出现的场景有两个:训练时,测试时

1.训练时

打开yolov3.cfg,把其中的batch 和subdvisions属性值调小,但最好都是2的指数,并且要保证batch是subdivisions的整数倍。

gedit darket/cfg/yolov3.cfg

2.测试时

一个很大的可能是,忘记把配置文件darket/cfg/yolov3.cfg的训练配置改到测试配置上。

解决办法是打开yolov3.cfg,注释掉Training配置,同时Testing配置取消注释。
【转载自原文:https://blog.csdn.net/csdn_zhishui/article/details/83751944】

这种方法,完美解决问题。因为分给linux系统的运行内存只有4G,有限,所以需要设置batchsize,batchsize越大,对内存要求越高。

也有人说在前面加sudo ,这种方法我没有解决问题 。

 

3.加速效果

Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.088321 seconds.
dog: 100%
truck: 92%
bicycle: 99%


CPU耗时是40s左右,速度是500倍左右。效果还是相当明显的。


 

你可能感兴趣的:(YOLO3+GPU(gtx1060))