腾讯移动端推理框架NCNN

ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。

支持大部分常用的 CNN 网络:
Classical CNN: VGG AlexNet GoogleNet Inception …
Practical CNN: ResNet DenseNet SENet FPN …
Light-weight CNN: SqueezeNet MobileNetV1/V2/V3 ShuffleNetV1/V2 MNasNet …
Detection: MTCNN facedetection …
Detection: VGG-SSD MobileNet-SSD SqueezeNet-SSD MobileNetV2-SSDLite …
Detection: Faster-RCNN R-FCN …
Detection: YOLOV2 YOLOV3 MobileNet-YOLOV3 …
Segmentation: FCN PSPNet UNet …

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的前向计算过程中,组合出更自由的网络结构和更强大的特性。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值