原创博客,转载请说明出处! (本人第一篇博客,用心之作,有用求赞)
首先得感谢一篇博客的作者yhao:点击打开链接 (http://blog.csdn.net/yhaolpz/article/details/71375762) 他提供了很详细的基于CUDA 8.0 的安装过程。由于我需要安装的是CUDA 9.1+cuDNN v7+OpenCV 3.4.0,照搬CUDA 8.0的安装过程会有很多错误出现,通过我的不断探索也已一一解决(官方安装文档+stackover+Nvidia官方论坛+各种搜和问),而且给出了很多可能出现问题的解决方法。我还添加了很多配置过程的说明,让大家知其然也知其所以然。
我的安装硬件是两块 TITAN Xp 显卡。
安装过程分为以下八步:
1、安装依赖包
2、安装显卡驱动
3、配置环境变量
4、安装 CUDA 9.1
5、安装 cuDNN v7
6、安装 OpenCV 3.4.0
7、安装 caffe
8、用 mnist 手写数据集验证
9、在PyCharm上运行caffe
10、补充(持续更新)
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git cmake build-essential
sudo apt-get install git cmake build-essential
界面提示如下则说明已成功安装依赖包,否则继续安装直到安装成功。
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version (12.1ubuntu2).
cmake is already the newest version (3.5.1-1ubuntu3).
git is already the newest version (1:2.7.4-0ubuntu1.3).
0 upgraded, 0 newly installed, 0 to remove and 126 not upgraded.
sudo apt-get update
更新下载源,然后重新输入安装命令。
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
** (gedit:4243): WARNING **: Set document metadata failed: 不支持设置属性 metadata::gedit-position
sudo update-initramfs -u
lsmod | grep nouveau
CUDA 9.1安装包里自带的显卡驱动为:linux-x86_64 387.26,可以适配新出的很多显卡。(特别说明:我的电脑安装完387.26版本的驱动后成功配置了caffe,但在某次异常断电重启后显卡驱动失效,感觉此驱动不稳定。求稳的朋友可以安装CUDA 9.0,配置方法此博客同样适用。)
CUDA 9.1 和cuDNN安装包没下的同志可以从我自己上传的百度云下载:链接:https://pan.baidu.com/s/1c4m5aiG 密码:ckj4
sudo service lightdm stop
这里会要求你输入账户的密码。然后通过 Ctrl + Alt + F7 发现已无法成功返回图形化模式,说明桌面服务已成功关闭,注意此步对接下来的 nvidia 驱动安装尤为重要,必需确保桌面服务已关闭。按Ctrl + Alt + F1 再次进入文本模式,先卸载之前的显卡驱动:
sudo apt-get purge nvidia*
然后运行 CUDA 安装文件安装驱动,之前我们已经把 CUDA 安装文件移动至 HOME文件夹,直接通过 sh 命令运行安装文件即可:
sudo sh cuda_9.1.85_387.26_linux.run --no-opengl-libs #run文件的文件名根据自己下的文件名修改,默认是我提供的文件
执行此命令约1分钟后会出现安装协议要你看,刚开始是0%,此时长按回车键让此百分比增长,直到100%,然后按照提示操作即可,先输入 accept ,然后是否安装显卡驱动选择yes
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 387.26?
(y)es/(n)o/(q)uit: y
之后会问你是否安装 nvidia-xconfig,建议选择no。
do you want to run nvidia-xconfig?
(y)es/(n)o/(q)uit: n
是否安装 CUDN 9.1 都选择no。也就是我们这次只安装一个显卡驱动,目的是先保证显卡驱动安装成功,否则安装CUDA 9.1很容易失败。
Install the CUDA 9.1 Samples?
(y)es/(n)o/(q)uit: n
Install the CUDA 9.1 Toolkit?
(y)es/(n)o/(q)uit: n
安装完成后重启系统:
reboot
重启系统后看看桌面显示的分辨率正不正常。如果应用图标很大,像素很渣,说明显卡驱动没有安装成功,有可能是因为禁用
nouveau没有生效,也有可能是驱动不匹配,这时候可以使用我提供的方法二。安装完成后通过以下命令查看显卡信息:
nvidia-settings
我的电脑显示如下信息:
注意:再次提醒此方法暂时不适用于CUDA 9.1
首先仍旧是关闭桌面服务并卸载之前的显卡驱动(这两步见方法一),随后加入官方ppa源:
sudo add-apt-repository ppa:graphics-drivers/ppa
之后刷新软件库并安装显卡驱动:
sudo apt-get update
sudo apt-get install nvidia-384 nvidia-settings nvidia-prime
我用此命令会自动安装 384.111版本的驱动(我使用 nvidia-367 安装的也是384.111版本的驱动)。安装完成后输入reboot重启系统,假如桌面分辨率没什么问题应该安装成功了。之后通过下面命令查看显卡信息:
nvidia-settings
sudo gedit ~/.bashrc
打开后在文件最后加入以下两行内容:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
保存并退出。
安装完显卡驱动后,CUDA toolkit和samples可单独安装,直接在终端运行安装,无需进入文本模式:
sudo sh cuda_9.1.85_387.26_linux.run --no-opengl-libs
执行此命令约1分钟后会出现安装协议要你看,刚开始是0%,此时长按回车键让此百分比增长,直到100%,然后按照提示操作即可,先输入 accept ,是否安装显卡驱动选择no:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 387.26?
(y)es/(n)o/(q)uit: n
其他的都选择yes或者默认,等待安装完成:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 387.26?
(y)es/(n)o/(q)uit: n
Install the CUDA 9.1 Toolkit?
(y)es/(n)o/(q)uit: y
Enter Toolkit Location
[ default is /usr/local/cuda-9.1 ]:
Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y
Install the CUDA 9.1 Samples?
(y)es/(n)o/(q)uit: y
Enter CUDA Samples Location
[ default is /home/ccem ]:
Installing the CUDA Toolkit in /usr/local/cuda-9.1 ...
Installing the CUDA Samples in /home/ccem ...
Copying samples to /home/ccem/NVIDIA_CUDA-9.1_Samples now...
Finished copying samples.
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-9.1
Samples: Installed in /home/ccem
Please make sure that
- PATH includes /usr/local/cuda-9.1/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.1/lib64, or, add /usr/local/cuda-9.1/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.1/bin
Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.1/doc/pdf for detailed information on setting up CUDA.
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.1 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver
Logfile is /tmp/cuda_install_36731.log
假如出现:
Installing the CUDA Toolkit in /usr/local/cuda-9.1 …
Missing recommended library: libGLU.so
Missing recommended library: libX11.so
Missing recommended library: libXi.so
Missing recommended library: libXmu.so
原因是缺少相关的依赖库,安装相应库就解决了,安装库完成后重装一下CUDA Toolkit即可:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
安装完成后配置CUDA环境变量,使用 gedit 命令打开配置文件:
sudo gedit ~/.bashrc
在该文件最后加入以下两行并保存:
export PATH=/usr/local/cuda/bin:$PATH #/usr/local/cuda和/usr/local/cuda-9.1是同一个文件夹,前者是后者的镜像
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
使该配置生效:
source ~/.bashrc
检验CUDA 是否安装成功,输入:
cd /usr/local/cuda-9.1/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
会出现你的显卡的详细信息。假如出现:
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL
那说明显卡驱动版本和CUDA 9.1不适配,目前 384.xx版本的驱动是不支持CUDA 9.1 的,这时候就尝试安装更加新的驱动。若还是不行就放弃 CUDA 9.1,安装CUDA 9.0吧,趁还来得及。此博客同样适用于安装CUDA 9.0,只需将配置文件中出现cuda-9.1的地方改成cuda-9.0即可。
卸载CUDA 9.1 的方法:
cd /usr/local/cuda/bin
sudo ./uninstall_cuda_9.1.pl
卸载完成后如果显示:Not removing directory, it is not empty: /usr/local/cuda-9.1 ,假如需要重装CUDA 9.0的话就把这个文件夹删除。在/usr/local/路劲下输入:
sudo rm -r cuda-9.1
sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件
然后命令行进入 cudn/lib64 文件夹路径下,运行以下命令(CUDA 9.0也是一样的命令):
sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.7 #删除原有动态文件
sudo ln -s libcudnn.so.7.0.5 libcudnn.so.7 #生成软衔接
sudo ln -s libcudnn.so.7 libcudnn.so #生成软链接
随后需要将路径/usr/local/cuda/lib64 添加到动态库,分两步:
1)安装vim。输入:
sudo apt-get install vim-gtk
2)输入:
sudo vim /etc/ld.so.conf.d/cuda.conf
键盘按i进入编辑状态,添加文字:
/usr/local/cuda/lib64
然后按esc,输入:(注意有冒号)
:wq #保存退出
终端下接着输入 sudo ldconfig 命令使链接生效。
软链接后可以用sudo ldconfig -v 命令查看是否链接成功:是否有/usr/local/cuda/lib64文件夹。ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
安装完成后可用 nvcc -V 命令验证是否安装成功,若出现以下信息则表示安装成功:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 #编译
在98%的时候会等很久很久,属于正常现象。编译过程很顺利,编译成功后安装:
sudo make install #安装
安装完成后通过查看 opencv 版本验证是否安装成功:
pkg-config --modversion opencv
卸载OpenCV的方法:进入OpenCV解压文件夹中的buid 文件夹:
cd /home/ccem/opencv-3.4.0/build
运行:
sudo make uninstall
然后把整个opencv-3.4.0文件夹都删掉。随后再运行:
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv
把一些残余的动态链接文件和空文件夹删掉。有些文件夹已经被删掉了所以会找不到路径。
git clone https://github.com/BVLC/caffe.git
这时候会出现一个caffe文件夹。命令行进入此文件夹,运行:
sudo cp Makefile.config.example Makefile.config
此命令是将 Makefile.config.example 文件复制一份并更名为 Makefile.config ,复制一份的原因是编译 caffe 时需要的是 Makefile.config 文件,而Makefile.config.example 只是caffe 给出的配置文件例子,不能用来编译 caffe。
sudo gedit Makefile.config
将:
#USE_CUDNN := 1
修改为:
USE_CUDNN := 1
将:
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
将:
#WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
将:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
找到
# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
改为:
# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
nvcc fatal : Unsupported gpu architecture 'compute_20'
将:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
将:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
改为:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CUDA_GENERATION=Kepler ..
make all -j8
这时如果之前的配置或安装出错,那么编译就会出现各种各样的问题,所以前面的步骤一定要细心。假如编译失败可对照出现的问题Google解决方案,再次编译之前使用 sudo make clean 命令清除之前的编译,报错:nothing to be done for all 就说明没有清除之前的编译。编译成功后可运行测试:
sudo make runtest -j8
BatchReindexLayerTest/3.TestGradient, where TypeParam = caffe::GPUDevice
Google了一下,貌似使用CUDA 9.1加双显卡的都有这个错误,暂且不管它,目前不影响使用。使用mnist测试程序是可以运行的。CUDA 9.0则测试全部通过。
make all -j8
2)
下载mnist数据库,在caffe目录下运行:
sudo ./data/mnist/get_mnist.sh
3)
将二进制数据库文件转换成lmdb数据库格式:
sudo ./examples/mnist/create_mnist.sh
4)
训练lenet网络:
sudo ./examples/mnist/train_lenet.sh
结果如下:
我前面也提到过,电脑安装CUDA 9.1自带的显卡驱动版本 387.26不稳定,在某次重启后失效了。于是我重新安装了384.111版本的显卡驱动。但恶心的是,CUDA 9.1 不支持384.xx版本的驱动,于是我想换成CUDA 9.0。但是此时我已经完全配置好caffe了,不需要全部推倒重来,只需先卸载CUDA 9.1和openCV 3.4.0,然后重装CUDA 9.0,cuDNN 和openCV 3.4.0 即可,卸载的方法前面步骤里有,其他的都不需要动(完全按照我的教程配置的话环境变量都不需要改,否则需要检查一下环境变量,将cuda-9.1出现的地方换成cuda-9.0), make runtest 即可全部通过。第九步中把pycaffe重新编译一下即可。