//以下方案,基于装有四卡Tesla p100的服务器安装
//系统平台:Ubuntu16.04.4 LTS
//默认安装cuda9.1+cudnn7.1+opencv3.4+caffe(GPU)
//同时测试基本兼容了cuda8.0+cudnn6.0+opencv3.2+caffe(GPU)安装
//如果还需安装TensorFlow,建议选择cuda9.0+cudnn7.0+opencv3.4+新版本TensorFlow
//如需老版本TensorFlow,建议选择cuda8.0+cudnn6.0+opencv3.2(or opencv2)+老版本TensorFlow
//加了背景色的是操作的基本命令
// 参考博客:
// https://blog.csdn.net/jonms/article/details/79318566 这篇主要讲cuda,cudnn的安装和测试
// https://blog.csdn.net/u014696921/article/details/53143176 这篇讲整个caffe的部署
// https://blog.csdn.net/tsb831211/article/details/78432206 这篇是童师兄写的教程,里面有详细的常用配置
// https://blog.csdn.net/u014696921/article/details/53138327 这篇主要讲caffe-ssd的部署
// https://blog.csdn.net/u010678153/article/details/52639083 这篇讲的其实也是caffe-ssd的部署,基本用不上
// https://blog.csdn.net/u014696921/article/details/53353896 这篇主要讲使用SSD训练自己的数据
// https://blog.csdn.net/qq473179304/article/details/79444609 这篇讲编译使用OpenCV、pycharm的caffe
// https://blog.csdn.net/cocoaqin/article/details/78163171 这篇讲OpenCV的安装
1. 安装Ubuntu系统
下载Ubuntu16.04镜像,使用UltraISO制作启动盘;
根据Windows安装方案选择legacy或UEFI启动
分区划分以实际空间为准,交换分区sawp大于内存容量,/boot至少给1024M,/、/usr、/var、/tmp分区根据教程划分,剩下的尽量多给/home
启动之后打开终端执行 sudo apt-get install update 和 sudo apt-get install upgrade
查看系统更新,更新完毕后sudo reboot
使用:sudo passwd root设置root的密码,并用su root 尝试是否成功
2. 更新系统源
进入ubuntu系统设置-软件与更新-ubuntu软件,使用的是中科大的源:http://mirrors.ustc.edu.cn/ubuntu
终端输入
cd /etc/apt/
sudo cp sources.list sources.list.bak
sudo vi sources.list
把下面的这些源添加到source.list中:
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
最后更新源和更新已安装的包:
终端输入
sudo apt-get update
sudo apt-get upgrade
3. 安装必要的标准库
安装gcc sudo apt-get install gcc
验证系统是否安装了kernel header和 package development
uname -r
sudo apt-get install linux-headers-$(uname -r)
满足要求后,便可进行下面的正式安装过程。
runfile文件的安装先要安装gcc-multilib
sudo apt install gcc-multilib
4. 安装显卡驱动
官网下载对应显卡的最新版驱动,放在/home文件夹下
sudo chmod a+x NVIDIA.......run
sudo ./NVIDIA.......run -no-x-check -no-nouveau-check -no-opengl-files
//以上带参数安装至关重要,分别是关闭x服务,禁用nouveau,不安装opengl
(2018/4/23更新:有时候直接安装新的显卡驱动,会显示不能加载内核的错误,这种情况下,可以选择先使用Ubuntu软件更新自带的驱动进行一次升级,当然大概率会出现循环启动问题,不过内核 确实加载好了)
//如果出现循环启动的问题,进入tty模式,登录管理员帐号,按照以下指令执行:
// sudo apt-get remove --purge 'nvidia-*'
// sudp apt-get install ubuntu-desktop
// sudo rm /etc/X11/xorg.conf
// echo 'nouveau' | sudo tee -a /etc/modules
安装过程大概几分钟,就可以看到结果了
使用 nvidia-smi 指令,查看驱动版本,出现显卡型号等信息则成功
sudo reboot
5. cuda的安装
去官网下载最新版本的cuda文件,此处以9.1版本为例,选择runfile 文件下载
终端输入
cd 下载/
sudo chmod 777 cuda_9.1.85_387.26_linux.run
sudo sh cuda_9.1.85_387.26_linux.run --override
启动安装程序,一直按空格到最后,输入accept接受条款
输入n不安装nvidia图像驱动,之前已经安装过了
输入y安装cuda 9.1工具
回车确认cuda默认安装路径:/usr/local/cuda-9.1
输入y用sudo权限运行安装,输入密码
输入y或者n安装或者不安装指向/usr/local/cuda的符号链接
输入y安装CUDA 9.1 Samples,以便后面测试
回车确认CUDA 9.1 Samples默认安装路径:/home/icat(icat是我的用户名),该安装路径测试完可以删除
最后你会看到cuda驱动、sample、tookit已经安装成功,但是缺少一些库。
添加这些库
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
重启电脑,输入密码登录
sudo reboot
如果能够成功登录,则表示不会遇到循环登录的问题,基本说明CUDA的安装成功了
检查Device Node Verification
ls /dev/nvidia*
若结果显示
/dev/nvidia0 /dev/nvidiactl /dev/nvidia-uvm
或显示出类似的信息,应该有三个(包含一个类似/dev/nvidia-nvm的),则安装成功。
接着,设置环境变量。
终端中输入 sudo vim /etc/profile
在打开的文件末尾,添加以下两行。64位系统:
export PATH=/usr/local/cuda-9.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64:$LD_LIBRARY_PATH
保存文件,并重启。因为source /etc/profile是临时生效,重启电脑才是永久生效。
重启电脑,检查上述的环境变量是否设置成功。
验证驱动版本
cat /proc/driver/nvidia/version
验证CUDA Toolkit
nvcc -V
6. cuda Samples测试
我们需要尝试编译cuda提供的例子,看cuda能否正常运行
打开终端输入
cd /home/icat/NVIDIA_CUDA-9.1_Samples
sudo make all
系统就会自动进入到编译过程,整个过程大概需要十几到二十分钟,请耐心等待。如果出现错误的话,系统会立即报错停止。
error: #error -- unsupported GNU version! gcc versions later than 6 are not supported!
错误的解决方式很简单,就是安装低版本gcc和g++,并创建链接或更改gcc各版本的优先级。
此处为以后考虑安装了gcc-6和g++-6,大家可以自行决定版本,只要比错误中提到的支持上限小就没问题
sudo apt-get install gcc-6
sudo apt-get install g++-6
而后二选一
推荐第二种选择
选择一:
创建软链接:
sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++
选择二:
更改gcc各版本的优先级
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
如果编译成功,最后会显示Finished building CUDA samples。
运行编译生成的二进制文件。
编译后的二进制文件默认存放在NVIDIA_CUDA-9.1_Samples/bin中。
接着在终端中输入 :
cd bin/x86_64/linux/release
./deviceQuery
看到类似如下图片中的显示,则代表CUDA安装且配置成功,其中 Result = PASS代表成功,若失败 Result = FAIL
最后再检查一下系统和CUDA-Capable device的连接情况
终端输入 :
./bandwidthTest
Result = PASS代表成功,若失败 Result = FAIL
7. cuDNN 的安装
cuDNN的安装是建立在我们成功安装cuda的基础上的,cuDNN同样需要我们去NVIDIA的官网下载适合cuda版本的deb文件或tgz文件。
有时候会下载不下来,上传到网盘里了
这里我以tgz文件的安装为例(cudnn-9.1-linux-x64-v7.1.tgz),
首先解压tgz文件
cd ~/Downloads
tar -xzvf cudnn-9.1-linux-x64-v7.1.tgz
接着复制文件到cuda安装路径下,
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*
以下至关重要:
建立软连接
终端输入
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.7
sudo ln -s libcudnn.so.7.1.1 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so
设置环境变量,终端输入
sudo gedit /etc/profile
末尾倒数第二行改为:
export PATH=/usr/local/cuda/bin:/usr/local/cuda-9.1/bin:$PATH
保存后,创建链接文件
sudo vim /etc/ld.so.conf.d/cuda.conf
按a进入插入模式,增加下面一行
/usr/local/cuda/lib64
按esc退出插入模式,按:wq保存退出
最后在终端输入sudo ldconfig使链接生效
8. 安装一些依赖项、python-pip、easy_install、科学计算和python所需的部分库以及git
sudo apt-get install build-essential #必要的编译工具依赖
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev
sudo apt-get install libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
终端输入
cd
wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
sudo python ez_setup.py --insecure
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
终端输入
sudo apt-get install libblas-dev liblapack-dev libatlas-base-dev gfortran python-numpy
终端输入
sudo apt-get install git
9. Caffe的部署(暂时不对matlab作说明)
由于要用weiliu大神的ssd模型,故从他的github主页下载caffe,下的会比较慢,可以溜达十几分钟
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd(出现“分支”则说明copy-check成功)
终端输入
sudo apt-get install python-pip 安装pip
cd ~/caffe/python
for req in $(cat "requirements.txt"); do sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple $req; done
如果有一个报错:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-GxreLV/ipython/
那么
sudo pip install --upgrade --force pip
sudo pip install ipython
再重复一遍上面这句就好了
(没错,我又来更新了,每一次部署caffe都让人头大啊,这回解决的还是如上的问题,错误原因是Ubuntu默认装Python2,有的库需要pip3来装,操作如下:
sudo apt-get install python3-pip
for req in $(cat "requirements.txt"); do sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple $req; done
甚至我觉得上面那条指令就直接改了吧...)
进入下载好的caffe目录,复制配置文件,
cd /home/icat/caffe
cp Makefile.config.example Makefile.config
gedit Makefile.config
将USE_CUDNN := 1取消注释,
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include 后面打上一个空格 然后添加/usr/include/hdf5/serial如果没有这一句可能会报一个找不到hdf5.h的错误
执行sudo make all -j16
make过程中又出现找不到lhdf5_hl和lhdf5的错误,
解决方案:
在计算机中搜索libhdf5_serial.so.10.1.0,找到后右键点击打开项目位置
该目录下空白处右键点击在终端打开,打开新终端输入
sudo ln libhdf5_serial.so.10.1.0 libhdf5.so
sudo ln libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so
最后在终端输入sudo ldconfig使链接生效
重新执行
sudo make clean
sudo make all -j16
如果出现nvcc fatal : Unsupported gpu architecture 'compute_20'
仔细查看了一下 Makefile.config 中 CUDA_ARCH 设置未按规定设置:
# 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
因为我装的是CUDA9.1所以把下面这两行删除就可以
-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
如果出现 /usr/bin/ld: cannot find -lopenblas
那么 sudo apt-get install liblapack-dev liblapack3 libopenblas-base libopenblas-dev
继续:
sudo make test -j16
sudo make runtest -j16
如果出现错误[ FAILED ] BatchReindexLayerTest/3.TestGradient, where TypeParam = caffe::GPUDevice
这里的报错信息里面显示的是“GPUDevice”而不是“CPUDevice”,这种情况可能是因为配置了多显卡环境,可以使用安装CUDA时运行./deviceQuery时标注的0号GPU("Device 0")跑跑测试试试看。使用如下命令:
export CUDA_VISIBLE_DEVICES=0
如果还是有报错,没事,不影响后面的编译
但是如果出现错误cudasuccess(8vs0)这样的
百度说是由于显卡计算能力不匹配造成的
仔细查看了一下 Makefile.config 中 CUDA_ARCH 设置未按规定,设置有没有这一条:
-gencode arch=compute_60,code=sm_60 \
Tesla p100的计算能力是60,少了这条不能用
(更新一下,makefile里的use_opencv要取消注释)
如果出现.build_release/lib/libcaffe.so:对‘cv::imread(cv::String const&, int)’
或者类似的问题,说明opencv用了opencv 3.x的缘故,只需在Makefile的最后一行加上:
LIBRARIES += glog gflags protobuf leveldb snappy \
lmdb boost_system boost_filesystem hdf5_hl hdf5 m \
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs opencv_videoio
继续:
sudo make pycaffe -j16
sudo make distribute
至此,编译基本完成,下面测试:
cd python/
python
import caffe
(好的,我又来更新了,因为出了新问题,头一回import caffe也报错:
ImportError: No module named skimage.io
方案是
sudo pip install scikit-image
sudo apt-get install python-skimage)
如果没有报错,那么编译就通过了
10. mnist测试
下载mnist数据集,终端输入
cd /home/icat/caffe/data/mnist/
./get_mnist.sh 获取mnist数据集
在/home/pawn/caffe/data/mnist/目录下会多出训练集图片、训练集标签、测试集图片和测试集标签等4个文件
mnist数据格式转换,终端输入
cd /home/icat/caffe/
./examples/mnist/create_mnist.sh
必须要在第一行之后运行第二行,即必须要在caffe根目录下运行create_mnist.sh
此时在/caffe/examples/mnist/目录下生成mnist_test_lmdb和mnist_train_lmdb两个LMDB格式的训练集和测试集
LeNet-5模型描述在/caffe/examples/mnist/lenet_train_test.prototxt
Solver配置文件在/caffe/examples/mnist/lenet_solver.prototxt
训练mnist,执行文件在/caffe/examples/mnist/train_lenet.sh
终端输入
cd /home/icat/caffe/
./examples/mnist/train_lenet.sh
可能会遇到这样一个问题:
Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR
别被忽悠了,加个sudo 就能解决问题
但是如果出现这个问题
Check failed: status == CUDNN_STATUS_SUCCESS (11 vs. 0) invalid argument
还没找到好的解决方案,把caffe的Makefile和Makefile.config文件检查一下重新编译caffe
能跑起来迭代的就是成功
另附:动态查gpu 利用率的指令:每0.1s刷新一次
watch -n 0.1 nvidia-smi
(补充说明,建议将Pythonpath添加到环境变量中,以免import caffe失败)
sudo vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/root/caffe/python //说明:/root换成你的caffe路径
保存并退出
source ~/.bashrc
11. 补充:OpenCV的安装和使用
说明:
如果安装的是CUDA9.1和cudnn7.1版本的话,OpenCV最高可以装3.4.1版本的
鉴于需要安装TensorFlow和其他平台,上述安装可以不装CUDA9.1和cudnn7.1
可以采取安装CUDA9.0和cudnn7.0的组合,搭配OpenCV 3.4.1,安装方式亲测与上述基本相同
如果安装CUDA8.0,则搭配cudnn6.0和OpenCV 3.2.0,安装过程几乎相同,少数位置需要更改gcc和g++版本参数,可以百度解决
去官网下载opencv,在本教程中选用的时opencv3.4.1,其他版本的配置方法异曲同工。
下载链接http://opencv.org/releases.html,选择sources版本
解压下载下来的zip包,并进入解压后的文件夹
unzip opencv-3.4.1.zip
cd opencv-3.4.1
安装依赖库和cmake ,如果提醒需要apt-get update,那就先sudo su进入root权限,再sudo apt-get update,然后在执行下面命令
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev
sudo apt-get install libswscale-dev libjasper-dev
安装完cmake之后执行命令 ,创建编译文件夹
mkdir build
cd build
cmake一下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
期间可能会下载一个东西,等待一会儿就OK
执行命令,漫长的编译过程
sudo make -j16
在97%的时候会等很久很久,属于正常现象。编译过程很顺利,编译成功后安装:
sudo make install
执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加
/usr/local/lib
执行如下命令使得刚才的配置路径生效
sudo ldconfig
配置bash
sudo gedit /etc/bash.bashrc
在最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存,执行如下命令使得配置生效
source /etc/bash.bashrc
更新
sudo updatedb
至此所有的配置都已经完成,下面用一个小程序测试一下
cd到opencv-3.4.0/smaples/cpp/example_cmake目录下
我们可以看到这个目录里官方已经给出了一个cmake的example我们可以拿来测试下
按顺序执行
cmake .
make
./opencv_example
如果出权限问题,那就加sudo
即可看到打开了摄像头,在左上角有一个hello opencv,即表示配置成功
重新编译带OpenCV的caffe:
在Makefile.config文件中,
将:
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
并将USE_OPENCV=0这一句注释掉
使用 python 接口
将:
#WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
修改 python 路径
将:
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
此python路径为系统自带python的路径,假如想使用Anaconda的python的话需要在其他地方修改。
然后修改 caffe 目录下的 Makefile 文件(修改的地方找起来比较困难的话可以用gedit打开):
将:
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
然后重新
sudo make clean
sudo make all -j32 (PS,不是所有服务器都可以-j32)
sudo make test -j32
sudo make runtest -j32 (这一步可以不做)
sudo make pycaffe
sudo make distribute
注意:runfile那一步可能最后会有一两个项目测试failed,Google了一下,貌似使用CUDA9.1加双显卡的都有这个错误,暂且不管它,目前不影响使用。
python
import caffe
不报错说明再次编译成功,可以重复上面的mnist测试方法,如果测试没问题,则说明完全通过。
12. 说明:
安装anaconda等python发行版本会对原有的环境变量、设置路径造成干扰,出现问题自行百度解决。
如需使用MATLAB,请参考第三篇童师兄写的博客
thanks