笔记本Ubuntu18.04安装NVIDIA驱动,配置darknet环境,并跑yolov3例程(完全过程记录)

前言
我的笔记本电脑显卡为GTX 1050,想利用它跑深度学习,但是配置环境时遇到了好多问题。前前后后重装了十几次ubuntu,一个一个试网上的问题解决方案,最终把环境搭好了。说多了都是泪。。。
所以,我把搭环境的操作记录并整理了下,在此发表,希望能帮助到一些人。
环境参数

  • 笔记本显卡:GTX 1050
  • Ubuntu版本:18.04
  • NVIDIA驱动版本:410.78
  • cuda版本:10.0.130
  • cudnn版本:cudnn-10.0-linux-x64-v7.4.1.5
  • opencv版本:3.2.0

我用的深度学习框架为 darknet ,目标检测算法用 yolov3。
darknet和yolov3介绍:https://cloud.tencent.com/developer/news/76803

一.安装Ubuntu双系统

在windows磁盘管理中分出可用空间给Ubuntu。
分出可用空间
这里我分了150G,建议100G以上。
然后网上下载U盘烧写工具,下载Ubuntu镜像文件(我下载的是Ubuntu18.04,没特别要求建议用最新的)。
制作U盘启动盘。
开机设置bios,进入U盘启动,安装Ubuntu。
这里需要注意两点:
1.选择为图形或无线硬件…安装第三方软件,后面装NVIDIA驱动需要
1
2.选择<安装Ubuntu,与Window Boot Manager共存>
这里电脑会自动选择可用空间安装Ubuntu。
所以其实不用像一些教程中自己搞分区安装,那样会很麻烦,弄不好可能还会出现问题。
2选择最小安装,安装时间大约20min。

  • ——————————————————————————————————
    问题:我在安装完成后进入Ubuntu后黑屏
    解决办法:
    开机出现grub画面,按’’‘e’’’ 进入编辑开机指令的模式(或者开机直接按“e”), 找到’’‘quitesplash’’’ 并在后面加上“nomodeset”,按’‘F10’'启动系统 。
    ————————————————————————————————

这时虽然进入了Ubuntu桌面环境,但是NVIDIA显卡没有被使用,我们需要手动安装NVIDIA驱动。

二.安装NVIDIA驱动

安装前准备:
开机时把bios里的secure boot关闭,要不然会影响后面安装NVIDIA驱动。

如果开机时,进入蓝色背景的界面perform mok
选择enroll mok
选择contitue
进入enroll the key
选择yes。
(这一步同样重要)

下载驱动:
这里要注意CUDA版本对显卡驱动版本有要求,官网说明:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
截图如下,以官网最新声明为准。
官网说明
去英伟达官网下载驱动程序:
http://www.nvidia.cn/Download/index.aspx?lang=cn
注意驱动下载好后放在一个英文目录下(tty下中文会显示乱码,所以要用英文路径)

首先更新:(重要步骤,因为upgrade可能会更新linux内核,这跟CUDA驱动有关系)

sudo apt update
sudo apt upgrade

禁用nouveau第三方驱动
打开编辑配置文件: sudo gedit /etc/modprobe.d/blacklist.conf
在最后一行添加:blacklist nouveau
改好后执行命令:sudo update-initramfs -u

重启后仍需要在开机指令中加"nomodeset"才能进入桌面图形环境。
重启后打开终端,输入lsmod | grep nouveau,正常为没有输出,意味着禁用nouveau成功。
因为安装驱动需要编译器,我们直接安装build-essential来解决这个问题 :
安装前需要换源(在< 软件和更新 >中更改,我选的是清华大学的源 tuna.tsinghua.edn.cn )
换源后安装:
sudo update
sudo apt install build-essential

接下来准备安装NVIDIA驱动:
首先要知道:要装显卡相关驱动时,必须禁用图形功能,才能正常安装。
所以要在Ubuntu的tty下用shell指令安装。
我们先设置在tty模式下的登录密码
sudo passwd root
设置新的unix密码。然后
sudo init 3
再按Ctrl+Alt+F3进入tty3,账号为root,密码为刚才设置的那个。
禁用图形服务:
sudo service gdm3 stop
很多教程是 sudo service lightdm stop,但是Ubuntu18.04用的是gdm3而不是lightdm
cd到驱动下载的目录,给文件添加执行权限:
sudo chmod a+x NVIDIA-Linux-x86_64-390.25.run (下载的驱动文件名)
驱动安装:

sudo ./NVIDIA-Linux-x86_64-390.25.run -no-opengl-files –no-x-check –no-nouveau-check 

安装后,重启,这次不需要添加nomodeset,因为显卡驱动装上去了。
输入sudo nvidia-smi,如果打印出显卡相关信息,说明驱动装上去了。

三.安装CUDA

cuda官方安装教程:
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
安装cuda要用deb文件安装。
这里尽量不要用.run文件安装,NVIDIA官方有这段话:
说明重点是这一句:While the Runfile installation performs no package validation, the RPM and Deb installations of the driver will make an attempt to install the kernel header and development packages if no version of these packages is currently installed.
如果用run文件安装的话,后面给系统 upgrade 后,会导致cuda运行出错。(亲测出错)
而用deb文件安装的话,就没有这个问题了。
安装cuda:
用deb文件安装CUDA。
下载cuda的.deb安装文件到英文目录:https://developer.nvidia.com/cuda-downloads

sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
source ~/.bashrc

四.安装Cudnn

cudnn官方安装教程:
https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#axzz4qYJp45J2
下载地址:
https://developer.nvidia.com/rdp/cudnn-download
我下载的是:cudnn-10.0-linux-x64-v7.4.1.5.tgz
用以下方式安装:

sudo tar -xzvf cudnn-10.0-linux-x64-v7.4.1.5.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
sudo gedit ~/.bashrc

最后一行添加:

export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64

注意路径中cuda版本要对应。
然后执行:

source ~/.bashrc

五.opencv安装

我们接下来通过源码编译的方式安装opencv。
官方提供opencv安装教程:
https://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation
1.安装cmake和一些依赖库,工具

sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev #必要安装
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev  libjasper-dev #可选安装,我是有安装啦

遇到E: Unable to locate package libjasper-dev
解决方法:https://blog.csdn.net/weixin_41053564/article/details/81254410

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

2.下载opencv
先定位到你要下载的目录,我是选择Downloads目录下 cd

~/Downloads/
sudo wget https://github.com/opencv/opencv/archive/3.2.0.zip #下载opencv源码
sudo wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip
sudo unzip 3.2.0.zip  #解压
sudo unzip 3.2.0.zip.1

3.cmake GUI配置opencv
参考:https://blog.csdn.net/jindunwan7388/article/details/80397700

sudo apt-get install cmake-qt-gui
cd ~/Downloads/opencv-3.2.0/
sudo mkdir release
cd release/
sudo cmake-gui .. #打开cmake gui

cmake gui
选择opencv-3.2.0为源码目录
选择刚才新建的release文件夹为编译文件存放目录
点击左下方的Configure按钮,选择Unix Makefiles,选择Use default native compilers(默认),然后点击Finish。
点击Configure,过程中需要下载一些文件,要等待一段时间。
然后CMake会载入一些默认配置。
cmake配置
找到这个选项
cmake配置
改变这个选项的目录为opencv_contrib-3.2.0/modules文件夹。
然后在 Search 中查找cuda有关的选项,取消所有有关cuda的选项。
这样做是因为我们用darknet的cuda选项,所以就不需要opencv去支持cuda。
在这里插入图片描述
点击Generate生成配置文件,配置完成后,关闭cmake gui。
然后编译,安装:

sudo make 
sudo make install

说明:如果勾选了cuda相关选项,编译的时候会到用NVCC(CUDA的编译器),编译的过程十分缓慢,可能需要2~3小时编译。
NVCC介绍:https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cuda-sources

六.安装darknet,跑YOLO v3

参考:https://www.jianshu.com/p/813342202837

cd ~/Download
git clone https://github.com/pjreddie/darknet.git
cd darknet
sudo make
./darknet

出现 usage: ./darknet < function> ,即为安装成功

现在为了测试我们的yolo,需要下载官方训练完毕的权重到darknet目录下
https://link.jianshu.com/?t=https%3A%2F%2Fpjreddie.com%2Fmedia%2Ffiles%2Fyolov3.weights
或者运行以下命令:

cd darknet
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

出现这个,说明正常
出现这个
这个结果是CPU跑的,花费时间比较久。
接下来我们测试下GPU跑的时间。
修改darknet/ 目录下的Makefile文件这三个选项:

GPU=1
CUDNN=1
...
NVCC=/usr/local/cuda-10.0/bin/nvcc

然后重新
sudo make
sudo ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

  • ——————————————————————————————————
    出现问题:error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory
    解决:

      sudo cp /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/
      sudo cp /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/
      sudo cp /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/
      sudo cp /usr/local/cuda-10.0/lib64/libcudnn.so.7  /usr/local/lib/
      sudo ldconfig
    

    ——————————————————————————————————

  • ——————————————————————————————————
    出现问题:/usr/bin/ld: 找不到 -lcuda
    解决:
    sudo ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/local/cuda/lib64/libcuda.so
    ——————————————————————————————————

  • ——————————————————————————————————
    出现问题:/sbin/ldconfig.real: /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so.7 不是符号链接
    解决参考:https://blog.csdn.net/CAU_Ayao/article/details/83512036
    我的操作供参考:
    find /usr/local/cuda-10.0/targets/x86_64-linux/lib/ | grep libcudnn.so
    参考
    将数字后缀的库链接到 libcudnn. so :
    sudo ln -sf /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so.7 /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so

    sudo ln -sf /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so.7.4.1 /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so

    ——————————————————————————————————

  • ——————————————————————————————————
    如果遇到问题:
    CUDA Error: out of memory
    darknet: ./src/cuda.c:36: check_error: Assertion ‘0’ failed.
    解决:更改cfg目录下的yolov3.cfg,把subdivisions=16
    改为subdivisions=64即可。
    ——————————————————————————————————

错误解决完后再次执行

sudo ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

最终效果:
最终效果
可以看到检测时间0.198599s比之前19.261127s快了很多,可见GPU的算力比CPU大很多。
但是结果没有以图片的形式显示,接下来用opencv来实现这个功能。

更改darknet中Makefile 关于opencv的选项

OPENCV=1

重新编译:

sudo make 

重新运行:

sudo ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
  • ——————————————————————————————————
    报错:error while loading shared libraries: libopencv_highgui.so.3.2: cannot open shared object file: No such file or directory
    解决:
    默认路径安装后,libopencv_highgui.so.3.2在/usr/local/lib下,所以我们做以下操作

     cd /etc/ld.so.conf.d
     sudo gedit OpenCV.conf
    

    添加/usr/local/lib,保存关闭,然后执行

     sudo ldconfig
    

——————————————————————————————————

  • ——————————————————————————————————
    出现error:Failed to load module “canberra-gtk-module”
    解决:sudo apt-get install libcanberra-gtk-module
    ——————————————————————————————————

错误解决完后再次执行

sudo ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

效果:
效果

环境搭好了,接下来可以玩耍了 ^ _ ^

猜你喜欢

转载自blog.csdn.net/Jeff_zjf/article/details/84846350