因为最早期的框架如Caffe,先支持了X86平台如CUDA等,在设计之初并未考虑现如今的移动端场景,能怎样简化开发流程,有什么现成的库就拿来用。这也导致早期安装Caffe时,由于一堆依赖需要预先安装,相当费劲。
后来有了移动端的推理需要,Github上便有人对Caffe进行裁剪,比方下面这两个项目:sh1r0/caffe-android-lib: Porting caffe to android platform 和 solrex/caffe-mobile: Optimized (for size and speed) Caffe lib。
2017年中,看到过百度的手百团队《利用CNN实现无需联网的图像识别》的移动端IOS和安卓的AI报告,针对移动端内存、耗电量、图搜插件100KB大小限制、模型10MB大小限制、模型部署加密等问题,提出并落地了相关解决方案。 不过早期的思路,便是精简Caffe,比方做的工作就有:blas从openblas切换到cblas;裁剪glog;精简gflag;裁剪protobuf;移除backpropagation;并保留常见Operator,并对部分模块Blob,Net等进一步精简,Caffe原本37MB降为100KB大小。
移动端本身就够复杂了,因而有简化甚至是移除这些依赖库的要求,甚至为此开发新的框架。接上次发的《软件发布前的优化与裁剪:初识》,上次讲到我们可以在cmake ..
后追加--graphviz=
这个参数来打印编译的target
依赖,以此作为裁剪的参考,还有strip
命令等。这次记录下裁剪、移除gflags
和glog
等库的具体实践和想法。目录如下:
- 简化
glog
- 移除
gflags
- 裁剪
protobuf
- CMAKE中的
CMAKE_BUILD_TYPE
CMAKE_BUILD_TYPE
的设置方式CMAKE_BUILD_TYPE
的四种模式
1. 简化glog
考虑到移动端对动态、静态库的轻量要求,比方ncnn-andorid-armv8
静态库仅1.9MB,裁剪glog
。其实说裁剪并不准确,实际中重新实现了有如下功能的logging
:
# 支持的函数:其实就是用到的glog中的函数(等效实现)
CHECK
CHECK_EQ
CHECK_NE
CHECK_LT
CHECK_LE
CHECK_GT
CHECK_GE
LOG(INFO)
LOG(WARNING)
LOG(ERROR)
LOG(FATAL)
VLOG(0~9): enable by `export GLOG_v&