ubuntu16.04 + cuda9.1 + cudnn7.1 + OpenCV3.4 + caffe(GPU)

 

//以下方案,基于装有四卡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<double>
    这里的报错信息里面显示的是“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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值