【腾讯优图首度开源深度学习框架ncnn】主打手机端,同类cpu框架最快

2018-03-23 10:13:54 浏览数 (1)

【新智元导读】 腾讯 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。

8. 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe 模型

ncnn 使用自有的模型格式,模型主要存储模型中各层的权重值。ncnn 模型中含有扩展字段,用于兼容不同权重值的存储方式,如常规的单精度浮点,以及占用更小的半精度浮点和 8bit 量化数。大部分深度模型都可以采用半精度浮点减小一半的模型体积,减少 APP 安装包大小和在线下载模型的耗时。ncnn 带有 caffe 模型转换器,可以转换为 ncnn 的模型格式,方便研究成果快速落地。

9. 支持直接内存零拷贝引用加载网络模型

在某些特定应用场景中,如因平台层 API 只能以内存形式访问模型资源,或者希望将模型本身作为静态数据写在代码里,ncnn 提供了直接从内存引用方式加载网络模型的功能。这种加载方式不会拷贝已在内存中的模型,也无需将模型先写入实体的文件再读入,效率极高。

10. 可注册自定义层实现并扩展

ncnn 提供了注册自定义层实现的扩展方式,可以将自己实现的特殊层内嵌到 ncnn 的前向计算过程中,组合出更自由的网络结构和更强大的特性。

0 人点赞