caffe学习(三)caffe + centOS 7 + CUDA 7配置

这次全程记录centOS 7 的配置安装过程

开发环境

虽然它这么好用,安装它可不是一个省心的事,最好的参考资料还是官网安装资料http://caffe.berkeleyvision.org/installation.html,配置之前先查看一下自己的软硬件环境

dns配置

google之,不多介绍,注意centos 7的dns设置与之前的版本不同

查看显卡

我们的显卡是K40(没显卡也能玩caffe),可以看到是4个k40m显卡。。。。我口水直流(@ο@)

lspci |grep -i nvidia

查看linux版本

Linux服务器版本是centOS 7,查看服务器系统版本命令

cat /etc/redhat-release

安装python

python2.7升级到Anaconda版本Anaconda-2.3.0-Linux-x86_64.sh下载后直接运行即可,numpy,scipy,scikit-learn等相关软件就都配置好了。记得生效一下环境变量source ~/.bashrc。Anaconda直接把python升级到2.7版本,同时安装好了所有相关依赖包,简直完美啊,解决了python多版本共存的问题,同时一键安装python和相关插件,并且配置好了相关环境变量,同时还是64位版本的python,强烈推荐。

安装cmake

再把cmake升级到2.8.12版本,centos 7 的yum只能升级到2.8.11版本

# 先安装依赖
yum install gcc
yum install gcc-c++
# 下载安装包
tar xvf cmake-2.8.12.1.tar.gz
cd cmake-2.8.12.1/
./configure
make
make install
vim /etc/profile
###########[profile末尾添加]
PATH=/usr/local/cmake/bin:$PATH
export PATH
#############关闭文件
source /etc/profile
########查看是否安装好
cmake --version

安装CUDA和MKL

这两个商用软件安装相对容易

CUDA 7

下载CUDA 7https://developer.nvidia.com/cuda-downloads

yum install kernel-devel
init 3         # 关闭GUI
./cuda_7.0.28_linux.run
init 5         # 开启GUI
vim /etc/profile
#############[profile]
export PATH=$PATH:/usr/local/cuda-7.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-7.0/lib64
#############[close profile]
source /etc/profile

PS:目前我只在CentOS 7.0配置成功,在7.1和7.2版本会出现如下错误导致CUDA安装失败这里记录一下网上的解决方案:显卡驱动安装不成功,解决方法,先卸载系统已载入的显卡相关模块,同时指定kernel-source-path的路径,如下

lsmod |grep nouveau # 发现存在相关模块
modprobe -r nouveau # 卸载相关模块
./cuda_7.0.28_linux.run --kernel-source-path="/usr/src/kernels/03.10.0-xxxxxx"

根据caffe的官方最新提示,CUDA和显卡驱动最好分开安装,不然CUDA自带的显卡驱动不是最近版本,可能使用的时候会出问题,先装显卡驱动,去官网下载http://www.nvidia.com/download/driverResults.aspx/92135/en-us

vim /lib/modprobe.d/dist-blacklist.conf
########################[change]
#blacklist nvidiafb #注释掉nvidiafb,否则cuda安装报错nvidia.ko
########################[close]
vim /etc/modprobe.d/blacklist-nouveau.conf
########################[added]
blacklist nouveau
options nouveau modeset=0
########################[close]
dracut --force
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)

init 3和init 5在最新的centOS里并不生效,取而代之的是graphical.target(5)和multi-user.target(3)。

systemctl get-default #查看运行级别
systemctl set-default multi-user.target #切换为文本模式
reboot
./NVIDIA-XXXX.run --kernel-source-path=/usr/src/kernels/内核号 -k $(uname -r) #最后面的-k参数是可以解决bug: unable to load the kernel module 'nvidia.ko'

接下来,验证CUDA是否安装好

nvcc -V     # 验证nvidia-CUDA-Toolkit是否安装好
cd ~/NVIDIA_CUDA-7.0_Samples
make
cd bin/x86_64/linux/release
./deviceQuery

从输出的信息就可以判断是否安装好CUDA

intel MKL

下载intel MKL,解压后执行

tar xzvf parallel_studio_xe_2015.tgz
cd parallel_studio_xe_2015
./install.sh
# 偷偷记录一下自己的序列号SGZG-6NRGK57H
vim /etc/ld.so.conf.d/intel_mkl.conf
###############[intel_mkl.conf]
/opt/intel/mkl/lib/intel64
###############[close intel_mkl.conf]
ldconfig
vim /etc/profile
############[profile]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/mkl/lib 
# 或者直接把/opt/intel/mkl/lib copy到/usr/local/lib
############[close profile]
source /etc/profile

依赖库安装

Install protobuf

protobuf是谷歌开发的一种实现内存外存交换的协议接口,在这个统一的通讯协议下不同开发者可以使用自己喜欢的方式进行模型参数的管理。
上网下载protobuf2.6.1版本, anaconda的python对应的依赖包要求protobuf是2.6.1版本,弄错了是不行的。解压后,

yum install autoconf automake libtool
tar xzvf protobuf-2.6.1.tar.gz
cd protobuf-2.6.1
./autogen.sh
./configure
make
make check
make install

或者直接pip install protobuf,发现版本刚好也是2.6.1

Install boost

anaconda没有包含boost,anaconda要求的boost版本为1.57

# download boost_1_57_0.tar.bz2
tar xvf boost_1_57_0.tar.bz2
cd boost_1_57_0
./bootstrap.sh
./b2
./b2 install

Install leveldb

pip install leveldb
# git clone https://github.com/google/leveldb.git
# cd leveldb/
# make
# cp -d out-shared/libleveldb* /usr/lib/
# cp -r include/leveldb/ /usr/local/include

Install snappy

yum install snappy发现centos7 已经给安装好了

Install lmdb

pip install lmdb

Install hdf5

下载hdf5

tar xvf hdf5-1.8.5-patch1.tar
cd hdf5-1.8.5-patch
./configure --prefix=/opt/hdf5
make
make check
make install
make check-install
vim /etc/profile
############[profile]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hdf5/lib
# 或者直接把/opt/hdf5/lib copy到/usr/local/lib
############[close profile]
source /etc/profile

其他依赖库

其他依赖库按照官网说法,先试了一遍

yum install snappy-devel opencv-devel boost-devel
yum install python-devel
yum install protobuf-devel leveldb-devel hdf5-devel # 这几个包不行
yum install gflags-devel glog-devel lmdb-devel # 这几个包也不行

关于gflags, glog, lmdb的解决方案,官网给出了

# glog
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make && make install
# gflags
wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install
# lmdb
git clone https://github.com/LMDB/lmdb
cd lmdb/libraries/liblmdb
make && make install

补充一下,上面的配置有可能编译caffe的时候出现如下报错:error while loading shared libraries: libgflag.so.0,要在gflag的cmake的时候使用如下参数

cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google -G"Unix Makefiles" ../

如果报错为error while loading shared libraries: libglog.so.0,则要增加如下设置

cat /etc/ld.so.conf  
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig

但是有几个包是不行的,protobuf-devel, leveldb-devel, hdf5-devel找不到
刚才已经下载protobuf, leveldb, hdf5, 暂时先不管这几个devel了

安装OpenCV

安装了这么多年OpenCV,头一次遇到这么大坑,先尝试了大家推荐的shell一键安装

git clone https://github.com/jayrambhia/Install-OpenCV
cd Install-OpenCV-master/RedHat
./opencv_latest.sh

要注意downloading ippicv_linux_20140513.tgz的时候耗时很久,要耐心等待。
但是在编译caffe的时候还是报错,回来重新安装opencv2.4.11

cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..
make
sudo make install

执行python模块

yum install opencv-python

测试python下import cv2检测是否安装成功(自带的python已经配置好opencv,anaconda不能import cv2),解决办法如下:

cp /usr/local/lib/python2.7/site-packages/cv2.so /root/anaconda/lib/python2.7/site-packages
cp /usr/local/lib/python2.7/site-packages/cv.py /root/anaconda/lib/python2.7/

安装caffe

进入到caffe的工作目录

git clone https://github.com/BVLC/caffe
cd caffe
cp Makefile.config.example Makefile.config
vim Makefile.config
###############[Makefile.config]
BLAS := mkl

PYTHON_INCLUDE := /root/anaconda/include/python2.7 \
    /root/anaconda/lib/python2.7/site-packages/numpy/core/include/ \
PYTHON_LIB := /root/anaconda/pkgs/python-2.7.10-0/lib
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include \
        /opt/hdf5/include \
        /opt/intel/mkl/include \
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib \
        /opt/hdf5/lib \
        /opt/intel/mkl/lib \
###############[close Makefile.config]
make all -j8
make test -j8
make runtest -j8

-j8选项可以提高编译速度,不是必须的,如果在runtest时候一片绿色,没报错,恭喜,说明caffe已经配置好了,可以愉快的使用了。
实测solverTest会fail,由于是Test模块,先不理会,估计是caffe的代码版本没统一,不影响使用

测试MNIST

进入到caffe根目录下,执行如下操作

./data/mnist/get_mnist.sh               # 下载minst数据库
./examples/mnist/create_mnist.sh        # 把数据转成lmdb格式
./examples/mnist/train_lenet.sh         # 训练mnist

从输出结果看到,test集上得到99.2%的正确率,还是很不错的。

其他说明

pycaffe配置

make pycaffe

编译成功了,简直酸爽。
最后配置一下环境变量,~/.bashrc添加

export PYTHONPATH=/xxxxxxxxx/caffe/python:$PYTHONPATH

python环境下

import caffe

检测caffe-python是否配置好

cuDNN

tar xzvf cudnn-7.0-linux-x64-v3.0-rc.tgz
cd cuda
cp include/* /usr/local/cuda/include
cp -d lib64/* /usr/local/cuda/lib64        # -d 保留link file的属性

在caffe根目录的Makefile.config中把USE_CUDNN := 1的屏蔽取消,然后make all即可。

Linux多用户管理

为了创建一个用户组,并把工作成员都加到这个组,并提升用户sudo权限,提升权限的时候记住最前面的%非常有用,加上才能对组生效,最后设置组内成员能够相互访问彼此目录

groupadd imgergroup
useradd -g imgergroup imger1
passwd imger1
vim /etc/sudoers
######################[sudoers]
%imgergroup       ALL=(ALL)       ALL
######################[close]
cd /home
chmod -R +r *