【犀牛鸟论道】深度学习必备!解读腾讯优图首个开源项目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 的前向计算过程中,组合出更自由的网络结构和更强大的特性。

作者简介

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

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

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

原文发布于微信公众号 - 腾讯高校合作(Tencent_UR)

原文发表时间:2017-08-04

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人分享

PageRank算法

PageRank,网页排名,又称网页级别,传说中是PageRank算法拯救了谷歌,它是根据页面之间的超链接计算的技术,作为网页排名的要素之一。它通过网络浩瀚的超...

35720
来自专栏AI科技大本营的专栏

AI 技术讲座精选:5款新手也能快速构建的深度学习应用(使用Python)

前 言 深度学习从根本上改变了我们周围的一切。很多人认为必须成为深度学习的专家,才能将深度学习用到自己的应用中。然而,实际并非如此。 在我之前的文章中,我讨论了...

35270
来自专栏AI研习社

Github 项目推荐 | 面向多设备和多框架的英特尔开源编译器 —— nGraph

英特尔近期开源了深度学习框架编译器 nGraph。nGraph 是一款开源 C++ 库,编译器和运行器,它能够让数据科学家能够专注于数据科学研发,不需要担心如何...

13130
来自专栏AI研习社

Intel发布开源增强学习框架Coach

今天,英特尔发布了一个新的开源增强学习框架Coach。该框架利用多核CPU处理能力,用于训练和评估增强学习Agent。Coach包含一些领先的增强学习算法的多线...

398110
来自专栏智能算法

TensorFlow Lite在Kika Keyboard中的应用案例分享

『基于 AI 技术变革沟通,让世界沟通更简单』一直是 Kika keyboard 最重要的使命。从2016年开始,Kika 技术团队一直致力于 AI 技术在移动...

24340
来自专栏吉浦迅科技

假如用多个CPU核同时控制一个GPU,并且进行运算与数据的传递,请问这能够实现么?...

问:假如用多个CPU核同时控制一个GPU,并且进行运算与数据的传递,请问这能够实现么?我的工作站是48个CPU核,两块GPU卡,打算把CPU和GPU都用起来,我...

39770
来自专栏机器之心

资源 | 机器学习新框架Propel:使用JavaScript做可微分编程

30170
来自专栏CreateAMind

神经网络艺术图片效果及课程ppt

11520
来自专栏祝威廉

Spark团队新作MLFlow 解决了什么问题

中午的时候看到了Spark团队新作MLFlow,因为我本身也在做类似的解决方案MLSQL,自然要看看Meitai是怎么做的。所以第一时间把MLFlow相关文档 ...

20520
来自专栏AI科技评论

开发 | Intel发布开源增强学习框架Coach,多线程实现领先的增强学习算法

AI科技评论消息,日前,英特尔发布了一个新的开源增强学习框架Coach。该框架利用多核CPU处理能力,用于训练和评估增强学习Agent。Coach包含一些领先的...

38780

扫码关注云+社区

领取腾讯云代金券