【腾讯优图首度开源深度学习框架ncnn】主打手机端,同类cpu框架最快
【新智元导读】 腾讯 AI 三大支柱之一的腾讯优图实验室公布了成立以来的第一个开源项目ncnn,这是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。深度学习+手机端的应用是2017年以来人工智能领域的一大热点。新智元日前对项目的负责人nihui进行独家专访,从项目开发始终、目的、应用、发展方向等进行请教。文章后半部分,我们带来ncnn10大重要功能介绍。
根据新智元获得的最新消息,腾讯社交网络事业群公布了首个AI开源项目,这同时也是腾讯优图实验室的第一个深度学习开源项目——ncnn。 (github地址:
https://github.com/Tencent/ncnn)
据介绍,ncnn是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部属和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发人工智能 APP。以腾讯内部应用为例,ncnn 目前已在QQ,Qzone,微信,天天P图等上得到应用。
腾讯优图实验室是以计算机视觉见长,ncnn的许多应用方向也都在图像方面,如人像自动美颜,照片风格化,超分辨率,物体识别。
新智元此前曾报道,腾讯优图是腾讯AI的三大核心支柱之一,与微信AI团队和新成立的腾讯AI Lab共同驱动腾讯的 AI 发展。 2017年5月15日, 中国香港中文大学终身教授贾佳亚博士加盟腾讯优图实验室 ,出任杰出科学家。本年度在国际上人脸识别标志性比赛——LFW 和 MegaFace上,腾讯优图都拿到了冠军的成绩。优图实验室创立于2012年,专注在图像处理、模式识别、机器学习、数据挖掘等领域开展技术研发和业务落地,至今已有近5年的历史。
深度学习算法要在手机上落地,现成的 caffe-android-lib 项目依赖太多,手机上基本不支持cuda,需要个又快又小的前向网络实现。单纯的精简 caffe 等框架依然无法满足手机 APP 对安装包大小,运算速度等的苛刻要求。ncnn 作者认为,只有全部从零开始设计才能做出适合移动端的前向网络实现,因此从最初的架构设计以手机端运行为主要原则,考虑了手机端的硬件和系统差异以及调用方式。
腾讯优图ncnn提供的资料显示:对比目前已知的同类框架,ncnn是cpu框架中最快的,安装包体积最小,跨平台兼容性中也是最好的。以苹果主推的CoreML为例,CoreML 是苹果主推的 iOS gpu 计算框架,速度非常快,但仅支持 iOS 11 以上的 iphone 手机,落地受众太狭窄,非开源导致开发者无法自主扩展功能,对开源社区不友好。
ncnn与同类框架对比
对比 |
caffe |
tensorflow |
ncnn |
CoreML |
---|---|---|---|---|
计算硬件 |
cpu |
cpu |
cpu |
gpu |
是否开源 |
是 |
是 |
是 |
否 |
手机计算速度 |
慢 |
慢 |
很快 |
极快 |
手机库大小 |
大 |
较大 |
小 |
小 |
手机兼容性 |
好 |
好 |
很好 |
仅支持 ios11 |
为了更深入地了解这一腾讯社交网络事业群公布了首个AI开源项目。在获得这一消息后,新智元第一时间对项目负责人nihui进行了专访。
nihui,喜爱C/C++,腾讯优图实验室基础研究组高级研究员,负责图像和人脸相关的技术研究和软件开发,非常热爱开源社区,系腾讯社交网络事业群首个AI开源项目ncnn负责人。
新智元专访ncnn负责人nihui:跑vgg、googlenet、resnet等模型速度比其他已知的开源框架快2~4倍
新智元: 能否介绍一下ncnn的开发过程,作为负责人,你希望这一框架会有怎样的发展?
nihui: 最开始边学习CNN边写点代码,发现手机上还没个好用的库,于是自己动手吧。希望将来ncnn能更加充实些,比如支持更多的网络结构和更多的平台,更快的计算速度,最重要的是,希望有感兴趣的开发者能一起改善。
新智元: 你认为开源能给腾讯优图带来的最大好处是什么?
nihui: 大幅节省学习成本,很多东西有现成的,比自己从零开始做一个方便太多了。
新智元: ncnn为什么会选择纯C++实现,这样有什么好处?如何应对不同平台开发者的需求?
nihui: 我喜欢写C++,C++较接近底层,能控制几乎所有资源,运行代价小。目前主要是面向android和ios的,实际上只要有C++编译器就可以。
新智元: 为什么在计算硬件上选择CPU而不是GPU?
nihui: CPU的兼容性很好,但是各种各样的GPU功能支持都不一样,不容易实现,比如ios的metal和android的opencl。不否认GPU会更快,但GPU优化很复杂,想写一个通用的GPU路径很难,总之我做不出来。
新智元: TensorFlow现在已经是Github上最受欢迎的深度学习开源框架,同样提供手机端的部署,你们和它们相比最大的优势在哪些地方?如何跟它竞争,赢得开发者?
nihui: ncnn在手机上更快。实际上没有什么竞争关系,TensorFlow侧重训练,ncnn侧重部署。
新智元: vgg、googlenet、resnet等模型在NCNN上的性能表现如何?你们有做过测试吗?
nihui: 都可以跑,速度比其他已知的开源框架快2~4倍,而且我们已经在基于这些主流模型的修改版实现智能应用了
新智元: 以大家熟知的微信为例,ncnn可以如何得到应用?
nihui: ncnn支撑着一些优图提供的算法,例如人脸相关的应用。
新智元: 能否列举更多应用的列子,特别是图像处理方面,性能表现如何?
nihui: 人像自动美颜,照片风格化,超分辨率,物体识别等等,对于小型的网络模型可以跑到实时。
新智元: 手机端的成功应用,如果要延伸到其他终端,比如智能家居上,会面临哪些问题?你们未来会不会在这些方向上做突破?
nihui: 有cpu的地方ncnn都可以跑起来。智能家居的硬件环境不清楚,如果也是arm的话,移植下应该就可以了。
新智元: 为什么要从头开发一个在手机端部署的神经网络框架?这是否意味着云端部署有其不可避免的缺陷?未来,云端和终端会如何发展?如何分工?
nihui: AR,VR都需要实时性,云端即使再快也无法实时,所以终端部署是很有必要的。云端适合处理大数据,比如推荐系统,安全系统,终端适合实时化的应用场景,比如智能机器人,无人驾驶。
新智元: 除了ncnn,优图后续还有什么开源计划?
nihui: 优图还有些不错的图像和AI相关的项目,没有确实的计划,大概想开源就开源了吧。
新智元: 据介绍,ncnn应用到微信、QQ等腾讯的产品中,我们知道,腾讯的其他部门,比如腾讯也有自己的AI开发团队,那么你们之间的研究会存在重合吗?优图为腾讯其他部门提供技术支持的模式是怎样的?
nihui: 腾讯不同部门各有自己侧重的研究方向,腾讯优图是腾讯内部专注于图像处理、模式识别、机器学习、数据挖掘等领域的核心技术团队,主要基于整个腾讯的社交网络平台,为QQ、QQ空间 、QQ音乐、财付通、微众银行等提供图像和模式识别技术支持。
ncnn10大功能
1. 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
ncnn 支持卷积神经网络结构,以及多分支多输入的复杂网络结构,如主流的 vgg、googlenet、resnet、squeezenet 等。计算时可以依据需求,先计算公共部分和 prob 分支,待 prob 结果超过阈值后,再计算 bbox 分支。如果 prob 低于阈值,则可以不计算 bbox 分支,减少计算量。
2.无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架
ncnn 不依赖任何第三方库,完全独立实现所有计算过程,不需要 BLAS/NNPACK 等数学计算库。
caffe-android-lib+openblas |
ncnn |
---|---|
boost gflags glog lmdb openblas opencv protobuf |
无 |
3.纯 C++ 实现,跨平台,支持 android ios 等
ncnn 代码全部使用 C/C++ 实现,跨平台的 cmake 编译系统,可在已知的绝大多数平台编译运行,如 Linux,Windows,MacOS,Android,iOS 等。由于 ncnn 不依赖第三方库,且采用 C++ 03 标准实现,只用到了 std::vector 和 std::string 两个 STL 模板,可轻松移植到其他系统和设备上。
4. ARM NEON 汇编级良心优化,计算速度极快
ncnn 为手机端 CPU 运行做了深度细致的优化,使用 ARM NEON 指令集实现卷积层,全连接层,池化层等大部分 CNN 关键层。对于寄存器压力较大的 armv7 架构,手工编写 neon 汇编,内存预对齐,cache 预缓存,排列流水线,充分利用一切硬件资源,防止编译器意外负优化。
测试手机为 nexus 6p,android 7.1.2。
5. 精细的内存管理和数据结构设计,内存占用极低
在 ncnn 设计之初已考虑到手机上内存的使用限制,在卷积层、全连接层等计算量较大的层实现中,没有采用通常框架中的 im2col + 矩阵乘法,因为这种方式会构造出非常大的矩阵,消耗大量内存。因此,ncnn 采用原始的滑动窗口卷积实现,并在此基础上进行优化,大幅节省了内存。在前向网络计算过程中,ncnn 可自动释放中间结果所占用的内存,进一步减少内存占用。
内存占用量使用 top 工具的 RSS 项统计,测试手机为 nexus 6p,android 7.1.2。
6. 支持多核并行计算加速,ARM big.LITTLE cpu 调度优化
ncnn 提供了基于 openmp 的多核心并行计算加速,在多核心 cpu 上启用后能够获得很高的加速收益。ncnn 提供线程数控制接口,可以针对每个运行实例分别调控,满足不同场景的需求。针对 ARM big.LITTLE 架构的手机 cpu,ncnn 提供了更精细的调度策略控制功能,能够指定使用大核心或者小核心,或者一起使用,获得极限性能和耗电发热之间的平衡。例如,只使用1个小核心,或只使用2个小核心,或只使用2个大核心,都尽在掌控之中。
7. 整体库体积小于 500K,并可轻松精简到小于 300K
ncnn 自身没有依赖项,且体积很小,默认编译选项下的库体积小于 500K,能够有效减轻手机 APP 安装包大小负担。此外,ncnn 在编译时可自定义是否需要文件加载和字符串输出功能,还可自定义去除不需要的层实现,轻松精简到小于 300K。