Ubuntu16.04下安装编译Caffe

时间:2022-08-02 06:27:59

Step1: 安装需要的通用依赖

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

可以看到安装了下面这些库:

1. Google的protobuf,它其实和XML差不多,也就是把某种数据结构的信息以某种格式保存起来,主要用于数据存储,传输协议格式等场合。

2. LevelLDB也是Google实现的一个非常高效的单机kv数据库,目前已经能够支持billion级别的数据量了。具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,所以它很适合用在查询少而写很多的场景。

3. Snappy是一个C++写的用来压缩和解压缩的开发包,它的目标不是实现最大限度的压缩或者兼容其他的压缩格式,而是旨在提高高速压缩速度和合理的压缩率。Snappy是在Google内部被广泛使用,Google极力赞扬Snappy的各种优点,Snappy从一开始就被“设计为即便遇到损坏或者恶意的输入文件都不会崩溃”,而且被Google在生产环境中用于压缩PB级的数据。其健壮性和稳定程度可见一斑。

4. OpenCV,这个不多说了。

5. hdf5,就理解为一种文件格式吧。全称是Hierarchical Data Format,可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。

6. Boost,是一个C++库,是为C++语言标准库提供扩展的一些C++程序库的总称。


Step2:安装CUDA

CUDA是NVIDIA出的一个并行计算架构平台,主要是为了让现在性能越来越高的GPU也能进行运算,不然那么好的性能只是用来显示岂不是很浪费。所以我们现在用caffe做训练,很多都是直接在GPU上跑的,因为如果你是NVIDIA的显卡,那么肯定要先安装这个,不过好像要先查询一下你的电脑显卡是否被支持。传送门:CUDA GPUs


安装倒是很简单,而且我们安装了这个之后,还能顺带解决了显卡的驱动问题。Linux各个版本的系统这个显卡驱动一直是个很头疼的问题,稍不留神可能就得搞得重装系统。


首先在cuda官网下载安装包,我下载的是:cuda-repo-ubuntu1604.8.0_local_ga2_8.0.61-1_amd64.deb。然后打开Terminal,依次输入下面的命令安装就好了:

sudo dpkg -i cuda-repo-ubuntu1604.8.0_local_ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

上面的命令执行完之后,再输入下面的命令,设置一下环境变量:

export PATH=/usr/local/cuda-8.0/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

这个时候就安装成功了,重启一下电脑。右上角选择“About this computer”,查看一下:

Ubuntu16.04下安装编译Caffe

这样就是安装成功了。


Step3:安装CuDNN

CuDNN是专门针对Deep Learning框架设计的一套GPU计算加速方案,目前支持的DL库包括Caffe,ConvNet, Torch7等。安装很简单,其实就是执行一些拷贝操作,把头文件和库文件放到系统路径下面而已。

打开终端,输入下面的命令即可:

sudo cp cuda/include/cudnn.h /usr/local/cuda/include 
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*


Step4:安装BLAS

BLAS是一个线性代数程序库,里面有大量已经编写好的用于线性代数计算的程序。直接选择安装简单的ATLAS:

sudo apt-get install libatlas-base-dev

Step5:安装Python

很多开源库现在都是优先支持C++和Python,所以这个还是很有必要的。安装很简单,输入下面的命令:

sudo apt-get install python-dev

然后再安装一下系统所需要的一些额外依赖:

sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

Step6:make编译caffe

在Github的Caffe主页上先下载caffe-master压缩包下来。到下载目录打开终端,输入:

unzip caffe-master.zip
进行解压即可得到一个源代码的文件夹。我们进入caffe根目录,先修改一下配置文件:

cp Makefile.config.example Makefile.config


其实就是将Makefile.config.example拷贝了一份生成Makefile.config,这样之后才能make。然后打开Makefile.config进行修改,需要修改的地方有:

1. 如果你的电脑没有GPU,你只要使用CPU,那就将CPU_ONLY前面的注释取消掉。

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1
删除前面的#号即可。

如果要使用GPU,这里不做更改。此时需要更改的是将WITH_PYTHON_LAYER := 1前的注释去掉,方便使用Python调用即可。

# Uncomment to support layers written in Python (will link against Python libs)
WITH_PYTHON_LAYER := 1

很多教程下一步就直接开始编译了,但是别急,还有两个地方需要修改,这是hdf5留下的一个坑,

2. 找到INCLUDE_DIRS,改成下面这样:

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

其实就是给INCLUDE_DIRS在原来的基础上增加了/usr/include/hdf5/serial,给LIBRARY_DIRS在原来的基础上增加了/usr/lib/x86_64-linux-gnu和/usr/lib/x86_64-linux-gnu/hdf5/serial这两个目录。

如果不执行上面这一步操作,输入make命令编译最后会出现错误:

src/caffe/layers/hdf5_data_layer.cpp:13:18: fatal error: hdf5.h: No such file or directory
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/layers/hdf5_data_layer.o' failed
make: *** [.build_release/src/caffe/layers/hdf5_data_layer.o] Error 1
make: *** Waiting for unfinished jobs....

好了,现在修改完了,开始进行编译:

make all -j4

因为我的电脑CPU是4核的,所以采用了4这个参数。这一过程需要一段时间,耐心等待一下,编译完成是下面这样

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
CXX/LD -o .build_release/tools/caffe.bin
CXX/LD -o .build_release/tools/compute_image_mean.bin
CXX/LD -o .build_release/tools/convert_imageset.bin
CXX/LD -o .build_release/tools/device_query.bin
CXX/LD -o .build_release/tools/extract_features.bin
CXX/LD -o .build_release/tools/finetune_net.bin
CXX/LD -o .build_release/tools/net_speed_benchmark.bin
CXX/LD -o .build_release/tools/test_net.bin
CXX/LD -o .build_release/tools/train_net.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin

接着输入命令:

make test -j4

等待一会儿,出现如下结果:

LD .build_release/src/caffe/test/test_tanh_layer.o
LD .build_release/src/caffe/test/test_threshold_layer.o
LD .build_release/src/caffe/test/test_tile_layer.o
LD .build_release/src/caffe/test/test_upgrade_proto.o
LD .build_release/src/caffe/test/test_util_blas.o
LD .build_release/src/caffe/test/test_data_layer.o
LD .build_release/src/caffe/test/test_im2col_layer.o
LD .build_release/src/caffe/test/test_platform.o
LD .build_release/cuda/src/caffe/test/test_im2col_kernel.o
CXX/LD -o .build_release/test/test_all.testbin src/caffe/test/test_caffe_main.cpp

输出文件很多,上面只是截取了一部分显示结果。然后继续输入命令:

make runtest -j4

需要等待挺长一段时间,然后出现一大堆绿色的[RUN  OK]这样的结果就代表编译成功了:

[ RUN      ] LRNLayerTest/3.TestForwardAcrossChannels
[       OK ] LRNLayerTest/3.TestForwardAcrossChannels (0 ms)
[ RUN      ] LRNLayerTest/3.TestGradientWithinChannel
[       OK ] LRNLayerTest/3.TestGradientWithinChannel (2360 ms)
[ RUN      ] LRNLayerTest/3.TestSetupAcrossChannels
[       OK ] LRNLayerTest/3.TestSetupAcrossChannels (0 ms)
[ RUN      ] LRNLayerTest/3.TestSetupWithinChannel
[       OK ] LRNLayerTest/3.TestSetupWithinChannel (0 ms)
[----------] 8 tests from LRNLayerTest/3 (5412 ms total)


[----------] Global test environment tear-down
[==========] 2041 tests from 267 test cases ran. (491872 ms total)
[  PASSED  ] 2041 tests.