caffe install pycaffe
安装Pycaffe - greenchina1992的专栏 - CSDN博客
CUSTOM_CXX := g++ -std=c++11
安装pycaffe
本文的安装环境是centos(CentOS Linux release 7.2)服务器,但也提到一些ubuntu的设置,可供参考
0. 安装python3
一般的服务器里面都会自带python2,所以这儿不再赘述安装python2的步骤。
- 首先前往官网下载最新的release的版本,本文下载的版本是python3.5.6。
解压并编译安装
tar zxvf Python-3.5.6.tgz cd Python-3.5.6 #这儿添加--enable-shared,是为了防止后面运行python3的时候会报错 ./configure --enable-shared make all -j8 make install
- 配置环境
运行下面的指令找到所需要的动态库
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下也可以使用)来管理系统的默认环境
- 确认python2以及python3的位置
whereis python
- 配置环境
将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
- 使用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才会正常运行
- 使用update-alternative选择需要使用的python版本
2. 安装pip2以及pip3
2.1 安装pip2
yum install python-pip
2.2 安装pip3
tar -zxvf setuptools.tar.gz cd setuptools python3 setup.py install
- 从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
- 从pip-github官网或者csdn资源下载Pip源码安装:
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文件。以下为我本人的主要配置:
- 注释掉所有包含compute_20的行,因为我们在用cuda-9.0
打开或者设置以下配置:
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
- 接着就可以编译并安装caffe了
make all -j8 make test -j8 make runtest -j8
- 接着就可以编译并安装caffe了
如果上述命令没有问题,接着编译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库。
如果你确定你安装的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
- 如果没有发现这样的库,那可能是之前只是安装了python2版本的boost库,所以我们可能需要源码安装。
4.1.1 编译并安装boost库
- 前往官网下载boost库源码
- 找到pyconfig.h所在目录$PY_CONFIG
sudo find / -name pyconfig.h
- 如果没有发现这样的库,那可能是之前只是安装了python2版本的boost库,所以我们可能需要源码安装。
解压、配置并编译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
- 配置环境变量:
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