Deepin(Linux)下安装caffe

前言

最近想要在linux下使用caffe,一开始使用的ubuntu下载Nvidia显卡驱动太慢放弃了,所以选择了国产的linux开发版Deepin,使用Deepin的镜像源下载相对较快。但是由于caffe依赖的版本问题,在caffe编译过程中会出现各种各样的问题,笔者在前人的基础上进行安装,并对一些linux命令进行学习和理解。

主要参考Deepin15.4.1安装Caffe
caffe官方文档

环境

  • 系统: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软件。

引用自CPU、GPU、CUDA,CuDNN 简介

安装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

nvidia-smi
可以看到,当使用optirun时,独显才会启用。

最后,打开Nvidia设置面板

optirun -b none nvidia-settings -c :8

跳出面板,测试bumblebee成功,可以使用man optirun查看更多命令。

g++,gcc降级

gcc和g++到底啥关系?

由于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)它就可以,不必重复的占用磁盘空间。

参考每天一个linux命令(35):ln 命令

下载开发工具

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/lib/libcudnn.so.5.1.10 /usr/lib/libcudnn.so.5
sudo ln -s /usr/lib/libcudnn.so.5 /usr/lib/libcudnn.so
sudo ldconfig

ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfigldconfig命令的用途,主要是在默认搜寻目录(/lib/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

引用自ubuntu学习–ldconfig

安装opencv

下载opencv

可以在官网上直接下载
点击下载
使用git可能会出点问题

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

编译安装

deepin_cmake

  • 运行cmake-gui,添加codebuild(可能需要新建)路径
  • 点击Configure,检查环境配置
  • 成功后修改CMAKE_BUILD_TYPERelease,选中WITH-OPENGL
  • 点击Generate,生成Makefile
  • 在build路径下运行命令
    # -j8指使用8线程,根据CPU线程数做相应修改
    sudo make -j8
    sudo make install
    sudo idconfig
    

学习make命令参考Make 命令教程

测试

python
import cv2

无报错则成功。

更改python版本(更改后会出现很多问题,暂时不用)

Deepin默认使用python2.7版本,可以使用update-alternatives切换版本。

参考Linux下切换Python2和Python3的4种方法

# 添加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

安装pycaffe

编译&安装依赖

cd caffe
# 编译
make pycaffe
cd python
# 安装pip
sudo apt install python-pip

接下来要安装python库,由于ipython6.0.0不支持python2.7需要修改requirements.txt

gedit requirements.txt

ipython>=3.0.0改为ipython==5.5.0
由于使用pip自带源下载比较慢,这里使用清华源

sudo pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

由于pip修改配置源不管用,关于pip修改源之后进行探索。

配置环境变量

由于笔者使用的终端是zsh,需要修改.zshrc。使用系统自带的bash修改.bashrc

gedit .zshrc

添加export PYTHONPATH=/home/ed/Desktop/caffe/python:$PYTHONPATH

测试

python
>>> import caffe

无报错则成功。

总结

虽然网上有教程一步一步做,但是教程难免有错误,而且如果想要按自己意愿配置,很容易出现问题。笔者一开始想要偷懒,使用了anoconda装python和opencv,但是编译caffe的时候出现各种错误,踩了不少坑也没成功,所以还是安安稳稳按照最基本操作来吧!

相关博文:

Windows caffe安装