基于Anaconda编译caffe+pycaffe+matcaffe in Ubuntu[不用sudo权限]

[TOC]html

caffe

编译

环境

  • Ubuntu16.04
  • CUDA10
  • cuDNN
  • gcc 5.4
  • g++ 5.4

大前提!!python

在服务器上面装,可是没有sudo权限,因此依赖的包都只能装在本身用户下的conda环境里linux

  • 按理来讲这个要求应该很多吧。。可是搜出来一大堆博客都是要sudo权限,动不动就卸载、升级。。作不到啊。。只能各类在conda里删删减减。。真的好艰难!!

github下载caffe源码

BVLC/caffec++

依赖

  1. anaconda3git

  2. 装好以后,新建环境,最好用python2.7。下面都是装在这个新建的conda环境里,因此要注意先进入该环境!github

  3. 在caffe/python目录下shell

    pip install -r requirements.txt   #requirements.txt
  4. 在conda的环境中装必要的包ubuntu

    我装的版本 python2, opencv3bash

    版本一致很重要!服务器

    conda install boost

    conda install glog

    conda install gflags

    conda install libprotobuf

    conda install hdf5=1.8.16 #[!重要]

    conda install lmdb

    conda install leveldb

    conda install -c menpo opencv3 #[!重要 必定要指定好版本 用默认的命令会装最新的 以前用默认就装到了最新的4.1版 ...]

    因为我是在conda环境下的,仍是装一下cudatoolkit:

    [!重要] 要和本机装的CUDA的版本一致!! 包括后面的子编号!我以前只看到conda装的cudatoolkit是10,本机的CUDA也是10,就认为一致,但其实本机的CUDA是10.0.x,conda默认装了最新的 cudatoolkit是10.1.x,后来卸载掉conda装的高版本,从新装10.0.x版本的cudatoolkit才行

    • conda装 cudatoolkit 通常默认会装好cudnn,能够用 conda list | grep 'cu' 查看
  5. 装OpenBLAS

    从源码安装

    git clone https://github.com/xianyi/OpenBLAS.git
    cd OpenBLAS
    make FC=gfortran -j $(($(nproc) + 1))
    make PREFIX=/path/to/install install
    echo 'export LD_LIBRARY_PATH=/path/to/install/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
    source ~/.bashrc
  6. [可选]若是要用matcaffe

    装matlab,在linux下装完以后要激活,由于是用学校买的正版产品,须要用桌面环境打开安装程序。。

    VNC用gnome桌面好难。。一直不出来terminal,最后仍是改用xfce4桌面 照抄别人的配置。。终于激活上了!配置文件放在 ~/.vnc/xstartup

    #!/bin/sh                                                                                                                    
    x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    session-manager & xfdesktop & xfce4-panel &                                     
    xfce4-menu-plugin &                                                            
    xfsettingsd &                                                                 
    xfconfd &                                                             
    xfwm4 &

修改源码的编译配置

修改Makefile.config,按照自身设备的条件

  • 使用cuDNN,将USE_cuDNN 这一句的注释去掉

  • 使用opencv3,将OPENCV_VERSION := 3 的注释去掉

  • BLAS 改成 open ,而且设置具体的include和lib路径,要具体到include文件夹 \ lib文件夹!

  • ANACONDA_HOME 这一句的注释去掉,改成本身的conda环境的路径

  • PYTHON_INCLUDE 和 PYTHON_LIB:把本来路径在系统下的那句注释掉,去掉ANACONDA_HOME下PYTHON_INCLUDE PYTHON_LIB 的注释

  • WITH_PYTHON_LAYER 这一句的注释去掉

  • 使用matcaffe,把 MATLAB_DIR 这一句的注释去掉,改成MATLAB所在路径

  • LIBRARY_DIRS 添加 /usr/lib/x86_64-linux-gnu

  • 根据CUDA版本注释一些 arch

修改Makefile

报错

tips

caffe源码的github仓库下的issue是个好东西,关键字search用起来! https://github.com/BVLC/caffe/issues

==不用CMAKE,直接MAKE==

[LATEST!!]

make all -j32

报错要用c++11

原来一直没装上opencv

报错没有 boost_python

报错mexext command not found

  • 解决:改Makefile.config,MATLAB_DIR 要改成mexext在的父路径
  • 好比这里的mexext,在 /usr/local/MATLAB/R2019a/bin,则MATLAB_DIR=/usr/local/MATLAB/R2019a

报错 缺少一些OpenCV的lib,好比缺少libpng.16.so

  • 解决:

    按照帖子的两个方法都尝试 https://stackoverflow.com/questions/31962975/caffe-install-on-ubuntu-for-anaconda-with-python-2-7-fails-with-libpng16-so-16-n

    1,实际上是lib的依赖库没有添加到路径!改Makefile.config, 添加到LIB_DIR里面

    • 用 ldd 查看缺失的库所依赖的库的路径:

      ldd libpng.16.so
    • 发现有一些库仍是放在 /lib/x86_64-linux-gnu/ 下面的!!好坑

    2,在Makefile.config里添加LINKFLAGS, 至关于为Makefile里的LINKFLAGS设置默认的初值

    • LINKFLAGS,添加当前环境下的lib:anaconda3/envs/env_name/lib
    LINKFLAGS := -Wl,-rpath,/path/to/lib
    • opencv用conda装的时候必定要选好版本,若是不当心装错了,先把conda环境里本来有的全部opencv都卸掉,而后再从新装

没有报错了,接着编译pycaffe 和 matcaffe:

make pycaffe -j32
make matcaffe -j32

make runtest(其实这个没成功可是上面的都能正经常使用了就算了!)

==用CMAKE==

[貌似最后没彻底成功,可是 make all 和 make pycaffe 彷佛是OK的,

不过这些报错的解决方法应该是OK的,只是后面还有新的报错就懒得再管了,

放弃cmake直接在根目录下make了,这彷佛是比较主流的作法]

cmake报的错:

注意,CMAKE编译时设置DEBUG or RELEASE模式

https://blog.csdn.net/u010103202/article/details/75447473

cmake -DCMAKE_BUILD_TYPE=RELEASE /DEBUG

不一样模式最好放在不一样目录下编译

报错boost

报错找不到boost python

  • 在Dependencies.cmake对应的那一行(报错的那一行)改 python为python27

    本来大概是: find_packages(Boost COMPONENTS python),把这里的python改成python27

make阶段:
make all -j32

报错libprotobuf版本比较高 须要用C++11编译

error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

  • 在CMakeList.txt里面添加 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
make pycaffe -j32

报错没有cudnn

  • 在conda下安装 cudatoolkit 注意看看本机装的CUDA版本
  • 在conda下安装cudnn

报错opencv

error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope color_ ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE);

  • 这是由于opencv版本不一致形成的,这里用的opencv c++库是opencv 3,原来的caffe好像都用的opencv2 https://blog.csdn.net/qq_28660035/article/details/80772071

  • 改动的地方

    caffe/src/caffe/layers/window_data_layer.cpp 里面用到imread,读彩色图的参数要改变

    caffe/src/caffe/util/io.cpp 里面用到imread,读彩色图的参数要改变

    CV_LOAD_IMAGE_COLOR -> cv::IMREAD_COLOR

    CV_LOAD_IMAGE_GRAYSCALE -> cv::IMREAD_GRAYSCALE

make matcaffe -j32
  • cmake:

    • 打开CMakeLists.txt的BUILD_matlab

    • 报错的话,忽略那个错。。实际上是代码没有处理好。。

      • 出错的地方在于,要把那些库文件转换为make命令中的 -l${lib_name} 的这个函数,由于库文件的变量中,还保存了PUBLIC、PRIVATE等cmake target_link_libraries这个函数的关键字,可是却没有在convert时解析这些关键字。。。因此遇到这些关键字就判为FATAL_ERROR了。。

      • 找到出错的那个文件,把报错等级的error改成warning。。

  • make


测试使用

https://blog.csdn.net/wzz18191171661/article/details/70149070

pycaffe

编译完以后,测试pycaffe:

  • 若是import失败多是由于要添加pycaffe的路径(caffe根目录下的python文件夹)到 ~/.bashrc的PYTHONLIBRARY 并source
import caffe
caffe.__version__
  • 若是提示warning 缺乏一些包或是版本不对应,用 pip install

caffe

测试caffe,在caffe的根目录下:

./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh
  • 能够看到训练的过程,最终测试的精度是 0.98+

  • 若是报错,去看看这些脚本文件都作了什么

Check failed: mdb_status == 0 (2 vs. 0) No such file or directory

通常报错这个,大可能是 数据集的路径不对!看看prototxt里面指定了数据集的路径里,有没有数据集!

matcaffe

make mattest

报错 一大堆动态库(libxxx.so)找不到,这些动态库都是装在conda环境下的

  • 意味着编译matcaffe的时候用的是conda环境的,可是mattest不是

  • mattest居然用的动态库都是系统下面的?为何不是直接用编译时候指定的anaconda_home的那些?

  • 还要改 LD_LIBRARY_PATH ,添加conda环境下的lib路径,而且export,但我的总以为这是很辣鸡的替代方法!【若是是其余状况下,须要用根目录的lib或是其余环境的lib怎么办?】

    export LD_LIBRARY_PATH=/path_to_conda/envs/env_name/lib:$LD_LIBRARY_PATH
  • well, 官方都这么说了

    Build MatCaffe

    Build MatCaffe with make all matcaffe. After that, you may test it using make mattest.

    Common issue: if you run into error messages like libstdc++.so.6:version 'GLIBCXX_3.4.15' not found during make mattest, then it usually means that your Matlab's runtime libraries do not match your compile-time libraries. You may need to do the following before you start Matlab:

    export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64
    export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

    Or the equivalent based on where things are installed on your system, and do make mattest again to see if the issue is fixed. Note: this issue is sometimes more complicated since during its startup Matlab may overwrite your LD_LIBRARY_PATH environment variable. You can run !ldd ./matlab/+caffe/private/caffe_.mexa64 (the mex extension may differ on your system) in Matlab to see its runtime libraries, and preload your compile-time libraries by exporting them to your LD_PRELOAD environment variable.

    After successful building and testing, add this package to Matlab search PATH by starting matlab from caffe root folder and running the following commands in Matlab command window.

    addpath ./matlab

    You can save your Matlab search PATH by running savepath so that you don't have to run the command above again every time you use MatCaffe.

报错

Could not convert handle to pointer due to invalid init_key. The object might have been cleared.

40行,用 if self.isvalid 包围, 参考自https://github.com/BVLC/caffe/pull/5588

Error in caffe.Solver/delete (line 40) caffe_('delete_solver', self.hSolver_self);

The solution to this issue as the same to @meixiaofeng way. I change the code to as follow: if self.isvalid caffe_('delete_solver', self.hSolver_self); end

在MATLAB使用的时候可能要先添加 matcaffe的路径:

  • 在caffe根目录下运行MATLAB

  • 在MATLAB命令行中 输入 addpath ./matlab %添加matcaffe的路径

  • 在MATLAB命令行中 输入 help caffe %若是输出caffe的详细信息则表明路径添加成功

相关文章
相关标签/搜索