zoukankan      html  css  js  c++  java
  • (原)Ubuntu16中编译caffe

     转载请注明出处:

    http://www.cnblogs.com/darkknightzh/p/5797526.html

    参考网址:

    http://caffe.berkeleyvision.org/installation.html#prerequisites

    1. 必须的依赖:Boost >= 1.55,CUDA,BLAS

    看一下自己的CUDA安装在哪个目录下了。Makefile.config默认CUDA_DIR := /usr/local/cuda

    依赖库:protobuf, glog, gflags, hdf5。安装:

    sudo apt-get install libgflags-dev
    sudo apt-get install libgoogle-glog-dev
    sudo apt-get install libhdf5-serial-dev

    BLAS可以使用atlas,mkl或者openblas。atlas是caffe默认选择的。mkl和openblas性能更好。安装atlas:

    sudo apt-get install libatlas-base-dev

    2. 可选的:OpenCV >= 2.4 including 3.0(默认使用2.4。如果想不使用,则将Makefile.config中11行取消注释;如果使用opencv3,将Makefile.config中21行取消注释)

    IO库:lmdb(默认使用。如果想不使用,则将Makefile.config中13行取消注释)、leveldb (note: leveldb requires snappy;默认使用。如果想不使用,则将Makefile.config中12行取消注释)

    pip install lmdb(可能需要先安装pip:sudo apt install python-pip)

    cuDNN:见http://www.cnblogs.com/darkknightzh/p/5668471.html中步骤1-3。

    3. 如果只使用cpu的话,将Makefile.config中的CPU_ONLY := 1取消注释。

    使用cuDNN的话,取消注释Makefile.config中的USE_CUDNN := 1。

    使用mkl的话,设置Makefile.config中BLAS := mkl

    使用openblas的话,设置Makefile.config中BLAS := open

    说明:装完依赖的库之后,最好重启一下(比如装完boost,重启一下),因为装完boost没有重启,然后make all时能通过了。

    此处make all和make test都通过了,但是make runtest会提示libboost_system未定义(实际上装的是中文的ubuntu,因而显示信息时未定义。但是开始没截图。现在成功了,没法截图了。只能找一个英文的信息贴这里。。。):

    undefined reference to `boost::system::generic_category()'

    4. 编译caffe:终端中输入如下命令:

    cp Makefile.config.example Makefile.config
    # Adjust Makefile.config (for example, if using Anaconda Python, or if cuDNN is desired)
    make all
    make test
    make runtest

    如果想用多线程编译,使用make all -j8,其中8为并行的线程数。

    ============================================================

    160920更新:

    1) 如果想在python和matlab中使用caffe,首先在Makefile.config中设置python和matlab的路径PYTHON_INCLUDE(64行)和MATLAB_DIR(59行),而后分别运行如下命令:

    make pycaffe
    make matcaffe

    说明:(1) 对于python,官网推荐使用Anaconda

    (2) 为了在make pycaffe后,在python中能成功import caffe,需要将模块的路径添加到$PYTHONPATH中,命令如下:

    export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH

    不能将caffe/python/caffe导入到$PYTHONPATH中。

    (3) 目前的caffe兼容matlab 2015a, 2014a/b, 2013a/b, and 2012b.

    2) 使用如下命令创建一个distribute,可将所有的caffe头文件,编译后的库文件及二进制文件置于对应的文件夹内,方便将该distribute拷贝到其他电脑上面。使用该命令后,会在caffe根目录下创建一个distribute文件夹,里面包含bin、include、lib、proto、python等文件夹。

    make distribute

    160920更新结束

    160921更新

    对于上面1)(2)中PYTHONPATH路径,实际上导入的是caffe/python路径,由于该文件夹内还有caffe文件夹,所以说不能导入caffe/python/caffe文件夹,比如可以导入:

    export PYTHONPATH=/home/xxx/caffe-master/python:$PYTHONPATH

    下面的导入则是错误的

    export PYTHONPATH=/home/xxx/caffe-master/python/caffe:$PYTHONPATH

    或者干脆更省事的方法,直接打开.bashrc文件,位于/home/xxx/.bashrc,然后在最后添加上上面正确的语句。之后将终端定位到/home/xxx内,输入source .bashrc,使bashrc生效。再在终端中输入python后,输入import python就能成功。

    160921更新结束

    161116更新

    如果自己添加了新的层,make时不变,但是可能只需要make test自己的测试代码,按照https://github.com/BVLC/caffe/issues/684中misaka-10032和matthieudelaro给出的代码,可以使用如下命令中的一个即可(不记得当时使用的是哪个命令了。可以都试一下):

    build/test/test_all.testbin --gtest_filter='*MyLayerTest*'
    make all && make test && build/test/test_all.testbin --gtest_filter='*MyLayerTest*'

    需要注意的是,'*MyLayerTest*'两边的*不要去掉。印象中如果去掉的话,会提示找不到那个Test。

    --gtest_filter的说明如下:

    161116更新结束

    171115更新

    在matlab2016b中导入caffe时,可能会提示:

    libstdc++.so.6: undefined symbol

    http://www.cnblogs.com/fanru5161/p/7055506.html给出了具体的解决方法,或者使用LD_PRELOAD,或者替换该库以及另外的opencv的3个库(见https://github.com/BVLC/caffe/issues/3934duchengyao的留言,下面的三句话对应这三个库,只不过终端已经位于matlab/r2016b/bin/glnxa64文件夹内,如果matlab不在系统目录,则只能用-s建立软链接,如下面所示;否则可以建立硬链接,不加-s):

    ln -s /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.9 libopencv_core.so.2.4
    ln -s /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.9 libopencv_highgui.so.2.4
    ln -s /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.2.4.9 libopencv_imgproc.so.2.4

    171115更新结束

    ============================================================

    最终编译完成后的截图:

    ps:使用cmake编译(CMake version >= 2.8.7):

    首先定位到caffe文件夹内。之后:

    mkdir build
    cd build
    cmake ..
    make all
    make install
    make runtest

    说明:使用cmake编译没成功。。。总是有问题。最终又回到了make编译。

    5. 将caffe的头文件拷贝到系统目录下:

    sudo cp -a build/lib /usr
    sudo cp –a include /usr

    刚才很奇怪,用第二句就一直提示:

    cp: 无法获取'–a' 的文件状态(stat): 没有那个文件或目录
    cp: 略过目录'include'

    之后第二句开始的include改成了绝对路径,就可以了。。。(关键的在另一台电脑上,第二句是可以用的):

    sudo cp -a /home/XXX/caffe-master/include /usr

    6. 遇到的问题:

    1)fatal error: hdf5.h: 没有那个文件或目录”解决方法

    http://blog.csdn.net/xue_wenyuan/article/details/52037121

    在Makefile.config文件的第90行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS。

    INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

    在Makefile文件的第181行,把 hdf5_hl 和hdf5修改为hdf5_serial_hl 和 hdf5_serial。

    LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

    2)/usr/local/cuda/bin/nvcc:命令未找到:

    在Makefile.config的第28行内容从CUDA_DIR := /usr/local/cuda修改为(我这边nvcc所在位置为/usr/lib/nvidia-cuda-toolkit/bin/nvcc):

    CUDA_DIR := /usr/lib/nvidia-cuda-toolkit

    3)error: ‘memcpy’ was not declared in this scope

       return (char *) memcpy (__dest, __src, __n) + __n;

    http://blog.csdn.net/eagelangel/article/details/51531801

    Makefile中409行,增加-D_FORCE_INLINES

    NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

    4)直接使用make all,提示下面的内容。

    网上说是protobuf 版本不一致。重新装了最新版的protobuf,然后用make all,还是会提示上面的内容。此时显示所有文件夹的话,实际上在caffe根目录下有.build_release的目录,里面就有caffe.pb.cc。

    用make clean,提示权限不足(caffe放在了usr/local目录下),然后使用sudo make clean(如果是在home的路径下,应该不需要sudo的),成功清除了.build_release里面的文件。之后再make all,就不会有上面的提示了。

    =======================================================

    170414更新:

    5)换了cuda后,提示找不到libcudart.so.7.5(记不清楚是否是这个库了)

    a. 在终端中的解决方法

    前几天把cuda更新成8.0了。但是caffe编译时用的是cuda7.5。因而今天在python中import caffe时,提示找不到libcudart.so.7.5。

    解决方法是,在终端中输入python testXXX.py之前,先输入

    export CPATH=/usr/local/cuda-7.5/include:$CPATH
    export LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LIBRARY_PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH

    说明:更新cuda8.0之后,上面默认的均为cuda-8.0。

    之后在输入python testXXX.py,便可以正常的运行使用caffe的python程序了。

    b. 在pycharm中的解决方法

    http://blog.csdn.net/dl_chenbo/article/details/53262230

    给出了解决方法:

    Edit Configurations——Environment variables中添加上面三个路径就可以了(貌似框的有点错位。反正和上面的三个对应就行了):

    170414更新结束

    =======================================================

    170713更新

    如果需要使用anaconda的话,Makefile.config中,注释掉PYTHON_INCLUDE对应的默认两行(如68,69行),并且取消注释ANACONDA_HOME那行(如72行)及其下面包含PYTHON_INCLUDE的三行(如73,74,75行)。之后注释掉PYTHON_LIB的默认路径那行(如83行),取消注释其对应于anaconda的那行(如84行)。

    需要说明的是,73,74,75三行(我这边在这三行)一定要都取消注释,否则在make pycaffe时,可能会提示python.h no such file or directory
    原因就是注释了默认的python的include文件路径,但是上面三行没有都取消注释。

    如果电脑中有多个g++,需要设置编译时使用的g++,可以取消注释Makefile.config中第25行,同时修改CUSTOM_CXX为需要的路径,如下:

    CUSTOM_CXX := /usr/bin/g++4.9

    170713更新结束

    171115更新

    使用anaconda时,python中import caffe后,一直提示ImportError: No module named google.protobuf.internal

    http://www.jianshu.com/p/1e405b9fe973指出:

    protobuf千万不要用conda install来安装,要用~/anaconda2/bin/pip install protobuf 安装,不然import caffe会出现ImportError: No module named google.protobuf.internal

    额。。。弄了好久,死活用不了anaconda,看了人家的说明,就可以了。。。哎,我又坑了我一次。。。

    编译完libcaffe.so后,可以使用如下命令看一下该so都依赖哪些库(https://groups.google.com/forum/#!topic/caffe-users/l9uUGvTF9zg):

    ldd -d .build_release/lib/libcaffe.so

    171115更新结束

    180320更新:

    今天在使用anaconda并编译caffe时,出现crtbeginS.o:unrecognized relocation的错误。解决方法吐下:

    1. 修改makefile文件

    直接在Makefile最开始增加下面一句话:

    CXX := /usr/bin/g++-4.9

    之后在终端中直接使用官方的编译命令即可:

    make CUDA_HOME=/usr/local/cuda-8.0

    方法2:输入make时增加CXX标志位

    https://www.cnblogs.com/sky-heaven/p/6272408.html中指出:

    = 是最基本的赋值

    := 是覆盖之前的值

    ?= 是如果没有被赋值过就赋予等号后面的值

    += 是添加等号后面的值

    因而考虑直接添加CXX的标志,如下:

    make CXX=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0

    弱弱的说一下,终端中输入下面的命令,也可以:

    make CXX?=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0

    如果要使用nccl,如https://www.cnblogs.com/haiyang21/p/7183413.html中所说,需要Makefile.config中取消注释USE_NCCL := 1,并将NCCL的include和lib路径增加到Makefile.config中,具体如下:

    USE_NCCL := 1
    INCLUDE_DIRS += /path/nccl/build/include
    LIBRARY_DIRS += /path/nccl/build/lib

    但如果使用的是anaconda,可能会提示找不到某个库。。。后来决定不使用nccl了,因而没有继续深入查找原因。见谅。

    安装nccl及可能碰到的问题见:

    http://www.cnblogs.com/darkknightzh/p/5717234.html

    http://www.cnblogs.com/darkknightzh/p/6950263.html

    180320更新结束

    =============================================================================================

     

  • 相关阅读:
    json dump dumps load loads
    python tip: 格式化 深浅copy sorted
    转载整理
    python 计算器练习
    实验5 OSPF虚连接和验证配置
    实验4 OSPF的特殊区域STUB和NSSA
    实验3ospf路由聚合
    实验2 OSPF基本配置
    实验1静态ECMP的浮动静态路由配置
    补充实验6:tftp
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/5797526.html
Copyright © 2011-2022 走看看