本文的安装环境是centos(CentOS Linux release 7.2)服务器,但也提到一些ubuntu的设置,可供参考
一般的服务器里面都会自带python2,所以这儿不再赘述安装python2的步骤。
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
为了后面更好的使用python的环境,我们这儿要做好python2与python3的共存以及管理,虽然可以使用软链以及输入"python2" 、"python3"这样的命令去区别,但本文建议使用update-alternative(ubuntu下也可以使用)来管理系统的默认环境
确认python2以及python3的位置
whereis python
将python2以及python3的真实的可执行文件告知update-alternative
#update-alternatives --install
#link即为真正需要管理的链接处,即我们输入python的时候会调用的地方
#name是多个python版本统一的名字,后面调用--list或者--config的时候会游泳
#paht即为真正需要管理的可执行程序的路径,也是我们上面执行whereis python所得到的路径
#priority为显示的顺序
update-alternatives --install /usr/bin/python python /usr/local/bin/python3.5 1
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
TIPS: 如果默认的python指向的是python3,则运行yum的时候会报错
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
因为yum就是python在运行,所以这个时候需要切换为python2,yum才会正常运行
yum install python-pip
tar -zxvf setuptools.tar.gz
cd setuptools
python3 setup.py install
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
#升级Pip2
pip2 install -U pip
#升级pip3
pip3 install -U pip
安装caffe之前需要安装一些依赖环境,比如CUDA等等,这儿不再介绍,可以参考caffe官网或者在CentOS 7上安装Caffe等等。
前往protobuf的github官网,从release里面下载所需要的版本,我下载的版本是protobuf-all-3.6.1
然后执行下面命令:
./autogen.sh
./configure
make
make check
make install
最后记得将library的path写到~/.bashrc里面的LD_LIBRARY_PATH变量并source ~/.bashrc
前往hdf5官网下载所需要的版本并解压
$ ./configure --prefix=/usr/local/hdf5
$ make
$ make check # run test suite.
$ make install
$ make check-install
安装完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文件。以下为我本人的主要配置:
USE_CUDNN := 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
USE_HDF5 := 1
WITH_PYTHON_LAYER := 1
make all -j8
make test -j8
make runtest -j8
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",如果么有发现错误提示,即代表安装成功。在编译caffe的步骤里面的"make all"时候,可能会出现这个错误,这个错误就是因为没有安装适用于python的booost库。
find / -name libboost_python*
sudo ln -s libboost_python-py35.so libboost_python3.so
sudo find / -name pyconfig.h
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.1.1的第四步来即可解决;也有可能是没有执行"./b2 install"命令
在安装完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
依然是在执行"import caffe"的时候会遇到的错误,大致报错信息如下:
File "/root/software/caffe-master/distribute/python/caffe/proto/caffe_pb2.py", line 17, in
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资源,下载并替换即可。
这个是因为在编译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
在"import caffe"的时候可能会报错,这是因为没有配置好python的环境变量:
vim ~/.bashrc
export PYTHONPATH="~/caffe_root/distribute/python:$PYTHONPATH"
#退出vim
source ~/.bashrc
vim ~/.bashrc
export LD_LIBRARY_PATH="~/caffe_root/distribute/lib:$LD_LIBRARY_PATH"
#退出vim
source ~/.bashrc
这个错误是因为编译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.
对于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…):
sudo yum install python-devel # for python2.x installs sudo yum install python34-devel # for python3.4 installs
For dnf (Fedora…):
sudo dnf install python2-devel # for python2.x installs sudo dnf install python3-devel # for python3.x installs
For zypper (openSUSE…):
sudo zypper in python-devel # for python2.x installs sudo zypper in python3-devel # for python3.x installs
For apk (Alpine…):
# 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…):
apt-cyg install python-devel # for python2.x installs apt-cyg install python3-devel # for python3.x installs
在安装protobuf的时候可能会遇到这个错误,这是因为没有安装automake
yum install autoconf automake libtool
在编译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
因为我使用的是centos系统,而centos下面不提供cblas,但是却有satlas和 tatlas,所以需要修改caffe里面的Makefile:
将
LIBRARIES += cblas atlas
改成
LIBRARIES += satlas tatlas