跨平台Caffe及I/O模型与并行方案(二)

2. 跨平台Caffe

    Caffe繁杂的依赖项增加了安装使用的难度,也限制了系统的可移植性。为了解决Caffe跨平台的问题,本章首先分析Caffe依赖库,随后提出一种第三方库方案,最后介绍一个轻量级的跨平台Caffe分支项目——Dragon Caffe[2]

2.1 依赖库分析

    为了裁剪臃肿的依赖库,抽取、预编译必要的依赖库,我们首先需要分析Caffe的依赖库。

ProtoBuffer

    ProtoBuffer是由Google开发的一种可以实现内存与非易失存储介质(如硬盘文件)交换的协议接口。用户只需建立统一的参数描述文件(proto),然后利用protoc编译就能让协议细节等关键部分代码自动生成。Caffe源码中大量使用ProtoBuffer作为权值和模型参数的载体,它可以快速地对这些格式化数据进行序列化/反序列,还可以跨语言传递相同的数据结构。ProtoBuffer依赖库

Boost

    Boost库是一个功能强大、跨平台的C++开源库。在Caffe中主要使用了Boost中的智能指针和多线程库。

Gflags

    Glags在Caffe中主要起到命令行参数解析的作用。

Glog

    Glog库Google开发的用于记录应用程序日志的使用库,提供基于C++标准输入输出流形式的接口。Glog库和上文提到的Gflags库代码量很少,可以将代码融入到Caffe项目中,从而减少依赖库的数量。

BLAS

    Caffe中用到的数学计算主要是矩阵、向量的计算,调用了BLAS(Basic Linear Algebra Subprograms)中的相应方法。最常用的BLAS实现有Intel MKL、ATLAS、OpenBLAS等,Caffe可以任选一种。

OpenCV

    OpenCV是最流行对开源计算机视觉库,包含有大量图像处理函数。Caffe主要使用OpenCV完成一些图像存取和预处理功能,因此没有必要编译所有对OpenCV模块,仅仅裁剪出图片读写、图片缩放等模块即可。

LMDB和LEVELDB

    LMDB(Lighting Memory-Mapped DatabaseManager)是一种内存映射型数据库管理器,在Caffe中对作用主要是提供数据管理,将不同对原始数据(e.g. JPEG图片、二进制数据)转换为统一对Key-Value存储,便于Caffe对DataLayer获取这些数据。早期对Caffe使用两级缓冲预取数据库中对数据,由于目前制约深度学习系统IO速度的因素主要是带宽而非计算资源,可以直接读入、预处理原始数据(例如使用ImageDataLayer),为了简化Caffe也可以移除这个依赖库。

    LEVELDB库是Caffe早期版本使用的数据存储方式,由Googl开发。它是一种持续的键值对存储方式,键和值可以为任意字节数组。键的存储顺序可由用户定义的比较函数决定。目前大部分例程都已经使用LMDB代替了LEVELDB。

Snappy

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

2.2 第三方库跨平台方案

    对于Caffe的跨平台移植问题,第三方库(3rdparty)方案是一个很好的选择。首先分析Caffe的依赖库,抽取、裁剪必要的第三方库,并且保证这些库是平台无关的。然后针对不同平台(Windows/Linux/嵌入式系统)预先编译好这些库,以供Caffe运行时动态加载这些第三方库。对于平台相关的库,可以选择跨平台的替代库(例如用跨平台的boost库替代Linux的pThread库),或者直接移除,然后移除简单的库,重写第三方库的代码并融入到工程中。这种方案具有可裁剪、灵活配置的优点,已被用于多个跨平台Caffe开源项目[3]

    DragonCaffe[2]便是一个采用第三方库方案的跨平台Caffe开源分支。该项目根据Caffe运行的需要,裁剪了庞大的boost、OpenCV库,移除不必要的库,最小化Caffe的第三方库数量和存储空间。由于采用第三方库方案,能够保证Linux/Windows平台的同步安装,做到了真正的跨平台,并且安装十分便捷快速。

2.3 跨平台Caffe安装与使用

    跨平台Caffe项目Dragon的安装过程十分简单,只需要为第三方库配置环境变量,编辑编译配置文件CMakeList.txt,最后编译源代码。具体步骤如下:

1.   下载Dragon Caffe项目。

2.   安装显卡驱动与CUDA。

3.   根据操作系统类型选择预编译的第三方库。

4.   将第三方库的路径配置到PATH环境变量中。

5.   编辑编译配置文件CMakeList.txt,添加第三方库的路径、CUDA路径等信息。

6.  编译源代码。

    DragonCaffe的使用与原版Caffe一样,例如使用其C++接口训练数据,运行编译好的dragon.exe程序,输入train参数和模型配置文件路径,从而开启网络的训练过程。


图2-1 Dragon Caffe启动训练程序


图2-2 Dragon Caffe训练过程

Reference

[1] 赵永科. 深度学习:21天实战Caffe. 北京:电子工业出版社,2016.7

[2]  Dragon:A Light Deep Learning Framework,https://github.com/neopenx/Dragon

转自:https://blog.csdn.net/solomon1558/article/details/52291047

猜你喜欢

转载自blog.csdn.net/u010532666/article/details/80463291
今日推荐