腾讯优图首度开源深度学习框架ncnn
【新智元导读】腾讯 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计算框架,速度非常快,但仅支持 iOS11以上的 iphone手机,落地受众太狭窄,非开源导致开发者无法自主扩展功能,对开源社区不友好。
ncnn与同类框架对比

为了更深入地了解这一腾讯社交网络事业群公布了首个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等数学计算库。

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预缓存,排列流水线,充分利用一切硬件资源,防止编译器意外负优化。
测试手机为nexus6p,android7.1.2。
5.精细的内存管理和数据结构设计,内存占用极低
在ncnn设计之初已考虑到手机上内存的使用限制,在卷积层、全连接层等计算量较大的层实现中,没有采用通常框架中的im2col +矩阵乘法,因为这种方式会构造出非常大的矩阵,消耗大量内存。因此,ncnn采用原始的滑动窗口卷积实现,并在此基础上进行优化,大幅节省了内存。在前向网络计算过程中,ncnn可自动释放中间结果所占用的内存,进一步减少内存占用。
内存占用量使用top工具的RSS项统计,测试手机为nexus6p,android7.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的前向计算过程中,组合出更自由的网络结构和更强大的特性。