深度学习必备!解读腾讯优图首个开源项目 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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯开源的专栏

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

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

6466
来自专栏加米谷大数据

大数据分析挖掘培训课程

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

4769
来自专栏云时之间

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

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

3707
来自专栏蓝鸟资源分享网

关于服务器性能的一些思考

平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt,其中load、cpu、mem来衡量机器性能,qps、rt来衡量...

2184
来自专栏AI研习社

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

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

5055
来自专栏机器之心

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

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

3229
来自专栏AI科技评论

开发 | 用 Tensorflow 搭建能理解语境的聊天机器人!

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

43218
来自专栏互联网研发闲思录

京东个性化推荐系统实战(下)

        推荐系统架构,推荐系统由品类平台,素材、特征召回平台、模型计算打分服务,排序服务构成。 ?        将请求封装成QueryInfo对象,通...

4848
来自专栏安智客

基于可信环境的远程人脸识别认证系统技术要求

本篇针对目前信安标委《基于可信环境的远程人脸识别认证系统技术要求》标准规范征集意见稿进行学习!

1773
来自专栏媒矿工厂

IP现场直播场景下生产端延迟分析与设计

在现场制作过程中,人们常常需要对多个几乎同时到达的音视频数据流进行实时编辑处理。如果这些数据流之间存在比较明显的延迟,就有可能影响到制作过程的效率。因此,设计这...

1673

扫码关注云+社区