继win10安装caffe后,近日笔者在ubuntu Kylin16.04上开始安装caffe框架,以下为笔者经历。
在参考众多博客后,笔者发现 ubuntu16.04安装caffe 此篇较为具体,笔者在此基础上加以补充。
大概具体步骤如下:
- 最新显卡驱动的安装
- Cuda8.0的安装
- Cudnnv5的安装
- BLAS的安装
- OpenCV3.1.0的安装
- Matlab的安装
- anaconda的安装
- caffe及相关依赖的安装
一、最新显卡驱动的安装
(1)检查你的电脑有哪些显卡
lspci -k | grep -A 2 -i "VGA"
(2)查看哪一个专有驱动是推荐安装的
sudo ubuntu-drivers devices
有个recommended 的那个驱动就是推荐的,也可以上官网查自己显卡型号推荐的驱动
(3)安装驱动
安装驱动有三种方法:(1)run文件;(2)deb文件;(3)第三方安装,各种尝试后发现第三种方法是最简便安全的。
sudo add-apt-repository ppa:graphics-drivers
然后
sudo apt-get update
sudo apt-get install nvidia-370
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev
nvidia-370是根据我的显卡740M推荐的驱动,显卡驱动型号要改成你匹配的型号,然后重启电脑使驱动生效。
这里值得一提的是,在没有装驱动的时候,通过命令行推荐型号为367,但是装上367后Cuda安装失败,提示驱动版本不匹配,这时再用命令行搜驱动,发现推荐驱动为370,然后cuda安装成功。
重启后测试
nvidia-smi
若界面显示驱动,则OK。
二. Cuda8.0的安装
( 1)从官网下载cuda8.0.run文件 ,进入该页面选择相应版本
( 2)在下载后的路径中,打开终端,启动安装程序
sh cuda_8.0.27_linux.run --override
启动安装程序,一直按空格到最后,输入accept接受条款
输入n不安装nvidia图像驱动,之前已经安装过了
输入y安装cuda 8.0工具
回车确认cuda默认安装路径:/usr/local/cuda-8.0
输入y用sudo权限运行安装,输入密码
输入y或者n安装或者不安装指向/usr/local/cuda的符号链接
输入y安装CUDA 8.0 Samples,以便后面测试
回车确认CUDA 8.0 Samples默认安装路径:/home/automan(automan是我的用户名),该安装路径测试完可以删除
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-7.5
Samples: Installed in /usr/local/cuda-7.5, but missing recommended librarie
即安装正确
(3)添加环境变量
sudo gedit ~/.bashrc
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-8.0/bin:$PATH
source ~/.bashrc
在这里可以补充一下,关于添加环境变量的三种方法。
1.控制台中,不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。
这个只针对特定的shell;
PATH=”$PATH:/my_new_path” (关闭shell,会还原PATH)
2.修改/etc/profile文件,如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;
vi /etc/profile
在里面加入:
export PATH=”$PATH:/my_new_path”
或者在/etc/bashrc里面作同样的修改。
3.修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了。
vi /root/.bashrc
在里面加入:
export PATH=”$PATH:/my_new_path”
后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
echo $PATH
输出已经是新路径了。
(4)查看cuda版本
nvcc --version
然后编译例子
cd ~/NVIDIA_CUDA-8.0_Samples/
make -j4
这里会出现gcc、g++版本过高的问题。
两种方法:
a、直接下载低版本的gcc、g++替换之
ubuntu16.04 默认安装的gcc版本为gcc-5.4,(可用gcc –version查看)有时可能需要低版本的,所以我们先安装gcc-4.8.5
sudo apt-get install -y gcc-4.8 g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20
cd /usr/bin
sudo cp gcc gcc_backup
sudo cp g++ g++_backup
sudo rm gcc g++
sudo ln -s gcc-4.8 gcc
sudo ln -s g++-4.8 g++
b、修改源码,使其支持更高版本的gcc和g++
cd /usr/local/cuda/include/ #进入到头文件目录
sudo gedit host_config.h #编辑头文件
Ctrl + F 搜索GNUC,找到一段类似于 “if GNUC>5 || (GNUC == 5 &&GNUC_MINOR> 3)”
,就是最大支持gcc-5.3,可自己取消该限制。建议改为使其支持gcc-5.4,或者直接把两个5改成6
(5)进入例子
cd ~/NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release
./deviceQuery
Result = PASS 说明cuda已经安装成功!
若fail,很有可能就是驱动不够新,
sudo ubuntu-drivers devices
装上recommend的驱动即可。
三. Cudnnv5的安装
在NVIDIA官网下载cudnn v5.0 for cuda8.0rc:cudnn-8.0-linux-x64-v5.0-ga.tgz
安装过程很简单,直接解压拷贝就可以了。得到的文件是 .h 和 .so 文件。所以,直接把他们拷贝到 /usr/local/cuda/include 和 /usr/local/cuda/lib64/ 下就好了。
tar xvzf cudnn-8.0-linux-x64-v5.0-ga.tgz
sudo cp cudnn.h /usr/local/cuda/include #复制头文件
sudo cp lib* /usr/local/cuda/lib64 #复制动态链接库,lib.*等同与*.*等同于libcudnn.*
建立软链接
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件
sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5 #生成软衔接
sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接
sudo ldconfig #更新链接库
四. BLAS的安装
BLAS,即基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序,是一个应用程序接口的标准。caffe官网上推荐了三种实现:ATLAS, MKL, or OpenBLAS。其中atlas可以直接通过命令行安装.在此,采用intel的MKL库。intel官网下载MKL ,该链接进入后,申请学生版本的Parallel Studio XE Cluster Edition,这里注册要学校的邮箱拿去注册,然后邮箱会收到一封里面含有license的邮件,license在安装时会用到。文件比较大,下载完成后切换进文件所在目录解压缩该文件。
cd ~/Downloads/
tar zxvf parallel_studio_xe_2017.tgz #解压下载文件
chmod 777 parallel_studio_xe_2017 -R #获取文件权限
cd parallel_studio_xe_2017/
sudo ./install_GUI.sh
安装完成后需要添加library路径, 创建/etc/ld.so.conf.d/intel_mkl.conf文件, 在文件中添加内容
sudo gedit /etc/ld.so.conf.d/intel_mkl.conf
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
sudo ldconfig
五. OpenCV3.1.0的安装
这里问题会比较多,要注意
首先安装一些必要的依赖库:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
下载OpenCV3.1.0并解压缩,然后进入解压缩后的文件,创建build文件。
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
期间可能会卡在ippcv的下载中,Ctrl + c中断后,可以到 ippicv_linux_20151201.tgz 下载。将下载的文件替换掉 opencv-3.1.0/3rdparty/ippicv/downloads/linux-8b449a536a2157bcad08a2b9f266828b下的同名文件。
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4 #四核运算
sudo make install
但是make到82%出现错误,graphcuts.cpp文件中许多变量没有声明,google之后发现是因为opencv3.1还不支持cuda8.0,但是有个同学已经对其进行修改。
请参考:https://github.com/opencv/opencv/pull/6510/commits/10896129b39655e19e4e7c529153cb5c2191a1db
六. Matlab的安装
在网盘上下载安装包及Crack破解文件之后 matlab2014 ,解压两个压缩文件(最后一步解压时也会将part2一起合并解压):
cd matlab2014/
unrar x MATHWORKS_R2014A.part1.rar
然后在命令行cd进入matlab2014目录,输入:
sudo ./install
1、选择“不联网安装”:“Use a File Installation Key”;
2、当出现密钥时,输入20个数字12345-67890-12345-67890即可;
3、安装路径默认为:/usr/local/MATLAB/R2014a,然后选择自己需要安装的工具(默认全选);符号链接也为默认:/usr/local/bin。
4、需要激活时选择不要联网激活”Activate manually without the Internet”,运用Crack目录下的“license_405329_R2014a.lic”文件作为激活文件。
5、安装完成之后,还要将Crack/linux目录下的libmwservices.so文件拷贝到/usr/local/MATLAB/R2014a/bin/glnxa64,即:
cd ~/matlab2014/Crack/Linux/
sudo cp libmwservices.so /usr/local/MATLAB/R2014a/bin/glnxa64/
为了避免每次都用root权限打开matlab,通过’sudo chown automan -R matlab’改变权限。(取消此操作)
~/.bashrc中添加 export PATH=/usr/local/MATLAB/R2014a/bin:$PATH最终直接在终端输入’matlab’就可以打开Matlab了,至此完成了Matlab在Ubuntu下的安装和破解。
七. anaconda的安装
(后面没用到,可跳过)
选择的是anaconda linux64 2.7版本python2.7 。下载完成之后,最好也要进行md5sum的检验。完成之后,cd进入下载文件所在的目录
bash Anaconda2-4.2.0-Linux-x86_64.sh
安装完成之后,在~/.bashrc文件末尾添加Anaconda的库文件(注意“=”两边不要有空格)
PS: 之后
sudo gedit ~/.bashrc
export PATH="/home/automan/anaconda2/bin:$PATH"
export LD_LIBRARY_PATH="/home/automan/anaconda2/lib:$LD_LIBRARY_PATH"
source ~/.bashrc
重启电脑之后,在命令行输入:ipython,即可看到python的版本。
八. caffe及相关依赖的安装
(1)首先安装各种依赖
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential cmake git pkg-config
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install -y libatlas-base-dev
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install -y python-pip
sudo apt-get install -y python-dev
sudo apt-get install -y python-numpy python-scipy
sudo apt-get install -y libopencv-dev
(2)下载caffe,并安装配置
cd ~
git clone https://github.com/BVLC/caffe.git
cd caffe //打开到刚刚git下来的caffe
cp Makefile.config.example Makefile.config //make指令只能make Makefile.config
sudo gedit Makefile.config //打开Makefile.config文件
(3)修改配置。此时不建议增加MATLAB,Python接口,仅做如下操作
1)USE_OPENCV,USE_LEVELDB,USE_LMDB三项取消注释,且0改成1,改为如下
# uncomment to disable IO dependencies and corresponding data layers
USE_OPENCV := 1
USE_LEVELDB := 1
USE_LMDB := 1
2) OPENCV_VERSION := 3 #取消注释符号#,应用opencv3
USE_CUDNN := 1 #取消该句注释
BLAS := mkl
MATLAB_DIR := /usr/local/MATLAB/R2014a
WITH_PYTHON_LAYER := 1 #取消注释
3)
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/i386-linux-gnu/hdf5/serial
4)
打开makefile文件,
将
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
(4)然后编译 make all -j4
下面错误可能会出现
(1).build_release/lib/libcaffe.so: undefined reference to ‘google::protobuf::io::CodedOutputStream::WriteVarint64ToArray(unsigned long long, unsigned char*)’
原因:apt-get install 的安装命令导致安装的protobuf
的gcc编译器版本低,所以需要卸载当前的libprotobuf-dev 和protobuf-compiler,重新安装protobuf-2.5.0.
1.卸载当前libprotobuf-dev 和protobuf-compiler
sudo apt-get autoremove libprotobuf-dev protobuf-compiler
2.重新让系统恢复默认的gcc-5
cd /usr/bin
sudo rm gcc
sudo ln -s gcc-5 gcc
sudo rm g++
sudo ln -s g++-5 g++
3.protobuf-2.5.0安装
下载protobuf-2.5.0,下载地址:http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
安装过程参考:http://blog.csdn.net/hjimce/article/details/51999566
我的有点不同的地方是:路径不同,安装完操作如下
sudo gedit /etc/profile
export PATH=$PATH:/usr/local/bin/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
source /etc/profile
sudo gedit /etc/ld.so.conf
/usr/local/lib
sudo ldconfig
安装完后,测试protoc –version
(2)fatal error: caffe/proto/caffe.pb.h: No such file or directory
重新链接CUDNN
(3)undefined reference to `leveld 这时需重新安装leveldb
首先可以从https://github.com/google/leveldb.git下载leveldb,然后cd到leveldb目录中,执行make。过一会,就可以在目录下看到静态链接库libleveldb.a和动态链接库libleveldb.so.1.19. 如果不用动态链接库的话,安装已经完成了。但是如果要用动态链接库,则还需要把头文件以及动态链接库拷贝到系统路径里面,具体如下:
把include/leveldb目录拷贝到/usr/include
sudo cp -r include/leveldb /usr/include
把动态链接库文件拷贝到/usr/lib下,再按当前目录下的形式,创建两个软连接。
cd out-shared
sudo cp libleveldb.so.1.18 /usr/lib
cd /usr/lib
sudo ln -s libleveldb.so.1.18 libleveldb.so.1
sudo ln -s libleveldb.so.1 libleveldb.so
ldconfig
最后要执行ldconfig命令,将动态链接库加到缓存中,这样系统才能真正使用这个动态链接库。
(4)/usr/bin/ld: cannot find -lcudnn
collect2: error: ld returned 1 exit status
make: * [.build_release/lib/libcaffe.so] Error 1
解决方法很简单,只要赋予 others 可读(写)权限即可:
sudo chmod 755 libcudnn.so.X.Y.ZZ
如果编译没有问题,可进行
make test -j4
make runtest -j4
此时当提示CPU错误时,如下
[ FAILED ] AdamSolverTest/0.TestSnapshotShare, where TypeParam = caffe::CPUDevice
如果使用了Intel MKL作为BLAS,可能是Intel MKL的浮点数计算功能没有设置正确。使用如下命令:
export MKL_CBWR=AUTO
然后重新make runtest
若使用第二步中的命令完全不起作用时,建议使用Atlas替换Intel MKL。
重新编译make runtest即可。
(5)接下来编译matcaffe ,pycaffe
笔者发现,当gcc,g++版本由5.4降到4.7时,caffe的编译会出错,显示protobuf和leveldb有问题,当版本升回5.4,编译成功。在编译caffe的时候,make all一定要在高版本的gcc下
之前cuda8.0最高支持5.3时,建议改文件,不要降版本,否则caffe编译会失败。
虽然MATLAB2014a支持gcc的最高版本为4.7x,但是在caffe目录下make matcaffe,用gcc-5也成功编译!然后make mattest
报错
undefined symbol:
_ZNK6google8protobuf7MessageGETxxxxxx(后面的信息不记得了)
在终端输入:
ldd ~/work/caffe/matlab/+caffe/private/caffe_.mexa64
在matlab窗口输入:
!ldd ~/work/caffe/matlab/+caffe/private/caffe_.mexa64
查看matlab的依赖库和caffe的不同之处,发现是libprotobuf.so.8存在问题。
然后关闭MATLAB,在终端输入
sudo rm -f /usr/local/MATLAB/R2014a/bin/glnxa64/libprotobuf.so.8
sudo ln -sf /usr/local/lib/libprotobuf.so.8 /usr/local/MATLAB/R2014a/bin/glnxa64/libprotobuf.so.8
再次make mattest, 成功~
更多matcaffe的bug参见(http://blog.csdn.net/sinat_29089097/article/details/52702246)
接下来make pycaffe,成功
然后打开Python,import caffe报错,在~/.bashrc 加上
export PYTHONPATH=/home/automan/work/caffe/python:$PYTHONPATH
再次import ,成功。