Deepin(Linux)下安装caffe
前言
最近想要在linux下使用caffe,一开始使用的ubuntu下载Nvidia显卡驱动太慢放弃了,所以选择了国产的linux开发版Deepin,使用Deepin的镜像源下载相对较快。但是由于caffe依赖的版本问题,在caffe编译过程中会出现各种各样的问题,笔者在前人的基础上进行安装,并对一些linux命令进行学习和理解。
环境
- 系统:Deepin15.5
- CPU:Core i7-4710MQ四核处理器
- 显卡:Nvidia GTX860M
- CUDA-8.0
- cudnn-5.1.10
- Python-3.5
- OpenCV-3.3.1
安装步骤
安装cuda
CUDA(Compute Unified Device Architecture),是英伟达公司推出的一种基于新的并行编程模型和指令集架构的通用计算架构,它能利用英伟达GPU的并行计算引擎,比CPU更高效的解决许多复杂计算任务。
NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如加州大学伯克利分校的流行CAFFE软件。
安装nvidia-bumblebee
sudo apt update
sudo apt install bumblebee bumblebee-nvidia nvidia-smi
nvidia-bumblebee
可以实现双显卡切换,平时只使用核显,需要运行独显时在前面加上optirun
即可。
参考Bumblebee (简体中文)
nvidia-smi
用来查看GPU使用情况。
参考CUDA之nvidia-smi命令详解
重启并测试
sudo reboot
重启后分别运行
nvidia-smi
optirun nvidia-smi
可以看到,当使用optirun
时,独显才会启用。
最后,打开Nvidia设置面板
optirun -b none nvidia-settings -c :8
跳出面板,测试bumblebee成功,可以使用man optirun
查看更多命令。
g++,gcc降级
由于cuda8之前都只支持g++-4.8,gcc-4.8,所以需要降级。
sudo apt install g++-4.8 gcc-4.8
cd /usr/bin
sudo rm gcc g++
# 更改软连接
sudo ln -s g++-4.8 g++
sudo ln -s gcc-4.8 gcc
ln
是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln
命令链接(link)它就可以,不必重复的占用磁盘空间。
下载开发工具
sudo apt install nvidia-cuda-dev nvidia-cuda-toolkit nvidia-nsight nvidia-visual-profiler
安装cudnn
可以选择从官网上下载cudnn各种版本,但需要注册,也可以运行命令下载5.1.10版本
CUDNN_URL="http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz"
wget ${CUDNN_URL}
解压后
cd cuda/include
sudo cp *.h /usr/include #apt安装cuda在/usr目录下
cd cuda/lib64
sudo cp libcudnn.so.5.1.10 /usr/lib
sudo cp libcudnn_static.a /usr/lib
sudo ln -s /usr/libcudnn.so.5.1.10 /usr/libcudnn.so.5
sudo ln -s /usr/libcudnn.so.5 /usr/libcudnn.so
sudo ldconfig
ldconfig
是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig
。ldconfig
命令的用途,主要是在默认搜寻目录(/lib
和/usr/lib
)以及动态库配置文件/etc/ld.so.conf
内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*
),进而创建出动态装入程序(ld.so
)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache
,此文件保存已排好序的动态链接库名字列表。
安装opencv
下载opencv
sudo apt install git
git clone https://github.com/opencv/opencv.git
安装cmake
sudo apt install cmake cmake-gui
安装库
sudo apt install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
编译安装
- 运行cmake-gui,添加
code
和build
(可能需要新建)路径 - 点击Configure,检查环境配置
- 成功后修改
CMAKE_BUILD_TYPE
为Release
,选中WITH-OPENGL
- 点击Generate,生成Makefile
- 在build路径下运行命令
# -j8指使用8线程,根据CPU线程数做相应修改
sudo make -j8
sudo make install
sudo ldconfig
学习
make
命令参考Make 命令教程
测试
python
import cv2
无报错则成功。
更改python版本(使用2.7版本则忽略)
Deepin默认使用python2.7版本,可以使用update-alternatives
切换版本。
# 添加Python2可选项,优先级为2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
# 添加Python3可选项,优先级为1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1
sudo update-alternatives --config python
输入2选择python3.5。
# 查看版本
python --version
安装caffe
由于有些依赖采用比gcc/g++4.8.5更新的编译器编译,有不兼容部分,后续的caffe编译中会出现找不到对应函数的情况,部分需要手动安装。
apt安装依赖
sudo apt install libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt install --no-install-recommends libboost-all-dev
sudo apt install libatlas-base-dev liblmdb-dev
- snappy是一个 C++ 的用来压缩和解压缩的开发包。
- hdf(Hierarchical Data File)是美国国家高级计算应用中心(National Center for Supercomputing Application,NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式 。HDF可以表示出科学数据存储和分布的许多必要条件。新一代的HDF5是由NCSA于1998年发布。
- boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。
- 矩阵运算库blas, cblas, openblas, atlas, lapack, mkl之间有什么关系,在性能上区别大吗?
- LMDB是Caffe中应用的一种数据库,我们常常需要对LMDB进行读写操作。引自Caffe教程系列之LMDB
安装leveldb
# 下载
git clone https://github.com/google/leveldb.git
# 编译
cd leveldb/
make -j8
# 安装
sudo cp -r leveldb/include/leveldb/ /usr/include/
sudo cp leveldb/out-shared/libleveldb.so.1.20 /usr/lib/
sudo ln -s /usr/lib/libleveldb.so.1.20 /usr/lib/libleveldb.so.1
sudo ln -s /usr/lib/libleveldb.so.1 /usr/lib/libleveldb.so
sudo ldconfig
# 测试
ls /usr/lib/libleveldb.so*
# 显示下面 3 个文件即安装成功
/usr/lib/libleveldb.so.1.20
/usr/lib/libleveldb.so.1
/usr/lib/libleveldb.so
leveldb是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。>>>LevelDB详解
安装protobuf2.5.0
# 下载
git clone https://github.com/google/protobuf.git
# 切换版本2.5.0
cd protobuf/
git checkout v2.5.0
# 下载依赖gtest 1.5
git clone https://github.com/kgcd/gtest.git
# 编译
./autogen.sh
./configure --prefix=/usr/
make -j8
make check -j8
# 安装
sudo make install
sudo ldconfig
# 查看版本
protoc --version
protobuf(protocol buffer)是google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一proto文件被编译成不同的语言版本,加入到各自的工程中去。这样不同语言就可以解析其他语言通过protobuf序列化的数据。
安装gflags
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build
cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make -j8
sudo make install
gflags是google的一个开源的解析命令行参数的库,使用c++开发,具备python接口,可以替代getopt。>>>Google gflags使用说明
安装glog
git clone https://github.com/google/glog.git
cd glog
./autogen.sh
./configure
make
sudo make install
glog 是google的一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种助手宏。>>>google-glog 日志库使用手记
安装caffe
# 下载caffe
git clone https://github.com/BVLC/caffe.git
# 打开配置文件
cp Makefile.config.example Makefile.config
gedit Makefile.config
修改Makefile.config
相应配置为
USE_CUDNN := 1
OPENCV_VERSION := 3
WITH_PYTHON_LAYER := 1
# CUDA_DIR := /usr/local/cuda
CUDA_DIR := /usr
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/include /usr/include/leveldb /usr/local/include/gflags /usr/include/google/protobuf
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr /usr/lib/x86_64-linux-gnu/hdf5/serial
如果使用python3.5
修改Makefile.config
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m \
/usr/lib/python3.5/dist-packages/numpy/core/include
添加软链接,否则编译时将出现找不到boost_python3
的问题issues/4843
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python3.so
如果你懒得修改可以直接下载配置好的Makefile.config
>>>点击下载
修改Makefile
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
编译
make all -j8
make test -j8
测试
以最简单的MNIST手写体数据集做一个简单测测试
# 下载MNIST数据
data/mnist/get_mnist.sh
# 数据格式转换
optirun examples/mnist/create_mnist.sh
# 训练LeNet-5超参数(hyperparameters)
optirun examples/mnist/train_lenet.sh
# 测试集上做预测测试
optirun build/tools/caffe.bin test \
-model examples/mnist/lenet_train_test.prototxt \
-weights examples/mnist/lenet_iter_10000.caffemodel \
-iterations 100
总结
虽然网上有教程一步一步做,但是教程难免有错误,而且如果想要按自己意愿配置,很容易出现问题。笔者一开始想要偷懒,使用了anoconda装python和opencv,但是编译caffe的时候出现各种错误,踩了不少坑也没成功,所以还是安安稳稳按照最基本操作来吧!
相关博文:
2
2
上一篇: 数据结构之链表的实现
下一篇: Web 前端学习 之iframe详解