caffe install pycaffe


原文链接: caffe install pycaffe

安装Pycaffe - greenchina1992的专栏 - CSDN博客

CUSTOM_CXX := g++ -std=c++11

安装pycaffe

本文的安装环境是centos(CentOS Linux release 7.2)服务器,但也提到一些ubuntu的设置,可供参考

0. 安装python3

一般的服务器里面都会自带python2,所以这儿不再赘述安装python2的步骤。

  1. 首先前往官网下载最新的release的版本,本文下载的版本是python3.5.6
  2. 解压并编译安装

    tar zxvf Python-3.5.6.tgz
    cd Python-3.5.6
    #这儿添加--enable-shared,是为了防止后面运行python3的时候会报错
    ./configure --enable-shared
    make all -j8
    make install
    
    1. 配置环境

    运行下面的指令找到所需要的动态库

    sudo find / -name libpython3.5m.so.1.0
    

    然后将找到的位置(本文找到的是"/usr/local/lib")写入到配置环境中并使配置生效

    vim /etc/ld.so.conf.d/python3.conf
    /usr/local/lib
    #退出vim
    ldconfig
    

    1. python2与python3共存

    为了后面更好的使用python的环境,我们这儿要做好python2与python3的共存以及管理,虽然可以使用软链以及输入"python2" 、"python3"这样的命令去区别,但本文建议使用update-alternative(ubuntu下也可以使用)来管理系统的默认环境

    1. 确认python2以及python3的位置

    whereis python
    
  3. 将python2以及python3的真实的可执行文件告知update-alternative

    #update-alternatives --install <link> <name> <path> <priority>
    #link即为真正需要管理的链接处,即我们输入python的时候会调用的地方
    #name是多个python版本统一的名字,后面调用--list或者--config的时候会游泳
    #paht即为真正需要管理的可执行程序的路径,也是我们上面执行whereis python所得到的路径
    #priority为显示的顺序
    sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.6 1
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
    
    1. 使用update-alternative选择需要使用的python版本

    #如果是ubuntu则将--config 改为--list
    update-alternatives --config python
    

    则会显示下面的文字:

    There are 2 programs which provide 'python'.
    
       Selection    Command
     -----------------------------------------------
     *+ 1           /usr/bin/python2.7
        2           /usr/local/bin/python3.5
    
     Enter to keep the current selection[+], or type selection number:
    

    此时输入2,即可让默认的python指向python3

    TPS: 如果默认的python指向的是python3,则运行yum的时候会报错

    File "/usr/bin/yum", line 30
        except KeyboardInterrupt, e:
                                ^
      SyntaxError: invalid syntax
    

    因为yum就是python在运行,所以这个时候需要切换为python2,yum才会正常运行

2. 安装pip2以及pip3

2.1 安装pip2

yum install python-pip

2.2 安装pip3

  1. 官网或者csdn资源下载setuptools源码并安装:

    tar -zxvf setuptools.tar.gz
    cd setuptools
    python3 setup.py install
    
    1. pip-github官网或者csdn资源下载Pip源码安装:

    gzip -dv pip.tar.gz
    tar xvf pip.tar
    cd pip
    python3 setup.py build
    python3 setup.py install
    ln -s /usr/local/bin/pip3 /usr/bin/pip3
    

2.3 升级Pip

#升级Pip2
pip2 install -U pip
#升级pip3
pip3 install -U pip

3. 安装caffe

3.1 caffe依赖环境

安装caffe之前需要安装一些依赖环境,比如CUDA等等,这儿不再介绍,可以参考caffe官网或者在CentOS 7上安装Caffe等等。

3.1.1 安装protobuf

前往protobuf的github官网,从release里面下载所需要的版本,我下载的版本是protobuf-all-3.6.1
然后执行下面命令:

./autogen.sh
./configure
make
make check
make install

最后记得将library的path写到~/.bashrc里面的LD_LIBRARY_PATH变量并source ~/.bashrc

3.1.2 安装hdf5

前往hdf5官网下载所需要的版本并解压

$ ./configure --prefix=/usr/local/hdf5
$ make
$ make check                # run test suite.
$ make install
$ make check-install

3.2 python配置

安装完caffe的依赖环境之后,先别急着安装caffe。
首先需要安装一些python的依赖库,这儿要确保使用的时python3.

cd python
for req in $(cat requirements.txt); do pip install $req; done

如果上述命令不行,则可以运行:

pip3 install -r requirements.txt

运行上面这个命令可能会有下面的提示:

matplotlib 3.0.0 has requirement python-dateutil>=2.1, but you'll have python-dateutil 1.5 which is incompatible.
pandas 0.23.4 has requirement python-dateutil>=2.5.0, but you'll have python-dateutil 1.5 which is incompatible

这个时候可以考虑将requirements.txt里面的

python-dateutil>=1.4,<2

改为

python-dateutil>=2.5

接着我们需要配置一下caffe的Makefile.config文件。以下为我本人的主要配置:

  1. 注释掉所有包含compute_20的行,因为我们在用cuda-9.0
  2. 打开或者设置以下配置:

    USE_CUDNN := 1
    USE_HDF5 := 1
    BLAS := atlas
    BLAS_INCLUDE := /usr/include/atlas
    BLAS_LIB := /usr/lib64/atlas
    PYTHON_LIBRARIES := boost_python3 python3.5m
    PYTHON_INCLUDE := /usr/local/include/python3.5m \
                     /usr/local/lib/python3.5/site-packages/numpy/core/include
    PYTHON_LIB := /usr/lib64
        
    WITH_PYTHON_LAYER := 1
    
    CUSTOM_CXX := g++ -std=c++11
    

    3.3 编译caffe以及pycaffe

    1. 接着就可以编译并安装caffe了

    make all -j8
    make test -j8
    make runtest -j8
    
  3. 如果上述命令没有问题,接着编译pycaffe

    make pycaffe
    make distribute
    

    如果没有任何错误,这个时候你会在你的caffe主目录下面看到一个distribute的文件夹。这儿就是我们需要的pycaffe了。接着我们需要将python配置到环境变量里面:

    vim ~/.bashrc
    export PYTHONPATH="~/caffe_root/distribute/python:$PYTHONPATH"
    export LD_LIBRARY_PATH="~/caffe_root/distribute/lib:$LD_LIBRARY_PATH"
    #退出vim
    source ~/.bashrc
    

    后面你在命令行当中输入python并"import caffe",如果么有发现错误提示,即代表安装成功。

4. 安装pycaffe时的错误集锦(欢迎提供新的错误)

4.1 cannot find -lboost_python3

在编译caffe的步骤里面的"make all"时候,可能会出现这个错误,这个错误就是因为没有安装适用于python的booost库。

  1. 如果你确定你安装的boost库是python3的版本的,则可以使用Solve the problem: “cannot find -lboost_python3” when using Python3 Ubuntu16.04提到的方法解决:

    find /usr -name libboost_python*
    cd /usr/lib/x86_64-linux-gnu/
    sudo ln -s libboost_python-py35.so libboost_python3.so
    
    1. 如果没有发现这样的库,那可能是之前只是安装了python2版本的boost库,所以我们可能需要源码安装。

    4.1.1 编译并安装boost库

    1. 前往官网下载boost库源码
    2. 找到pyconfig.h所在目录$PY_CONFIG

    sudo find / -name pyconfig.h
    
  2. 解压、配置并编译boost库:

    tar zxvf boost_1_68_0.tar.gz
    cd boost_1_68_0
    ./bootstrap.sh
    ./b2 --with-python include="$PY_CONFIG"
    ./b2 install
    ln -s /usr/local/lib/libboost_python35.so.1.68.0 /usr/local/lib/libboost_python3.so
    
    1. 配置环境变量:

    vim ~/.bashrc
    export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
    #退出vim
    source ~/.bashrc
    

4.2 libboost_system.so.1.68.0: cannot open shared object file: No such file or directory

这个是因为没有配置环境变量,按照4.1.1的第四步来即可解决;也有可能是没有执行"./b2 install"命令

4.3 Can’t create weekday with n == 0

在安装完Pycaffe之后,"import caffe"的时候可能会报错如下:

File "/usr/local/lib/python3.5/site-packages/dateutil/rrule.py", line 55
    raise ValueError, "Can't create weekday with n == 0"

这个时候需要更新一下python-dateutil库:

pip3 install python-dateutil --upgrade

4.4 TypeError: expected bytes, str found

依然是在执行"import caffe"的时候会遇到的错误,大致报错信息如下:

File "/root/software/caffe-master/distribute/python/caffe/proto/caffe_pb2.py", line 17, in <module>
    serialized_pb='\n\x17\x63\x61\x66\x66\x65/proto/caffe.prot
File "/usr/local/lib/python3.5/site-packages/google/protobuf/descriptor.py", line 878, in __new__
    return _message.default_pool.AddSerializedFile(serialized_pb)
TypeError: expected bytes, str found

这个则是编译生成的caffe_pb2.py文件有问题,需要找一个正确编译的文件替代"caffe_root/python/caffe/proto/caffe_pb2.py",已上传到csdn资源,下载并替换即可。

4.5 error while loading shared libraries: libpython3.5m.so.1.0

这个是因为在编译python3的时候没有添加"–enable-shared"选项,所以安装python3用以下的命令:

./configure --enable-shared
make all -j8
make install

如果这个时候还是会报错,则找到libpython3.5m.so.1.0文件所在的位置,将该位置配置一下:

find / -name libpython3.5m.so.1.0
#比如找到的地址是/usr/local/lib
vim /etc/ld.so.conf.d/python3.conf
/usr/local/lib
#退出vim
ldconfig
  • 6

4.6 No Module Named caffe

在"import caffe"的时候可能会报错,这是因为没有配置好python的环境变量:

vim ~/.bashrc
export PYTHONPATH="~/caffe_root/distribute/python:$PYTHONPATH"
#退出vim
source ~/.bashrc
  • 4

4.7 ImportError: libcaffe.so.1.0.0: cannot open shared object file: No such file or directory

vim ~/.bashrc
export LD_LIBRARY_PATH="~/caffe_root/distribute/lib:$LD_LIBRARY_PATH"
#退出vim
source ~/.bashrc
  • 4

4.8 libboost_python35.so.1.68.0: undefined symbol: PyClass_Type

这个错误是因为编译boost的时候使用了python2,PyClass_Type是python2 C API,所以在python3里面"import caffe"的时候会出现这个错误,这个需要去重新编译一下boost,编译之前,需要确认使用"python"命令的时候出现的是python3
或者参考libboost_python3.so.1.56.0: undefined symbol: PyClass_Type去编译多个版本的liboost也可以:

$ ./bootstrap.sh --with-python=/usr/bin/python2
...
Detecting Python version... 2.7
$ ./b2 --with-python --buildid=2 # produces libboost_python-2.so
$ ./bootstrap.sh --with-python=/usr/bin/python3 --with-python-root=/usr
...
Detecting Python version... 3.3
$ ./b2 --with-python --buildid=3noclean # produces libboost_python-3noclean.so
$ ./b2 --with-python --clean
$ ./b2 --with-python --buildid=3 # produces libboost_python-3.so

$ nm -D stage/lib/libboost_python-2.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3noclean.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3.so | grep PyClass_Type

As expected, libboost_python-2.so references the PyClass_Type symbol. Additionally, the libboost_python-3noclean.so contains a reference to PyClass_Type as it was built with libboost_python-2.so’s object files. With a clean build, libboost_python-3.so should not contain a reference to PyClass_Type.

4.9 fatal error: Python.h: No such file or directory

对于centos系统,采用下面的命令:

yum install python-devel   # for python2.x installs
yum install python34-devel   # for python3.4 installs

其他的可以参考fatal error: Python.h: No such file or directory

For apt (Ubuntu, Debian…):

> sudo apt-get install python-dev   # for python2.x installs
> sudo apt-get install python3-dev  # for python3.x installs
> ```
>
>
>
>
> For yum (CentOS, RHEL…):
>
>
> ```sh
> sudo yum install python-devel   # for python2.x installs
> sudo yum install python34-devel   # for python3.4 installs
> ```
>
>
>
>
> For dnf (Fedora…):
>
>
> ```sh
> sudo dnf install python2-devel  # for python2.x installs
> sudo dnf install python3-devel  # for python3.x installs
> ```
>
>
>
>
> For zypper (openSUSE…):
>
>
> ```sh
> sudo zypper in python-devel   # for python2.x installs
> sudo zypper in python3-devel  # for python3.x installs
> ```
>
>
>
>
> For apk (Alpine…):
>
>
> ```sh
> # This is a departure from the normal Alpine naming
> # scheme, which uses py2- and py3- prefixes
> sudo apk add python2-dev  # for python2.x installs
> sudo apk add python3-dev  # for python3.x installs
> ```
>
>
>
>
>
> For apt-cyg (Cygwin…):
>
>
> ```sh
> apt-cyg install python-devel   # for python2.x installs
> apt-cyg install python3-devel  # for python3.x installs
> ```
>
>
>

### 4.10 autoreconf: command not found

在安装protobuf的时候可能会遇到这个错误,这是因为没有安装automake

```sh
yum install autoconf automake libtool

4.11 make all时提示要有-std=c++11

在编译caffe的时候可能会有下面的错误:

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

这个时候大概率是protobuf的版本是用C++11编译的,而caffe的makefile里面默认是不带这个参数的,所以要么protobuf换做低版本,要么修改caffe的makefile,我建议修改caffe的makefile:
将原有的

CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS)
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS)

改为

CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -std=c++11
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) -std=c++11
LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -std=c++11

4.12 /usr/bin/ld: cannot find -lcblas

因为我使用的是centos系统,而centos下面不提供cblas,但是却有satlas和 tatlas,所以需要修改caffe里面的Makefile:

LIBRARIES += cblas atlas

改成

LIBRARIES += satlas tatlas
`