深度学习必备!解读腾讯优图首个开源项目ncnn

作者简介

倪辉,喜爱C/C++,腾讯优图实验室基础研究组高级研究员,负责图像和人脸相关的技术研究和软件开发,非常热爱开源社区,系腾讯社交网络事业群首个AI开源项目ncnn负责人。

ncnn (GitHub地址:https://github.com/Tencent/ncnn,点击“阅读全文”也可直接访问)是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

历程和背景

深度学习算法要在手机上落地,现成的 caffe-android-lib 项目依赖太多,手机上基本不支持cuda,需要个又快又小的前向网络实现。单纯的精简 caffe 等框架依然无法满足手机 APP 对安装包大小,运算速度等的苛刻要求。作者在严谨分析后认为,只有全部从零开始设计才能做出适合移动端的前向网络实现,因此从最初的架构设计便以手机端运行为主要原则,考虑了手机端的硬件和系统差异以及调用方式。

经过一年多的持续开发,基本实现了卷积神经网络的所有特性,精细调优后的效率领先目前一切已知的开源框架。ncnn 目前已在腾讯许多APP中使用,经过大量的实践测试,稳定性很好。作为腾讯对开源社区的贡献,希望能为人工智能的发展助力,将更多的深度学习研究成果落地到用户面前,提升人类生活品质。

同类框架对比

对比目前已知的同类框架,ncnn是CPU框架中最快,安装包体积最小,跨平台兼容性中最好的。CoreML 是苹果主推的 iOS GPU 计算框架,速度非常快,但仅支持 iOS 11 以上的 iphone 手机,落地受众太狭窄,非开源导致开发者无法自主扩展功能,对开源社区不友好。

功能概述

支持卷积神经网络,多输入和多分支

ncnn 支持卷积神经网络结构,以及多分支多输入的复杂网络结构,如主流的 vgg、googlenet、resnet、squeezenet 等。

计算时可以依据需求,先计算公共部分和 prob 分支,待 prob 结果超过阈值后,再计算 bbox 分支。 如果 prob 低于阈值,则可以不计算 bbox 分支,减少计算量。

无任何第三方库依赖

ncnn 不依赖任何第三方库,完全独立实现所有计算过程,不需要 BLAS/NNPACK 等数学计算库。

纯 C++ 实现,跨平台

ncnn 代码全部使用 C/C++ 实现,以及跨平台的 cmake 编译系统,可在已知的绝大多数平台编译运行,如 Linux,Windows,MacOS,Android,iOS 等。 由于 ncnn 不依赖第三方库,且采用 C++ 03 标准实现,只用到了 std::vector 和 std::string 两个 STL 模板,可轻松移植到其他系统和设备上。

汇编级优化,计算速度极快

ncnn 为手机端 CPU 运行做了深度细致的优化,使用 ARM NEON 指令集实现卷积层,全连接层,池化层等大部分 CNN 关键层。 对于寄存器压力较大的 armv7 架构,我们手工编写 neon 汇编,内存预对齐,cache 预缓存,排列流水线,充分利用一切硬件资源,防止编译器意外负优化。 测试手机为 Nexus 6p,Android 7.1.2

精细的数据结构设计,内存占用极低

在 ncnn 设计之初我们已考虑到手机上内存的使用限制,在卷积层、全连接层等计算量较大的层实现中,没有采用通常框架中的 im2col + 矩阵乘法,因为这种方式会构造出非常大的矩阵,消耗大量内存。因此,ncnn 采用原始的滑动窗口卷积实现,并在此基础上进行优化,大幅节省了内存。在前向网络计算过程中,ncnn 可自动释放中间结果所占用的内存,进一步减少内存占用。 内存占用量使用 top 工具的 RSS 项统计,测试手机为 Nexus 6p,Android 7.1.2。

支持多核并行计算,优化 CPU 调度

ncnn 提供了基于 openmp 的多核心并行计算加速,在多核心 CPU 上启用后能够获得很高的加速收益。ncnn 提供线程数控制接口,可以针对每个运行实例分别调控,满足不同场景的需求。 针对 ARM big.LITTLE 架构的手机 CPU,ncnn 提供了更精细的调度策略控制功能,能够指定使用大核心或者小核心,或者一起使用,获得极限性能和耗电发热之间的平衡。例如,只使用1个小核心,或只使用2个小核心,或只使用2个大核心,都尽在掌控之中。

整体库体积小于500K,可精简到小于300K

ncnn 自身没有依赖项,且体积很小,默认编译选项下的库体积小于 500K,能够有效减轻手机 APP 安装包大小负担。此外,ncnn 在编译时可自定义是否需要文件加载和字符串输出功能,还可自定义去除不需要的层实现,轻松精简到小于 300K。

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

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

支持直接内存引用加载网络模型

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

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

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

小伙伴们是不是正准备对ncnn跃跃欲试了呢?小编早就看出你的小心思了,为你准备了源代码放在GitHub上哟,如果觉得对研发,尤其是深度学习有帮助,记得点个star啦!你提出的每一个issue或者Pull Request,都能帮助ncnn完善自我,服务大家。

GitHub地址:https://github.com/Tencent/ncnn

原文发布于微信公众号 - 腾讯开源(tencentopen)

原文发表时间:2017-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏挖数

这5款可视化利器,让数据在屏幕上跳舞

用好可视化工具,往往对枯燥的数据有点石成金的效果,今天挖数给大家推荐5款数据可视化的利器,一起让数据灵动起来! PowerBI 微软出品,与Excel无缝连接...

33470
来自专栏数据科学与人工智能

【Python环境】Python可视化工具综述

简介 在Python的世界里,可视化你的数据有多种选择。由于这种多样性,决定何时使用哪一个确实是种挑战。这篇文章包含由更受欢迎的包中的一部分制作的示例,并说明如...

470100
来自专栏AI研习社

聊天机器人还能这么玩!教你用 Tensorflow 搭建能理解语境的客服小二!

掌握对话沟通,语境为王。 我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理。 ? 有没有想过为什么大多数聊天机器人缺乏会...

55550
来自专栏机器之心

机器之心实操 | 亚马逊详解如何使用MXNet在树莓派上搭建实时目标识别系统

选自AWS 机器之心编译 参与:思源 在过去的五年中,深度神经网络已经解决了许多计算困难的问题,特别是计算机视觉。因为深度神经网络需要大量的计算力来训练模型,所...

41390
来自专栏1001482的专栏

从 0 到 1 打造轻量级图像识别服务框架

在这个AI时代,图像识别技术作为其基础能力之一,也在快速发展中,今天来聊聊图像识别的服务运行框架。

3.7K20
来自专栏大数据挖掘DT机器学习

【案例】SPSS商业应用系列第1篇:预测分析模型提高超市销量

Statistics 和 Modeler作为 IBM SPSS 软件家族中重要的成员,是专业的科学统计、数据挖掘分析工具,其具有功能强大,应用广...

57950
来自专栏AI研习社

拿 NLP 来分析我自己的 Facebook 数据,会发生什么?

当一个 NLP(自然语言处理)在观察我的写作风格(也是如何处理我自己的 Facebook 数据!)

13820
来自专栏云时之间

机器学习资料分享(持续更新)

2017.12.12 有一些链接已经失效,并且网盘一些文件被删了,我在上传一下。大家发现有什么失效的链接请在评论区告诉我下。谢谢 另外,我在新的一篇文章中会更加...

39770
来自专栏Albert陈凯

使用Storm处理事务型实时计算需求时的几处难点

比流量或者订单淘宝可以把我们甩出几条大街。淘宝的兄弟可以自豪地说他们的实时应用已经承受住了双十一全世界范围内最大的单日数据流的冲击。而阿里巴巴中文站的流量和订单...

42570
来自专栏加米谷大数据

大数据分析挖掘培训课程

加米谷数据分析与挖掘课程体系包括5个板块、9个阶段、200+模块以及4个真实项目实战。

49990

扫码关注云+社区

领取腾讯云代金券