caffe的编译配置真的是很让人头疼啊,不知道试过多少次了~~~


重装系统了七八次,搞得linux的一些常用命令倒是很熟悉了~~~

我有洁癖~~~某一个点上出了错,我一定要把它搞好了,再重新来一次,我怕会因为某一点的小错误会影响到其它重要的地方。。。(有同感的默默在心里举个爪~~~^_^~~~)

又折腾了好几次,参考了很多的博客,总结出一整套的安装配置流程!

开始:


 

0、先行设置系统软件源更新,以及目录设置
  • 网络无问题即可,不用太纠结
  更新sources.list,我使用的是ipv6校园网,用清华大学软件源。
  修改完list文件后sudo apt-get update
 
1、系统驱动+CUDA安装配置
  • 需要更换默认的驱动和安装CUDA,但是如果你的cuda的计算能力达不到3.0及以上,请跳过本部分。

  驱动安装过程中可能会出现问题:the nouveao kernel driver未禁用的错误。
    sudo gedit /etc/modprobe.d/blacklist.conf
  在最后加上两行:    

  1 blacklist nouveau
  2 options nouveau modeset=0

  然后执行:

    sudo update-initramfs -u
  reboot重启即可。重启后会发现字体变大了。

  即是初始驱动已经禁用了。再次重试安装即可。

  
  
  然后再在字符界面下安装:
  进入字符界面tty1:关闭X-Window:sudo service lightdm stop,然后切换到tty1:Ctrl+Alt+F1,在纯字符界面下,登陆用户;
 
  显卡驱动:安装使用 NVIDIA-Linux-x86_64-367.44.run文件
  1 sudo chmod +x NVIDIA-Linux-x86_64-367.44.run
  2 sudo ./NVIDIA-Linux-x86_64-367.44.run
  然后一路确认即可。
 
    CUDA安装有两种方式安装,run文件和deb文件两种,优先使用deb,如果安装出错再考虑使用run文件安装。
      deb:(这里的安装时需要网络的,即软件源能连通)  
        1sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb
        2sudo apt-get update
        3sudo apt-get install cuda
        4sudo dpkg -i cuda-misc-headers-8-0_8.0.27.1-1_amd64.deb
      run:
        1、sudo sh cuda_8.0.27_linux.run
        然后一路按空格键,直到100%,其它选项基本选择y即可,但是取消显卡驱动的安装即可。
 
 
  配置与测试:

    1、声明环境变量:
      export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
      export CUDA_PATH=/usr/local/cuda-8.0/lib64${CUDA_PATH:+:${CUDA_PATH}}
    2、设置文件:
      sudo gedit /etc/profile
    3、在文件末尾添加:
      export PATH=/usr/local/cuda/bin:$PATH
    4、创建链接文件:
      sudo gedit /etc/ld.so.conf.d/cuda.conf
    5、在打开的文件中添加:
      /usr/local/cuda/lib64
    6、最后执行
      sudo ldconfig
    7、运行测试用例
      cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery
      sudo make
      sudo ./deviceQuery
      然后即可显示出关于GPU的信息,则说明安装成功了
    8、另外使用命令:nvidia-smi直接会输出支持cuda的GPU设备列表

 
2、cuDNN设置
  • 这里设置使用cudnn加速,一定注意前面说的计算能力问题,后面还会提到!!! 
  下载的压缩包:cudnn-8.0-linux-x64-v5.0-ga.tgz,解压缩会有两个文件夹include和lib64
  依次进行如下命令:

    cd cuda
    sudo cp ./include/cudnn.h /usr/local/cuda/include/ #复制头文件
    sudo cp ./lib64/lib* /usr/local/cuda/lib64/ #复制动态链接库

    cd /usr/local/cuda/lib64/
    sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件
    sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5 #生成软衔接
    sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接

 
  在caffe的Makefile.config文件中开启cuDNN
  1 # cuDNN acceleration switch (uncomment to build with cuDNN).
  2 USE_CUDNN := 1

查看CUDA计算容量:

   sudo /usr/local/cuda/samples/bin/x86_64/linux/release/deviceQuery

2.1

  在caffe的Makefile.config文件中,找到并修改:

   CUDA_ARCH := -gencode arch=compute_20,code=sm_20 
          -gencode arch=compute_20,code=sm_21 
          -gencode arch=compute_21,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_50,code=compute_50
   不知道是不是有什么用处,但是据说cudnn加速需要cuda计算能力在3.0以上才可以!
 
3、OpenCV安装配置
  
  这里使用OpenCV2.4.13,将opencv也安装到与cuda一致的目录下:/usr/local/opencv***
  • 这里需要注意opencv的版本:最好使用2.4.13,其它版本会出错误!!!
  1、准备文件,依次如下使用命令行:
 
      sudo cp opencv-2.4.13.zip /usr/local/
      cd /usr/local/
      sudo unzip opencv-2.4.13.zip
      cd ./opencv-2.4.13
      mkdir build
 
  2、配置生成Makefile
    cd build
    sudo cmake 
    
    可能会出现如下错误,若无直接跳过:
      可能会提示缺少相关的依赖库以及下载文件失败等错误。
      比如ippicv_linux_******.tgz包下载失败而导致Makefile生成失败,可通过手动下载,然后放置到路径opencv-2.4.13/3rdparty/ippicv/downloads/linux-808********目录内:
      sudo rm /usr/local/opencv-2.4.13/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/ippicv_linux_20151201.tgz
      sudo cp /home/leeyang/ippicv_linux_20151201.tgz /usr/local/opencv-2.4.13/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/
 
    重新执行配置命令即可。
    先考虑安装上一些相关库:
      sudo apt-get install --assume-yes libopencv-dev build-essential git unzip libgtk2.0-dev pkg-config libdc1394-22
      libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev
      libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev 
      libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils
 
    执行:
      sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..       (这里的两个点不要忽略!!)
 
    最终输出,则配置和生成成功
      -- Configuring done
      -- Generating done
      -- Build files have been written to: /home/leeyang/opencv-2.4.13/build
 
  3、最后进行编译安装

      注意编译之前确保numpy已经安装,否则最后不会生成cv2.so
        sudo apt-get install python-numpy python3-numpy
      可能会出现错误:error:1 /usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope

      原因是g++版本太新了,需要在CMakeLists.txt中前面几行添加
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORCE_INLINES")
      然后再重新执行2中的cmake一次即可。

    在build目录下执行:
      sudo make -j8 需要执行一段时间。。。
    安装并进行配置:
      sudo make install
      sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
      sudo ldconfig
 
        如果编译安装等出错,可以尝试一下自动脚本进行安装配置:
          https://github.com/jayrambhia/Install-OpenCV
          直接使用opencv-2.4.13(使用opencv3.0、3.1、2.4.10都会编译出错)
          对与cuda8.0,opencv3.0或者2.4.10都会报如下错误,使用opencv2.4.13就没 有问题。(唯一一个2016年发布的版本)
          Ubuntu/3.0/OpenCV/opencv-3.0.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’
          has not been declared  typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);
 
4、Python以及 Matlab with python engine
      
      这里解释一下:有了默认的python,为什么还要安装python-dev?

        linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包.

        以python为例, 以下情况你是需要python-dev的
        你需要自己安装一个源外的python类库, 而这个类库内含需要编译的调用python api的c/c++文件
        你自己写的一个程序编译需要链接libpythonXX.(a|so)
        (注:以上不含使用ctypes/ffi或者裸dlsym方式直接调用libpython.so)
        其他正常使用python或者通过安装源内的python类库的不需要python-dev.

 
    还是直接使用默认python+python-dev的方式来进行使用吧,再额外安装一个spyder来使用。
 
    这里的安装步骤是:Python依赖包、Matlab、Matlab engine for python
 
    这里的安装使用需要搞明白三个变量路径:PYTHON_INCLUDE、PYTHON_LIBRARIES、PYTHON_LIB,在安装好相关软件后,找到各自对应的路径即可。
      1、Python依赖包
        1、直接使用系统默认python2.7的版本
          ①、安装相应的发布版本:sudo apt-get install python2.7 python2.7-dev
          ②、安装相应的build依赖包:
            sudo apt-get install build-essential libssl-dev libevent-dev libjpeg-dev libxml2-dev libxslt-dev
          ③、安装pip:sudo apt-get install python-pip
 
        2、安装所有与python相关的包
          ①、依据下面的依赖包项目,逐条执行,使用pip进行安装。
          先一句安装,出错了再逐条安装:
          sudo pip install cython numpy scipy scikit-image matplotlib ipython h5py leveldb networkx nose pandas
          python-dateutil protobuf python-gflags pyyaml pillow six
        逐条:
          sudo pip install cython
          sudo pip install numpy
          sudo pip install scipy
          sudo pip install scikit-image
          sudo pip install matplotlib
          sudo pip install ipython
          sudo pip install h5py
          sudo pip install leveldb
          sudo pip install networkx
          sudo pip install nose
          sudo pip install pandas
          sudo pip install python-dateutil
          sudo pip install protobuf
          sudo pip install python-gflags
          sudo pip install pyyaml
          sudo pip install pillow
          sudo pip install six
 
        依赖包版本号要求列表:
          

cython>=0.19.2

 

          numpy>=1.7.1

 

          scipy>=0.13.2

 

          scikit-image>=0.9.3

 

          matplotlib>=1.3.1

 

          ipython>=3.0.0

 

          h5py>=2.2.0

 

          leveldb>=0.191

 

          networkx>=1.8.1

 

          nose>=1.3.0

 

          pandas>=0.12.0

 

          python-dateutil>=1.4,<2

 

          protobuf>=2.5.0

 

          python-gflags>=2.0

 

          pyyaml>=3.10

 

          Pillow>=2.3.0

 

          six>=1.1.0

 
      2、Matlab安装,使用2014b版本,匹配python engine支持的版本python2.7,3.3
        解压缩到目录matlab2014b目录下,cd到该目录
          sudo ./install
        之后即可出现图形界面。
        选择离线使用安装码进行安装,序列码:29797-39064-48306-32452
        安装目录默认即可,等待安装完毕
 
        运行激活选择离线激活,激活文件:license.lic
        将libmwservices.so复制到 /matlab安装目录/R2014b/bin/glnxa64/下,替换已有文件
        即可完整安装,下面进行Matlab engine的安装即可。
 
        激活选择已破解的lic文件
        替换破解文件
 
          sudo rm /usr/local/MATLAB/R2014b/bin/glnxa64/libmwservices.so
          sudo cp ~/matlab2014b/crack/libmwservices.so /usr/local/MATLAB/R2014b/bin/glnxa64/
 
 
      3、Matlab engine for python
        • 这里Matlab engine是非常重要的步骤
        MATLAB的安装路径中应该会有:"externenginespython"路径
        直接在该目录下运行:
          python setup.py install
 
        测试用例:
        直接使用控制台的python命令执行以下代码:
          import matlab.engine
          eng = matlab.engine.start_matlab()
          future = eng.sqrt(4.0,async=True)
          ret = future.result()
          print(ret)
        无错误即为正常安装成功。
 
          可能会出现错误提示:
            OSError: MATLAB Engine for Python supports Python version 3.3 and 2.7, but your version of Python is 3.5
            是因为Anaconda版本太高了。
 
5、protoc、glog、gflags(一定先安装glog再安装gflags)、BLAS
    1、protoc
      安装curl,但是一般Ubuntu16以上是自动安装了的,跳过。
      手动下载文件http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2
      可百度后下载,复制到protobuf的目录下,找到autogen.sh文件中,注释掉curl语句
        #curl -0 http://.......
      安装 automake 工具:
        sudo apt-get install autoconf automake libtool
      再次运行:
        ./autogen.sh
 
      然后依次运行以下命令
        ./configure
        sudo make
        sudo make check 一般输出全部测试通过

          PASS: protobuf-test
          PASS: protobuf-lazy-descriptor-test
          PASS: protobuf-lite-test
          PASS: google/protobuf/compiler/zip_output_unittest.sh
          PASS: google/protobuf/io/gzip_stream_unittest.sh
          =================================
          Testsuite summary for Protocol Buffers 2.5.0
          =================================
          # TOTAL: 5
          # PASS: 5
          # SKIP: 0
          # XFAIL: 0
          # FAIL: 0
          # XPASS: 0
          # ERROR: 0
          =================================

 
      最后再执行:sudo make install
 
    2、再安装一些依赖库:
        sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libboost-all-dev libhdf5-serial-dev
        sudo apt-get install libboost-all-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
 
    3、安装配置glog
      进入glog目录下:
        ./ configure
        sudo make
        sudo make install
 
    4、安装配置gflags
      进入gflags目录下:
        mkdir build && cd build
        cmake ..
 
        ccmake ..
      之后会进入图形化的配置界面:
 
          [机器学习] 深度学习之caffe1——软件配置与测试

[机器学习] 深度学习之caffe1——软件配置与测试

      修改完成后,按C键再按G键,生成Makefile
      再执行:
        sudo make
        sudo make install
 
 
    5、BLAS安装与配置
      caffe官网推荐三种实现:ATLAS, MKL, or OpenBLAS
      其中atlas可以直接通过命令行安装,不用MKL了,破解申请麻烦。
 
      直接用atlas
        sudo apt-get install libatlas-base-dev
 
 
6、Caffe安装配置
    (为确保过程不出错,请软件源和系统保持最新版本<Ubuntu16.04LTS+校园网清华大学软件源>)
 
    以上安装确保无错误发生,则使用make all来进行测试。
    可能会出现错误:
      hdf5配置出现问题。。。
      所有依赖库安装都非常顺利,但是在hdf5这里会有个坑,
 
      • 这里的Makefile设置非常重要       
 
      需要在Makefile.config中INCLUDE_DIRS后添加/usr/include/hdf5/serial/,在LIBRARY_DIRS后添加/usr/lib/x86_64-linux-gnu/hdf5/serial/
    最终Makefile.config文件对应部分修改如下,
      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/hdf5/serial/
 
    这里检查一遍Makefile.config所做的主要修改:

      CPU_ONLY := 1

      USE_OPENCV := 0
      USE_LEVELDB := 0
      USE_LMDB := 0

      USE_OPENCV := 1
      USE_LEVELDB := 1
      USE_LMDB := 1

      CUSTOM_CXX := g++
      WITH_PYTHON_LAYER := 1

      # Whatever else you find you need goes here.
      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/hdf5/serial/

 
 
    再次make all,输出显示若干CXX,无错误提示即可。
 
    再make test,输出显示若干CXX,LD等,无错误提示
    再make runtest,输出的所有的RUN均为OK即可确认caffe安装成功
 

      可能会出现错误:Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0)
      说明GPU的加速性能不够,CUDNN只支持CUDA Capability 3.0以上的GPU加速,所以不能使用CUDNN加速,需要在Makefile.config中注释掉USE_CUDNN := 1
      一定要注意自己GPU硬件的计算能力问题!!!

 
    出现全部测试通过即可:

      [----------] Global test environment tear-down
      [==========] 996 tests from 141 test cases ran. (45874 ms total)
      [ PASSED ] 996 tests.

 

      • 这里的pycaffe接口非常重要,一定要配置测试好!!!(先编译好caffe后再进行pycaffe接口编译)
    
    编译python接口:
      将caffe根目录下的python文件夹加入到bash
      打开配置文件bashrc
      # sudo gedit ~/.bashrc
 
      在最后面加入caffe目录下的python路径
        export TCNN_ROOT=/home/leeyang/T-CNN
        export PYTHONPATH=$TCNN_ROOT/External/caffe/python:$PYTHONPATH
        sudo ldconfig
      更新配置即可。
 
    执行命令:
      sudo make pycaffe
    输出:

      LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
      CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
      touch python/caffe/proto/__init__.py
      PROTOC (python) src/caffe/proto/caffe.proto

 
    在python中使用代码测试:
      import caffe
    无错误即可
 

 

测试demo:
 
   一般第一个测试都是对手写字体minist进行识别,主要有三个步骤:准备数据、修改配置、开始使用。
 
  1、准备数据
 
    一般是使用命令:
      sudo sh ./data/mnist/get_mnist.sh      (大约是9.5M左右的数据,需要联网下载)
    输出提示:

      Downloading...
      --2016-10-07 23:44:11-- http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
      Resolving yann.lecun.com (yann.lecun.com)... 128.122.47.89
      Connecting to yann.lecun.com (yann.lecun.com)|128.122.47.89|:80... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 9912422 (9.5M) [application/x-gzip]
      Saving to: ‘train-images-idx3-ubyte.gz’
      train-images-idx3-ubyte.gz 100%[=====================================>] 9.45M 39.5KB/s in 2m 42s
      2016-10-07 23:46:53 (59.9 KB/s) - ‘train-images-idx3-ubyte.gz’ saved [9912422/9912422]

    生成标准数据:
      sudo sh ./examples/mnist/create_mnist.sh
    输出提示:

      Creating lmdb...
      I1007 23:47:04.655964 18706 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
      I1007 23:47:04.656126 18706 convert_mnist_data.cpp:88] A total of 60000 items.
      I1007 23:47:04.656134 18706 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
      I1007 23:47:09.992278 18706 convert_mnist_data.cpp:108] Processed 60000 files.
      I1007 23:47:10.043660 18708 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_test_lmdb
      I1007 23:47:10.043848 18708 convert_mnist_data.cpp:88] A total of 10000 items.
      I1007 23:47:10.043862 18708 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
      I1007 23:47:10.859005 18708 convert_mnist_data.cpp:108] Processed 10000 files.
      Done.

 
    但有时可能会网络不通畅。这里直接下载
    解压得到两个文件夹(mnist-train-leveldb和mnist-test-leveldb),复制到 .examplesmnist  目录下即可
 
    错误1:F1007 23:20:39.377470 14871 convert_mnist_data.cpp:144] This example requires LevelDB and LMDB; compile with USE_LEVELDB and USE_LMDB.
      这个错误是因为学习中的之知其然不知其所以然导致的!!!
      caffe的Makefile文件中取消注释,但是其后的值仍然是0,和不取消是一样的了!取消注释后将值改为1,然后全部重新编译caffe
      USE_OPENCV := 1
      USE_LEVELDB := 1
      USE_LMDB := 1
  
    一切正常会在.examplesmnist  目录下生成这两个数据文件夹。

  2、修改配置

    修改该目录下的prototxt扩展名配置文件

    修改./examples/mnist/lenet_solver.prototxt

    定位到最后一行:solver_mode: GPU,将GPU改为CPU。 直接先使用CPU进行测试

  3、运行

     执行文件命令:
      sudo sh ./examples/mnist/train_lenet.sh
     输出提示:
     

    I

1007 23:53:09.915892 18795 caffe.cpp:210] Use CPU.

    I1007 23:53:09.916203 18795 solver.cpp:48] Initializing solver from parameters:
    test_iter: 100
    test_interval: 500
    base_lr: 0.01
    display: 100
    max_iter: 10000
    lr_policy: "inv"
    gamma: 0.0001
    power: 0.75
    momentum: 0.9
    weight_decay: 0.0005
    snapshot: 5000
    snapshot_prefix: "examples/mnist/lenet"
    solver_mode: CPU
    net: "examples/mnist/lenet_train_test.prototxt"
    train_state {
      level: 0
      stage: ""
    }

    **********************************
    **********************************

    I1008 00:12:51.708220 18795 sgd_solver.cpp:106] Iteration 9800, lr = 0.00599102
    I1008 00:13:02.717388 18795 solver.cpp:228] Iteration 9900, loss = 0.00611393
    I1008 00:13:02.717483 18795 solver.cpp:244] Train net output #0: loss = 0.00611391 (* 1 = 0.00611391 loss)
    I1008 00:13:02.717496 18795 sgd_solver.cpp:106] Iteration 9900, lr = 0.00596843
    I1008 00:13:14.016697 18795 solver.cpp:454] Snapshotting to binary proto file examples/mnist/lenet_iter_10000.caffemodel
    I1008 00:13:14.025446 18795 sgd_solver.cpp:273] Snapshotting solver state to binary proto file examples/mnist/lenet_iter_10000.solverstate
    I1008 00:13:14.084300 18795 solver.cpp:317] Iteration 10000, loss = 0.00241856
    I1008 00:13:14.084349 18795 solver.cpp:337] Iteration 10000, Testing net (#0)
    I1008 00:13:21.108484 18795 solver.cpp:404] Test net output #0: accuracy = 0.9905
    I1008 00:13:21.108542 18795 solver.cpp:404] Test net output #1: loss = 0.0295916 (* 1 = 0.0295916 loss)
    I1008 00:13:21.108553 18795 solver.cpp:322] Optimization Done.
    I1008 00:13:21.108559 18795 caffe.cpp:254] Optimization Done.

    
    渣配置训练跑了大约20分钟~模型精度在0.99以上
    最终训练完的模型存储为一个二进制的protobuf文件:
    ./examples/mnist/lenet_iter_10000.caffemodel
 
     这个模型就可以用来直接使用了,具体怎么使用还有待继续学习!!!