caffe环境配置2
参考链接:
http://blog.csdn.net/enjoyyl/article/details/47397505
http://blog.csdn.net/baobei0112/article/details/77996369
写在前面:安装caffe的过程中一定要把caffe+cuda+cudnn+opencv以及linum的版本对应好,或者完全按照一个好用的教程操作,否则很容易出问题,博客里内容基本与http://blog.csdn.net/enjoyyl/article/details/47397505相同,我与其有不同的地方在括号(){}中标出。
历时一周终于在 ubuntu16.04 系统成功安装 caffe 并编译,网上有很多教程,但是某些步骤并没有讲解详尽,导致配置过程总是出现各种各样匪夷所思的问题,尤其对于新手而言更是欲哭无泪,在我饱受折磨后决定把安装步骤记录下来,尽量详尽清楚明白,避免后来小白重蹈覆辙。
安装硬件: intel i5 + NVIDIA 740 M
安装流程细分为如下10个步骤,细化步骤粒度更易避免出错:
.检查你的电脑是否支持CUDA:
检查GPU是否支持:输入如下命令,如果输出的GPU型号是NVIDIA的,并且在此http://developer.nvidia.com/cuda-gpus列表内,则支持。
lspci | grep -i nvidia
1、安装依赖包
2、禁用 nouveau
3、配置环境变量
4、下载 CUDA 8.0
5、安装 CUDA 8.0
6、验证 CUDA 8.0 是否安装成功
7、安装 cudnn
8、安装 opencv3.1
9、安装 caffe
10、安装 pycaffe notebook 接口环境
第1步 安装依赖包
安装后续步骤或环境必需的依赖包,依次输入以下命令:
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git cmake build-essential
有一定几率安装失败而导致后续步骤出现问题,所以要确保以上依赖包都已安装成功,验证方法就是重新运行安装命令,如验证 git cmake build-essential是否安装成功共则再次运行以下命令:
sudo apt-get install git cmake build-essential
界面提示如下则说明已成功安装依赖包,否则继续安装直到安装成功。
yhao@yhao-X550VB:~$ sudo apt-get install git cmake build-essential
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
build-essential 已经是最新版 (12.1ubuntu2)。
cmake 已经是最新版 (3.5.1-1ubuntu3)。
git 已经是最新版 (1:2.7.4-0ubuntu1.1)。
下列软件包是自动安装的并且现在不需要了:
lib32gcc1 libc6-i386
使用'sudo apt autoremove'来卸载它(它们)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 94 个软件包未被升级。
第2步 禁用 nouveau
安装好依赖包后需要禁用 nouveau,只有在禁用掉 nouveau 后才能顺利安装 NVIDIA 显卡驱动,禁用方法就是在 /etc/modprobe.d/blacklist-nouveau.conf 文件中添加一条禁用命令,首先需要打开该文件,通过以下命令打开:
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
打开后发现该文件中没有任何内容,写入:
blacklist nouveau option nouveau modeset=0
保存时命令窗口可能会出现以下提示:
** (gedit:4243): WARNING **: Set document metadata failed: 不支持设置属性 metadata::gedit-position
无视此提示~,保存后关闭文件,注意此时还需执行以下命令使禁用 nouveau 真正生效:
sudo update-initramfs -u
第3步 配置环境变量
同样使用 gedit 命令打开配置文件:
sudo gedit ~/.bashrc
打开后在文件最后加入以下两行内容:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
保存退出。
第4步 下载 CUDA 8.0
注:cuda的安装参照的http://blog.csdn.net/enjoyyl/article/details/47397505,但是安装的版本时8.0.61,采用deb安装,而不是runfile的方式。官网中没有8.0,可到这个链接中下载http://blog.csdn.net/qing101hua/article/details/74457109
进入 https://developer.nvidia.com/cuda-downloads ,依次选择 CUDA 类型然后下载即可。
第5步 安装 CUDA 8.0
(以下都统一换成8.0)
CUDA-7.0在Linux下的安装步骤参见官网手册:CUDA_Getting_Started_Linux,其中提及了“.run”、“.deb”等安装文件的安装方法,本人选择”deb”包的格式,因为它比较简单。
0.检查你的电脑是否支持CUDA:
检查GPU是否支持:输入如下命令,如果输出的GPU型号是NVIDIA的,并且在此http://developer.nvidia.com/cuda-gpus列表内,则支持。
lspci | grep -i nvidia
1.下载安装文件:可以直接访问上面给出的官网链接下载,也可以在终端窗口输入如下命令下载。(最好使用百度云下载,官网下载十分容易断掉)
# downloading the (currently) most recent version of CUDA 7
sudo wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0.28_amd64.deb
2.安装依赖工具:需要连网。
# installation of required tools
sudo apt-get install -y gcc g++ gfortran build-essential \
git wget linux-image-generic libopenblas-dev python-dev \
python-pip python-nose python-numpy python-scipy
3.安装CUDA:
# installing CUDA
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_7.0-28_amd64.deb
sudo apt-get update
sudo apt-get install cuda
4.设置环境变量:
注意:此环境变量为64位系统下的,32位的把lib64
改成lib
即可。
方式1,仅修改用户变量
# setting the environment variables so CUDA will be found
echo "\nexport PATH=/usr/local/cuda-8.0/bin:$PATH" >> ~/.bashrc
echo "\nexport LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
方式2,修改所有用户变量
先使用sudo gedit /etc/profile
打开“profile”文件,或者sudo gedit ~/.bashrc
打开“./bashrc”文件,然后在打开的文件的末尾添加如下代码并保存:
# setting the environment variables so CUDA will be found
# After open profile, Add follow code at the end of file
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
5.加载新的环境变量:添加好环境变量后,需要加载新的环境变量,才能应用于系统。
加载更新环境变量source ~/.bashrc
(方式1),source /etc/profile
或source ~/.bashrc
(方式2)。
=====重启系统!重启系统!重启系统!=======
sudo reboot
第6步 验证 CUDA 8.0 是否安装成功
安装samples并检查CPU:samples被默认安装在/home/liu
下:
# installing the samples and checking the GPU
cuda-install-samples-8.0.sh ~/
cd NVIDIA_CUDA-8.0_Samples/1_Utilities/deviceQuery
make
./deviceQuery
执行完./deviceQuery
命令,终端输出如下类似信息,有GPU型号、驱动版本和运行版本、计算能力……诸多信息:
至此CUDA安装成功。
第7步 安装 cudnn
登录官网:https://developer.nvidia.com/rdp/cudnn-download ,下载对应 cuda 版本且 linux 系统的 cudnn 压缩包,注意官网下载 cudnn 需要注册帐号并登录,不想注册的可从我的网盘下载:https://pan.baidu.com/s/1c2xPVzy
下载完成后解压,得到一个 cudn 文件夹,该文件夹下include 和 lib64 两个文件夹,命令行进入 cudn/include 路径下,然后进行以下操作:
sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件
然后命令行进入 cudn/lib64 路径下,运行以下命令:
sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库
cd /usr/local/cuda/lib64/ sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件(这是两条命令)
sudo ln -s libcudnn.so.5.1.10 libcudnn.so.5 #生成软衔接
sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接
这里需要注意第三行命令,网上有人的第三行命令为(这个根据自己电脑中的来,原作者的时5.1.5,我的是libcudnn.so.7.0.3):
sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成软衔接
起初我执行的也是上条链接 libcudnn.so.5.1.5 的命令,但是后面编译caffe时出错,报错内容为 /usr/bin/ld: 找不到 -lcudnn,所以这里需要先查看一下自己应该链接的是 libcudnn.so.5.1.10 还是 libcudnn.so.5.1.5 ,查看方法为下:
locate libcudnn.so
我执行完后显示如下:
yhao@yhao-X550VB:~$ locate libcudnn.so
/home/yhao/.local/share/Trash/files/libcudnn.so
/home/yhao/.local/share/Trash/files/libcudnn.so.5
/home/yhao/.local/share/Trash/files/libcudnn.so.5.1.10
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5.1.10
/home/yhao/.local/share/Trash/info/libcudnn.so.5.1.10.trashinfo
/home/yhao/.local/share/Trash/info/libcudnn.so.5.trashinfo
/home/yhao/.local/share/Trash/info/libcudnn.so.trashinfo
/home/yhao/cuda/lib64/libcudnn.so
/home/yhao/cuda/lib64/libcudnn.so.5
/home/yhao/cuda/lib64/libcudnn.so.5.1.10
/usr/local/lib/libcudnn.so
/usr/local/lib/libcudnn.so.5
可以看到我的文件是 libcudnn.so.5.1.10 ,并没有 libcudnn.so.5.1.5,所以第三行命令我链接的是 libcudnn.so.5.1.10 ,这里第三行链接命令视你的查看结果而定。
安装完成后可用 nvcc -V 命令验证是否安装成功,若出现以下信息则表示安装成功:
yhao@yhao-X550VB:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
{
#此处经查看为libcudnn.so.7.0.3,所以改成7
报错/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
}
第8步 安装 opencv3.1
进入官网 : http://opencv.org/releases.html , 选择 3.1.0 版本的 source , 下载 opencv-3.1.0.zip (一定要注意opencv的版本)
解压到你要安装的位置,命令行进入已解压的文件夹 opencv-3.1.0 目录下,执行:
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 #编译
在执行 make -j8 命令编译到 92% 时可能会出现以下错误:
modules/cudalegacy/src/graphcuts.cpp:120:54: error:
‘NppiGraphcutState’ has not been declared
typedef NppStatus (*init_func_t)(NppiSize oSize,
NppiGraphcutState** ppState, Npp8u* pDeviceMem);
这是由于opecv3.1与cuda8.0不兼容导致的。解决办法:
修改 /opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp 文件内容,如图:
编译成功后安装:
sudo make install #安装
安装完成后通过查看 opencv 版本验证是否安装成功:
pkg-config --modversion opencv
(报错,17%时 使用cmake -D CMAKE_BUILD_TYPE=bulid -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..)
第9步 安装 caffe
首先在你要安装的路径下 clone :
git clone https://github.com/BVLC/caffe.git
进入 caffe ,将 Makefile.config.example 文件复制一份并更名为 Makefile.config ,也可以在 caffe 目录下直接调用以下命令完成复制操作 :
sudo cp Makefile.config.example Makefile.config
复制一份的原因是编译 caffe 时需要的是 Makefile.config 文件,而Makefile.config.example 只是caffe 给出的配置文件例子,不能用来编译 caffe。
然后修改 Makefile.config 文件,在 caffe 目录下打开该文件:
sudo gedit Makefile.config
修改 Makefile.config 文件内容:
1.应用 cudnn
将
#USE_CUDNN := 1
修改成:
USE_CUDNN := 1
2.应用 opencv 版本
将
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
3.使用 python 接口
将
#WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
4.修改 python 路径
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
这里贴出 我的Makefile.config文件 方便大家参考
然后修改 caffe 目录下的 Makefile 文件:
将:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
将:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
改为:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
然后修改 /usr/local/cuda/include/host_config.h 文件 (这个文件中没有找到对应的代码,不过好像关系不大):
将
#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
改为
//#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
OK ,可以开始编译了,在 caffe 目录下执行 :
make all -j8
这是如果之前的配置或安装出错,那么编译就会出现各种各样的问题,所以前面的步骤一定要细心。(特别是版本不对应的情况下,会有各种各样的错误)
编译成功后可运行测试:
sudo make runtest -j8
如果显示结果为上图所示,则表示 caffe 已经成功安装。
{
报错nvcc fatal : Unsupported gpu architecture 'compute_20'
注释掉Makefile.conf中的四个行
报错.build_release/tools/caffe: error while loading shared libraries: libopencv_core.so.3.1: cannot open shared object file: No such file or directory
根据http://blog.csdn.net/gph2319/article/details/56497740
找到http://blog.csdn.net/sahusoft/article/details/7388617,然后搜索发现libopencv_core.so.3.1这个文件是在/usr/local/lib中,符合链接中的情况,按照连接中说的执行
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
但是又出现了拒绝访问的问题 bash: /etc/ld.so.conf: Permission denied 。然后再次搜索,根据这个连接中http://blog.csdn.net/yunyi4367/article/details/78070928所说,执行sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf" ,ok
}
安装DIGITS
1.解压文件:终于可以安装DIGITS了,解压下载好的DIGITS-master.zip文件生成“DIGITS-master”文件夹,将其重命名为“digits”,并copy到你的目录yourpath,如/home/liu/sfw下面。
2.安装DIGITS:命令如下,注意修改路径。
cd /home/liu/sfw/digits
sudo apt-get install graphviz gunicorn
for req in $(cat requirements.txt); do sudo pip install $req; done
如果网络不好,或软件源服务关闭等等可能造成某些依赖库无法下载和安装,终端会有大片红色文字,请更改软件源确认网络连接正常,重新执行上述命令。
启动DIGITS
进入digits文件夹,给文件“./digits-devserver”赋予可执行权限,然后./digits-devserver
运行digits:
cd ~/sfw/digits
chmod +x ./digits-devserver
./digits-devserver
第一次运行会提示输入caffe的安装路径:
运行时可能会提示启动失败:$ImportError: /usr/lib/liblapack.so.3: undefined symbol: ATL_chemv
在stackoverflow找到了原因及解决方法,命令如下:
sudo apt-get remove libopenblas-base
然后在终端输入./digits-devserver
,即可成功启动:
久违的界面终于出来了:
{
与上边不同的是,我启动的时候没有要求输入路径,而是出现了这样的错误
搜到: https://github.com/NVIDIA/DIGITS/issues/1107
的解决方案:
# Check the current value of your envvar
#检查当前envvar的值
$ echo $CAFFE_ROOT
# Add the envvar to ~/.profile so it will load automatically when you login
#把envvar加到~/.profile中,下次当你登录时会自动加载
$ echo "export CAFFE_ROOT=/home/username(我的账户名)/caffe/" >> ~/.profile
# Load the new configuration
#加载新配置
$ source ~/.profile
# Check the new envvar value
#检查新配置
$ echo $CAFFE_ROOT
/home/username/caffe/
按上面的方法改了之后,digits顺利启动。
可惜发现这个方法并不治本,重启软件时仍然需要配置目录,或者首先运行一下 $ source ~/.profile
暂时问题不大,有待解决
}
配置DIGITS
上述步骤,是按默认配置启动digits,如果你想自定义配置,可以在启动前输入:
Most values are set silently by default. If you need more control over your configuration, try one of these commands:
# Set more options before starting the server
./digits-devserver --config
# Advanced usage
python -m digits.config.edit --verbose
使用DIGITS
digits官方自带例子(MNIST)
参见GettingStarted或源码包中的“GettingStarted.md”文件。
下载MNIST数据集
DIGITS提供了下载数据集MNIST和CIFAR的工具,在/digits/tools/download_data
目录下,包含如下文件:
(此处有所不同的是,下载数据集MNIST和CIFAR的工具是在/digits/download_data目录下,当然该目录下还有其他数据集的下载工具
)
执行其中的main.py程序即可(在我安装的版本中,该目录下的文件有所不同):
主要代码如下:
#首次使用赋予执行权限
chmod +x *.py
#查看帮助
./main.py -h
#创建一个目录用于存放MNIST数据集
mkdir -p /home/liu/sfw/digits/data/mnist
#下载数据集至上述目录
./main.py -c mnist ~/sfw/digits/data/mnist
执行后,可以在/digits/data/mnist
目录下看到下载好的数据集,如下图:
{
注,使用上述命令下载时总是报错,错误如下,暂时没有找到办法解决这个问题,换了另一个命令,不明白原理,不过庆幸好用
}
在DIGITS server上创建数据集
这里按照“GettingStarted.md”文件中所述,创建数据集为分类数据集:在digits server首页的DataSets区域点击Images,选择Classfication,在弹出的窗口填写训练数据集信息,这里为60000个样本(“GettingStarted.md”里的例子样本数为10k),信息见下图(图中digits版本与我的稍有不同,可以参考http://www.linuxidc.com/Linux/2016-11/136774p21.htm以及后续页面,这是一个教程,可以学习一下http://www.linuxidc.com/Linux/2016-11/136774p22.htm):
数据集创建过程:
点击左上角的“DIGITS”返回查看创建好的MNIST train 60k数据集:
在DIGITS server上创建深度网络模型并训练
如上图,在Models区域点击Images,选择Classfication。在弹出的页面填写信息,数据集选择:MNIST train 60k,模型命名为:LeNet on MNIST 60k,如下图:
点击蓝色按钮“Create”后,任务即开始执行!
一个小问题(Caffe&cuDNN)
原以为可以兴奋地看到结果,然而失望了,报出了错误:
ERROR: Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_ARCH_MISMATCH
- 1
如下图:
其实,在安装Caffe时,当运行make runtest
时就有个小问题,报出了“Check failure”,不过让我直接忽略了,没想到又回来了,哈哈。
这是因为笔记本上的GT635M的计算能力CUDA Capability是2.1,而官方的cuDNN加速是不支持3.0以下的版本的,因此只能在Makefile.config中注释掉USE_CUDNN这行,重新执行以下编译2。
make clean
make all -j4
make test -j4
make runtest -j4
注:访问CUDA GPUs查看GPU的计算能力,在页面选择GPU的型号,如Geforce GT 635M,如下图:
{
在这一步中出现了同样的问题,但是我的GPU是GeForce GT 650M,是支持3.0的,有可能是显卡驱动版本过高的原因,可以考虑去http://www.nvidia.cn/Download/index.aspx?lang=cn 下载合适的驱动,
暂时还没有操作,先在Makefile.config中注释掉USE_CUDNN这行试试
}
编译完成后,删除之前建的LetNet on MNIST 60k任务,然后仿造上述步骤,重新新建一个任务,执行后,如下图:
运行过程,网络的训练状态,GPU的状态等信息会实时显示:
学习率与训练代数关系
使用DIGITS server 进行分类操作(MNIST)
训练结束后,可以对手写体数字图像进行分类,可以对单个图像分类,也可以同时分类多幅图像,这里以上述步骤中生成的“MNIST train 60k”数据集中的验证集为例。
在“Upload Image List”区域点击选择文件
按钮,选择验证集的 list文件val.txt:
选择好后,点击Classify Many Images
按钮,即可对多幅图像分类,这时,界面上没有显示进度,在终端中显示,如下图:
对所选图像分类完成后,弹出分类结果页面:
可视化分类结果:
结语
本文记录了本人安装配置NVIDIA DIGITS步骤与方法,软件环境为Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0 + DIGITS 2.0。并以DIGITS自述文件中的例子为例,简单介绍了DIGITS的用法。
可见,DIGITS的源码安装方式还是有一定难度,特别是对Linux不熟悉的使用者。DIGITS的使用很方便,只需进行简单的点击操作,即可完成数据集创建、网络模型创建、网络训练、网络训练状态的实时显示、用训练好的网络进行图像分类等任务,使得不熟悉深度学习的人员也可以在深度学习的大海中轻而易举地航行,这正式DIGITS的设计目的所在。
DIGITS除了支持Caffe,还支持Theano,本文并未介绍Theano,不过会陆续补充,关于Theano的一些信息,也可以在本人的其它博客里找到。