基於Anaconda編譯caffe+pycaffe+matcaffe in Ubuntu[不用sudo權限]


caffe

編譯

環境

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

大前提!!

在服務器上面裝,但是沒有sudo權限,所以依賴的包都只能裝在自己用戶下的conda環境里

  • 按理來說這個要求應該不少吧。。但是搜出來一大堆博客都是要sudo權限,動不動就卸載、升級。。做不到啊。。只能各種在conda里刪刪減減。。真的好艱難!!

github下載caffe源碼

BVLC/caffe

依賴

  1. anaconda3

  2. 裝好之后,新建環境,最好用python2.7。下面都是裝在這個新建的conda環境里,所以要注意先進入該環境!

  3. 在caffe/python目錄下

    pip install -r requirements.txt   #requirements.txt 
    
  4. 在conda的環境中裝必要的包

    我裝的版本 python2, opencv3

    版本一致很重要!

    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的詳細信息則代表路徑添加成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM