caffe笔记:caffe依赖包解析

2017-02-08 Lu Huang 更多博文 » 博客 » GitHub »

原文链接 https://hlthu.github.io/caffe/2017/02/08/caffe-dependency-analysis.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


在安装caffe的时候,我们需要解决一系列依赖问题,这些依赖一般都是开源的库,通过使用开源库可以大大节省开发的时间,并降低开发的难度。本文将主要介绍caffe中常用到的几个依赖库,并简单阐述他们的作用。

1. ProtoBuffer

ProtoBuffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

caffe源码中大量使用了ProtoBuffer作为权值和模型参数的载体。在caffe中,用户只需要建立统一的参数描述文件(proto),然后利用protoc编译就可以让协议细节等关键部分的代码自动生成。

2. Boost

Boost是一个功能强大、构造精巧、跨平台且开源的库,被称为“C++”标准库,使用了很多现代编程技术,包括字符串处理、正则表达式、容器和数据结构、并发编程、函数式编程等许多领域,使得C++开发更加灵活。

在caffe中主要使用了Boost中的智能指针,其自带引用计数功能,可避免共享指针时造成内存泄漏或多次释放。另外,pycaffe中使用Boost Python实现C++和Python语言的连接,方便Python调用C++设计的模块。

3. GFLAGS

GFLAGS在caffe中主要起到命令行参数解析的作用,这与ProtoBuffer的功能类似,只是参数输入源不同。

4. GLOG

GLOG库是由Google开发的用于记录应用程序日志的实用库,提供基于C++标准输入输出流形式的接口,记录时可选择不同的日志级别,方便将重要日志和普通日志分开。

GLOG在caffe中主要起到记录日志的作用,便于开发者查看caffe训练中产生的中间输出,并根据这些信息决定如何调整参数来控制收敛。

5. BLAS

神经网络中用到的数学计算主要是矩阵、向量的计算,caffe中调用了BLAS(Basic Linear Algebra SUBprograms,基本线性代数子程序)中相应的方法。最常用的BLAS实现有Intel MKL、ATLAS、OpenBLAS等。caffe可以选择任何一种,一般我会选择OpenBLAS。

OpenBLAS在caffe中主要负责CPU端的数值计算。由于调用量很大,该库的性能直接影响到caffe的运行性能。而在GPU端,数值计算则是由cuBLAS完成的。

6. HDF5

HDF(Hierarchical Data File)是美国国家高级计算应用中心(NCSA)为了满足各领域科研需求而研制的一种能高效存储和分发科学数据的新型数据格式。他可以存储不同类型的图像和数码数据的文件,并且可以在不同类型的机器上输出,同时还有统一处理这种文件格式的函数库。caffe训练模型可以选择保存为HDF5格式或者ProtoBuffer格式。

7. OpenCV

OpenCV是世界上最流行的开源计算机视觉库,包含大量的图像处理函数。caffe主要使用OpenCV完成一些图像存取和预处理的操作。

8. LMDB和LEVELDB

LMDB(Lightning Memory-Mapped Database Manager)是一种闪电般的内存映射型数据库管理器,在caffe中的作用主要是提供数据管理,将形形色色的原始数据转换为统一的Key-Value存储,便于caffe的Data Layer获取这些数据。LEVELDB是caffe中早起使用的数据存储方式。

9. Sanppy

Snappy是一个用来压缩和解压缩的C++库,旨在提供较高的压缩速度和合理的压缩率。Snappy比zlib要快,但是文件相对要大20%~100%。

参考

  1. ubuntu 16.04上配置cuda+caffe环境
  2. 深度学习——21天实战caffe:赵永科著,中国工信出版集团、电子工业出版社,2016年7月。