楼主接触深度学习有快两年的时间了,期间由于急于求成的心态以及技术水平的限制,各种各样的框架环境配置均由身边的大神协助解决,至此已经不同程度的接触过tensorflow/caffe/keras/pytorch四种框架,感恩各路大神出现的同时,辣鸡楼主也决定洗心革面,重新把上述框架配置问题自己动手进行一遍,安稳自己底需内心的同时,也分享给和楼主一样提到配置就头大的朋友们一些抢救的可能~
无论是上述四种框架的哪一种,想要利用gpu模式,都需要首先配置gpu环境,这就包括nvidia显卡驱动的安装,cuda的安装以及cudnn的安装,还有图像处理必备包opencv的安装,有了这些基础环境,框架可以任你配置,都会比较简单,所以我们先从这部分讲起。
一. nvidia显卡驱动的安装
该部分重点参考文章:https://blog.youkuaiyun.com/qq_20492405/article/details/79034430
0. 最重要的准备工作(禁用BIOS安全启动模式)
如果不禁用BIOS的安全启动模型,会导致安装后系统仍然找不到驱动,具体原理楼主尚未搞明白,但是这个步骤是很必要的,楼主一开始没有禁用这个模式,因此安装后明明文件中有显卡驱动,但系统就是无法识别。禁用的步骤为:
重启计算机,然后立即以每秒一次的频率反复按 Esc ,直到打开“开始菜单”。 这可能需要多次尝试,然后按 F10 ,打开 BIOS 设置。
使用右箭头键选择“系统配置(System Configuration)”菜单,使用向下箭头键选择“启动选项(Boot Options)”,然后按 Enter 键。
使用向下箭头键选择“安全启动(Secure Boot)”,按 Enter,选择DISABLED,保存,即可。
1. 确认原有驱动版本并卸载
安装的第一步是先确认自己是否已有nvidia驱动,命令为:
sudo dpkg --list | grep nvidia-*
如没有输出,则无驱动,有输出,则原来装有驱动,想要更新为最新的驱动,先卸载原有驱动,命令为:
#for case1: original driver installed by apt-get:原来使用apt-get方式安装
sudo apt-get remove --purge nvidia*
#for case2: original driver installed by runfile:即原来使用.run文件安装
sudo chmod +x *.run
sudo ./NVIDIA-Linux-x86_64-384.59.run --uninstall
2. 下载所需的nvidia显卡驱动
首先确认你的显卡型号,输入命令:
lspci | grep -i nvidia
根据显示的显卡型号到nvidia官网下载显卡驱动,网址为:https://www.geforce.cn/drivers
例如楼主的显卡是GTX950M,手动输入查询的条件,如下图,下载最新的驱动即可
3. 禁用nouveau驱动:
ubuntu自带的nouveau驱动会影响cuda安装,不当操作会导致黑屏和登陆循环。
打开黑名单文件:
# 要是图形化界面就用gedit,不是就用vi
sudo gedit /etc/modprobe.d/blacklist.conf
# 或者
# sudo vi /etc/modprobe.d/blacklist.conf
在最后加入下面三行并保存:
blacklist nouveau
blacklist intel
options nouveau modeset=0
然后执行:
sudo update-initramfs -u
重启,执行:
lsmod | grep nouveau
如果没有输出,表明禁用成功。
4.禁用X-Window服务:
安装显卡驱动需要禁用该服务,否则会安装终止,并出现相应需要禁用该服务的错误,输入命令:
sudo service lightdm stop
然后按 Ctrl+Alt+F1,之后输入用户名密码,进入控制台模式
5. 安装驱动
在控制台模式中,进入下载的驱动所在的位置,如Download中,修改权限,并安装:
cd ~/Downloads
#给run文件赋予执行权限
sudo chmod +x NVIDIA-Linux-x86_64-XXX.XXX.run
#执行该文件:
sudo ./NVIDIA-Linux-x86_64-XXX.XXX.run -no-opengl-files
- –no-opengl-files 只安装驱动文件,不安装OpenGL文件。这个参数最重要
- –no-x-check 安装驱动时不检查X服务,所以我猜测如果不禁用X服务,加上这个参数也是可以的,有兴趣的读者可以尝试
- –no-nouveau-check 安装驱动时不检查nouveau
后面两个参数可不加。
在这一过程中,按照提示往下进行就好。
6. 重启电脑
重启电脑,并输入:nvidia-smi验证是否安装成功,出现如下界面则安装成功
ps:如重启后出现分辨率为800*600,切不可调的情况:
执行下面命令:
sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
sudo touch /etc/X11/xorg.conf
sudo reboot
7. 配置环境变量:
输入:
sudo gedit /etc/profile
在最后两行加入:
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
输入:
sudo env
若显示刚刚加入的环境变量表示成功。
至此,显卡驱动配置成功,如果出现了循环登录的情况,则可参照博客:www.cnblogs.com/talugirl/p/5870875.html
二. cuda
1.下载相应版本的cuda
楼主参考很多博客,选择较为稳妥的cuda-8.0进行配置,下载官网: https://developer.nvidia.com/cuda-toolkit-archive
同样将它放置在Download文件夹下。
2. 安装cuda
cd ~/Downloads
sudo chmod 777 cuda_8.0.xx_linux.run
sudo ./cuda_8.0xx_linux.run -no-opengl-libs
license文件很长,长按CTRL+F(CTRL +B是往前翻一页)即可。
选项:
1): Do you accept the previously read EULA?
accept
下一步是需要注意的重点:
2): Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 375.26?
n(因为我们已经在上面的步骤安装了最新的显卡驱动)
3): Install the CUDA 8.0 Toolkit?
y
4): Enter Toolkit Location
enter
5): Do you want to install a symbolic link at /usr/local/cuda?
y
6): Install the CUDA 8.0 Samples?
y
7): Enter CUDA Samples Location
enter
安装完成:
成功完成后会显示Installed
3.配置环境
打开配置文件:
sudo gedit ~/.bashrc
输入:
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
使该配置生效:
source ~/.bashrc
接下来设置环境变量和动态链接库,:
#在命令行输入:
sudo gedit /etc/profile
#在打开的文件末尾加入:
export PATH=/usr/local/cuda/bin:$PATH
#保存之后,创建链接文件:
sudo gedit /etc/ld.so.conf.d/cuda.conf
#在打开的文件中添加如下语句:
/usr/local/cuda/lib64
#然后执行
sudo ldconfig
#使链接立即生效。
至此,cuda配置成功
4.测试
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery
sudo make -j4
./deviceQuery
显示上面的图片则deviceQuery成功。
三. cudnn
此处重点参考:https://blog.youkuaiyun.com/weixin_41864878/article/details/79621210
1.下载cudnn
在官网上找到cuda对应的cudnn进行下载,官网:https://developer.nvidia.com/rdp/cudnn-archive
要的是library for linux,这个下载后是个.tar ,具体什么版本看自己需求
此处需要bb几句:
(1)能支持cuda8的cudnn版本包括cudnn5/cudnn6/cudnn7;
(2)这里用哪个取决于你后边安什么,比如我要装tensorflow,tf的1.3和1.4版本只支持cuda8+cudnn6组合,所以此处选cudnn6;如果是tf的1.5和1.6版本需要的是cuda9+cudnn7组合;
如果像楼主一样,cudnn版本装高了,需要重新安装时,先要卸载原有cudnn,方法如下:
$ sudo rm -rf /usr/local/cuda/include/cudnn.h
$ sudo rm -rf /usr/local/cuda/lib64/libcudnn*
如没装过,跳过这一步,直接安装下边的
该网站需要先注册再下载
2.安装cudnn
1) 继续Ctrl+alt+F1进入的字符界面
2) 进入解压后的cudnn-9.0-linux-x64-v7.0.tgz文件cuda,在终端执行下面的指令安装:
tar -zxvf cudnn-9.0-linux-x64-v7.0.tgz
cd cuda
sudo cp lib64/lib* /usr/local/cuda/lib64/
sudo cp include/cudnn.h /usr/local/cuda/include/
然后更新网络连接:
cd /usr/local/cuda/lib64/
sudo chmod +r libcudnn.so.7.0.3 # 自己查看.so的版本
sudo ln -sf libcudnn.so.7.0.3. libcudnn.so.7
sudo ln -sf libcudnn.so.7 libcudnn.so sudo ldconfig
重新启动图形化界面
sudo service lightdm start
再
Ctrl+alt+F7
退出
Text Mode。
随后进入cuda目录,输入ll,若显示cudnn版本,则安装正确
lrwxrwxrwx 1 root root 13 3月 19 16:02 libcudnn.so -> libcudnn.so.7*
lrwxrwxrwx 1 root root 17 3月 19 16:02 libcudnn.so.7 -> libcudnn.so.7.0.4*
-rwxr-xr-x 1 root root 287641664 3月 19 16:00 libcudnn.so.7.0.4*
四. opencv
官网:https://opencv.org/releases.html
选择安装3.1是求稳的操作,我看到有博主实验过3.0以下的版本可能不兼容,再高的版本我认为不太好找其他匹配的包,所以不难为自己,直接上3.1
此处重点参考:https://blog.youkuaiyun.com/u012587561/article/details/77942696
首先安装依赖包:
$ sudo apt-get installbuild-essential
$ sudo apt-get install cmake 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 libjasper-dev libdc1394-22-dev # 处理图像所需的包
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
$ sudo apt-get install libxvidcore-dev libx264-dev # 处理视频所需的包
$ sudo apt-get install libatlas-base-dev gfortran # 优化opencv功能
$ sudo apt-get install ffmpeg
然后解压opencv到opencv3-1.0,创建目录build
$ cd opencv-3.1.0
$ mkdir build
cmake:
cd build/
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/home/zl/anaconda3/
-D WITH_OPENMP=ON ##不加这个会报错
-D PYTHON_EXCUTABLE=/home/zl/anaconda3/bin/python .. ##以上两个为anaconda3的路径
make:
make -j4 # 4代表4个线程并行编译
make过程报错:
modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/build.make:290: recipe for target 'modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o' failed
make[2]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o] Error 1
make[2]: *** 正在等待未完成的任务....
CMakeFiles/Makefile2:9585: recipe for target 'modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/all' failed
make[1]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
[ 94%] Linking CXX shared library ../../lib/libopencv_photo.so
[ 94%] Built target opencv_photo
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
修改 ~/opencv-3.1.x/modules/cudalegacy/src/graphcuts.cpp文件内容,将第45行修改成以下内容(可能45行,具体的看下面的解释):
// #if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
就是在
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
后面加上
|| (CUDART_VERSION >= 8000)
下图为编译成功的结果
成功之后输入(如果不使用sudo,可能在make install的使用提示权限不够):
sudo make install
上面是完全安装成功的截图,添加链接:
sudo gedit /etc/ld.so.conf.d/opencv.conf
写入:/usr/local/lib
sudo ldconfig
其他错误可详见连接:https://blog.youkuaiyun.com/weixin_41887832/article/details/81988355
之后,import cv2,报错,解决方法参考:https://blog.youkuaiyun.com/weixin_40745291/article/details/86368938
原因:
ubuntu16.04系统自带python2和python3。直接命令行中,python,python3就可以使用并查看相应版本。
但我们一般也会装anaconda集成包,因为他包含了python以及相关安装包。使用起来比较方便。
但是从源码安装编译opencv时却因为anaconda这个包的存在埋了不少坑。
本人之前先在系统自带python的基础上又安装了anaconda3,并将anaconda3中的python3.6加入到系统路径中,这样系统就会一直调用anaconda3中python3.6.
然后再从源码安装编译opencv3.4.0,这时候会出现一个问题。编译时要生成python可以调用的cv2.so,需要调用python编译器,但此时opencv源码中的cmakelist懵了,不知道用系统自带还是anaconda中的python,干脆就放弃了编译生成这个python接口可调用的cv2.so文件。所以此时无论在系统python环境下还是anaconda python环境下都不能import cv2.
我本人亲自试过可用的方法:
使用系统自带的python2和python3编译分别会生成cv2.so和cv2.cpython-35m-x86_64-linux-gnu.so这就是我们分别在anaconda2和anaconda3中import的cv2模块。
因为我的是anaconda3,所以首先进入到~/opencv-3.4.0/my_build_dir/lib/python3目录下将其中的cv2.cpython-35m-x86_64-linux-gnu.so复制到anaconda下。(如果是anaconda2就直接将cv2.so复制进去就可以了)
sudo cp cv2.cpython-35m-x86_64-linux-gnu.so /home/zya/anaconda3/lib/python3.6/site-packages/
然后改名cv2.so就可以使用