长春电商网站建设费用,广安建设网站,重庆做模块网站,网站防注入文章目录 17.9.5 ShuffleNet- v1 17.9.6 ShuffleNet- v2 17.10 现有移动端开源框架及其特点 17.10.1 NCNN 17.10.2 QNNPACK 17.9.5 ShuffleNet- v1
ShuffleNet 是Face团队提出的#xff0c;晚于MobileNet两个月在arXiv上公开《ShuffleNet#xff1a; An Extremely Efficient…文章目录 17.9.5 ShuffleNet- v1 17.9.6 ShuffleNet- v2 17.10 现有移动端开源框架及其特点 17.10.1 NCNN 17.10.2 QNNPACK 17.9.5 ShuffleNet- v1
ShuffleNet 是Face团队提出的晚于MobileNet两个月在arXiv上公开《ShuffleNet An Extremely Efficient Convolutional Neural Network for Mobile Devices 》用于移动端前向部署的网络架构。ShuffleNet基于MobileNet的group思想将卷积操作限制到特定的输入通道。而与之不同的是ShuffleNet将输入的group进行打散从而保证每个卷积核的感受野能够分散到不同group的输入中增加了模型的学习能力。
5.1 设计思想
采用group conv减少大量参数 roup conv与DW conv存在相同的“信息流通不畅”问题采用channel shuffle解决上述问题 MobileNet中采用PW conv解决上述问题SheffleNet中采用channel shuffle采用concat替换add操作 avg pooling和DW conv(s2)会减小feature map的分辨率采用concat增加通道数从而弥补分辨率减小而带来信息的损失
5.2 网络架构
MobileNet中1*1卷积的操作占据了约95%的计算量所以作者将1*1也更改为group卷积使得相比MobileNet的计算量大大减少。 group卷积与DW存在同样使“通道信息交流不畅”的问题MobileNet中采用PW conv解决上述问题SheffleNet中采用channel shuffle。 ShuffleNet的shuffle操作如图所示 avg pooling和DW conv(s2)会减小feature map的分辨率采用concat增加通道数从而弥补分辨率减小而带来信息的损失实验表明多多使用通道(提升通道的使用率)有助于提高小模型的准确率。 网络结构 17.9.6 ShuffleNet- v2
huffleNet-v2 是Face团队提出的《ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design》旨在设计一个轻量级但是保证精度、速度的深度网络。
6.1 设计思想 文中提出影响神经网络速度的4个因素 a. FLOPs(FLOPs就是网络执行了多少multiply-adds操作)b. MAC(内存访问成本)c. 并行度(如果网络并行度高速度明显提升)d. 计算平台(GPUARM)ShuffleNet-v2 提出了4点网络结构设计策略 G1.输入输出的channel相同时MAC最小G2.过度的组卷积会增加MACG3.网络碎片化会降低并行度G4.元素级运算不可忽视
6.2 网络结构
depthwise convolution 和 瓶颈结构增加了 MAC用了太多的 group跨层连接中的 element-wise Add 操作也是可以优化的点。所以在 shuffleNet V2 中增加了几种新特性。 所谓的 channel split 其实就是将通道数一分为2化成两分支来代替原先的分组卷积结构G2并且每个分支中的卷积层都是保持输入输出通道数相同G1其中一个分支不采取任何操作减少基本单元数G3最后使用了 concat 代替原来的 elementy-wise add并且后面不加 ReLU 直接G4再加入channle shuffle 来增加通道之间的信息交流。 对于下采样层在这一层中对通道数进行翻倍。 在网络结构的最后即平均值池化层前加入一层 1x1 的卷积层来进一步的混合特征。 网络结构 6.4 ShuffleNet-v2具有高精度的原因
由于高效可以增加更多的channel增加网络容量采用split使得一部分特征直接与下面的block相连特征复用(DenseNet)
17.10 现有移动端开源框架及其特点
17.10.1 NCNN
1、开源时间2017年7月
2、开源用户腾讯优图
、GitHub地址GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform
4、特点
1NCNN考虑了手机端的硬件和系统差异以及调用方式架构设计以手机端运行为主要原则。2无第三方依赖跨平台手机端 CPU 的速度快于目前所有已知的开源框架以开源时间为参照对象。3基于 ncnn开发者能够将深度学习算法轻松移植到手机端高效执行开发出人工智能 APP。
5、功能
NCNN支持卷积神经网络、多分支多输入的复杂网络结构如vgg、googlenet、resnet、squeezenet 等。NCNN无需依赖任何第三方库。NCNN全部使用C/C实现以及跨平台的cmake编译系统可轻松移植到其他系统和设备上。汇编级优化计算速度极快。使用ARM NEON指令集实现卷积层全连接层池化层等大部分 CNN 关键层。精细的数据结构设计没有采用需消耗大量内存的通常框架——im2col 矩阵乘法使得内存占用极低。支持多核并行计算优化CPU调度。整体库体积小于500K可精简到小于300K。可扩展的模型设计支持8bit 量化和半精度浮点存储。支持直接内存引用加载网络模型。可注册自定义层实现并扩展。
6、NCNN在Android端部署示例
1选择合适的Android Studio版本并安装。2根据需求选择NDK版本并安装。3在Android Studio上配置NDK的环境变量。4根据自己需要编译NCNN sdk
mkdir build-android cd build-android cmake -DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABIarmeabi-v7a -DANDROID_ARM_NEONON \ -DANDROID_PLATFORMandroid-14 .. make make install
安装完成之后install下有include和lib两个文件夹。
备注
ANDROID_ABI 是架构名字armeabi-v7a 支持绝大部分手机硬件
ANDROID_ARM_NEON 是否使用 NEON 指令集设为 ON 支持绝大部分手机硬件
ANDROID_PLATFORM 指定最低系统版本android-14 就是 android-4.0
5进行NDK开发。
1assets文件夹下放置你的bin和param文件。
2jni文件夹下放置你的cpp和mk文件。
3修改你的app gradle文件。
4配置Android.mk和Application.mk文件。
5进行java接口的编写。
6读取拷贝bin和param文件有些则是pb文件根据实际情况。
7进行模型的初始化和执行预测等操作。
8build。
9cd到src/main/jni目录下执行ndk-build生成.so文件。
10接着就可写自己的操作处理需求。
17.10.2 QNNPACK
全称Quantized Neural Network PACKage量化神经网络包
、开源时间2018年10月
、开源用户Facebook
、GitHub地址https://github.com/pytorch/QNNPACK
、特点
低密度卷积优化函数库 可在手机上实时运行Mask R-CNN 和 DensePose;
能在性能受限的移动设备中用 100ms 以内的时间实施图像分类
5、QNNPACK 如何提高效率
1) QNNPACK 使用与安卓神经网络 API 兼容的线性量化方案
QNNPACK 的输入矩阵来自低精度、移动专用的计算机视觉模型。其它库在计算A和B矩阵相乘时重新打包 A 和 B 矩阵以更好地利用缓存层次结构希望在大量计算中分摊打包开销QNNPACK 删除所有计算非必需的内存转换针对 A和B矩阵相乘适用于一级缓存的情况进行了优化。 1优化了L1缓存计算不需要输出中间结果直接输出最终结果节省内存带宽和缓存占用。
具体分析
常规实现在量化矩阵-矩阵乘法中8位整数的乘积通常会被累加至 32 位的中间结果中随后重新量化以产生 8 位的输出。遇到大矩阵尺寸时比如有时K太大A和B的面板无法直接转入缓存此时需利用缓存层次结构借助GEMM将A和B的面板沿着K维分割成固定大小的子面板以便于每个子面板都能适应L1缓存随后为每个子面板调用微内核。这一缓存优化需要 PDOT 为内核输出 32 位中间结果最终将它们相加并重新量化为 8 位整数。优化实现由于 ONNPACK 对于面板 A 和 B 总是适应 L1 缓存的移动神经网络进行了优化因此它在调用微内核时处理整个 A 和 B 的面板。而由于无需在微内核之外积累 32 位的中间结果QNNPACK 会将 32 位的中间结果整合进微内核中并写出 8 位值这节省了内存带宽和缓存占用。 2取消了矩阵 A 的重新打包。 常规实现 矩阵 B 包含静态权重可以一次性转换成任何内存布局但矩阵 A 包含卷积输入每次推理运行都会改变。因此重新打包矩阵 A 在每次运行时都会产生开销。尽管存在开销传统的 GEMM实现还是出于以下两个原因对矩阵 A 进行重新打包a 缓存关联性及微内核效率受限。如果不重新打包微内核将不得不读取被潜在的大跨距隔开的几行A。如果这个跨距恰好是 2 的许多次幂的倍数面板中不同行 A 的元素可能会落入同一缓存集中。如果冲突的行数超过了缓存关联性它们就会相互驱逐性能也会大幅下降。b 打包对微内核效率的影响与当前所有移动处理器支持的 SIMD 向量指令的使用密切相关。这些指令加载、存储或者计算小型的固定大小元素向量而不是单个标量scalar。在矩阵相乘中充分利用向量指令达到高性能很重要。在传统的 GEMM 实现中微内核把 MR 元素重新打包到向量暂存器里的 MR 线路中。
优化实现 a 当面板适配一级缓存时不会存在缓存关联性及微内核效率受限的问题。b 在 QNNPACK 实现中MR 元素在存储中不是连续的微内核需要把它们加载到不同的向量暂存器中。越来越大的暂存器压力迫使 QNNPACK 使用较小的 MRxNR 拼贴但实际上这种差异很小而且可以通过消除打包开销来补偿。例如在 32 位 ARM 架构上QNNPACK 使用 4×8 微内核其中 57% 的向量指令是乘-加另一方面gemmlowp 库使用效率稍高的 4×12 微内核其中 60% 的向量指令是乘-加。微内核加载 A 的多个行乘以 B 的满列结果相加然后完成再量化并记下量化和。A 和 B 的元素被量化为 8 位整数但乘积结果相加到 32 位。大部分 ARM 和 ARM64 处理器没有直接完成这一运算的指令所以它必须分解为多个支持运算。QNNPACK 提供微内核的两个版本其不同之处在于用于乘以 8 位值并将它们累加到 32 位的指令序列。
2) 从矩阵相乘到卷积 传统实现
简单的 1×1 卷积可直接映射到矩阵相乘
但对于具备较大卷积核、padding 或子采样步幅的卷积而言则并非如此。但是这些较复杂的卷积能够通过记忆变换 im2col 映射到矩阵相乘。对于每个输出像素im2col 复制输入图像的图像块并将其计算为 2D 矩阵。由于每个输出像素都受 KHxKWxC 输入像素值的影响KH 和 KW 分别指卷积核的高度和宽度C 指输入图像中的通道数因此该矩阵的大小是输入图像的 KHxKW 倍im2col 给内存占用和性能都带来了一定的开销。和 Caffe 一样大部分深度学习框架转而使用基于 im2col 的实现利用现有的高度优化矩阵相乘库来执行卷积操作。
优化实现
Facebook 研究者在 QNNPACK 中实现了一种更高效的算法。
他们没有变换卷积输入使其适应矩阵相乘的实现而是调整 PDOT 微内核的实现在运行中执行 im2col 变换。这样就无需将输入张量的实际输入复制到 im2col 缓存而是使用输入像素行的指针设置 indirection buffer输入像素与每个输出像素的计算有关。研究者还修改了矩阵相乘微内核以便从 indirection buffer 加载虚构矩阵imaginary matrixA 的行指针indirection buffer 通常比 im2col buffer 小得多。此外如果两次推断运行的输入张量存储位置不变则 indirection buffer 还可使用输入张量行的指针进行初始化然后在多次推断运行中重新使用。研究者观察到具备 indirection buffer 的微内核不仅消除了 im2col 变换的开销其性能也比矩阵相乘微内核略好可能由于输入行在计算不同输出像素时被重用。
3) 深度卷积 分组卷积grouped convolution将输入和输出通道分割成多组然后对每个组进行分别处理。在有限条件下当组数等于通道数时该卷积就是深度卷积常用于当前的神经网络架构中。深度卷积对每个通道分别执行空间滤波展示了与正常卷积非常不同的计算模式。因此通常要向深度卷积提供单独实现QNNPACK 包括一个高度优化版本 3×3 深度卷积。
深度卷积的传统实现是每次都在卷积核元素上迭代然后将一个卷积核行和一个输入行的结果累加到输出行。对于一个 3×3 的深度卷积此类实现将把每个输出行更新 9 次。在 QNNPACK 中研究者计算所有 3×3 卷积核行和 3×3 输入行的结果一次性累加到输出行然后再处理下个输出行。
QNNPACK 实现高性能的关键因素在于完美利用通用暂存器GPR来展开卷积核元素上的循环同时避免在 hot loop 中重新加载地址寄存器。32-bit ARM 架构将实现限制在 14 个 GPR。在 3×3 深度卷积中需要读取 9 个输入行和 9 个卷积核行。这意味着如果想完全展开循环必须存储 18 个地址。然而实践中推断时卷积核不会发生变化。因此 Facebook 研究者使用之前在 CxKHxKW 中的滤波器将它们封装进 [C/8]xKWxKHx8这样就可以仅使用具备地址增量address increment的一个 GPR 访问所有滤波器。研究者使用数字 8 的原因在于在一个命令中加载 8 个元素然后减去零在 128-bit NEON 暂存器中生成 8 个 16-bit 值。然后使用 9 个输入行指针指针将滤波器重新装进 10 个 GPR完全展开滤波器元素上的循环。64-bit ARM 架构相比 32-bit 架构GPR 的数量翻了一倍。QNNPACK 利用额外的 ARM64 GPR一次性存储 3×5 输入行的指针并计算 3 个输出行。
7、性能优势
测试结果显示出 QNNPACK 在端到端基准上的性能优势。在量化当前最优 MobileNetV2 架构上基于QNNPACK 的 Caffe2 算子的速度大约是 TensorFlow Lite 速度的 2 倍在多种手机上都是如此。除了 QNNPACK 之外Facebook 还开源了 Caffe2 quantized MobileNet v2 模型其 top-1 准确率比相应的 TensorFlow 模型高出 1.3%。
MobileNetV1
MobileNetV1 架构在使用深度卷积depthwise convolution使模型更适合移动设备方面具备开创性。MobileNetV1 包括几乎整个 1×1 卷积和 3×3 卷积。Facebook 研究者将量化 MobileNetV1 模型从 TensorFlow Lite 转换而来并在 TensorFlow Lite 和 QNNPACK 的 32-bit ARM 设备上对 MobileNetV1 进行基准测试。二者运行时均使用 4 线程研究者观察到 QNNPACK 的运行速度几何平均值是 TensorFlow Lite 的 1.8 倍。 MobileNetV2
作为移动视觉任务的当前最优架构之一MobileNetV2 引入了瓶颈构造块和瓶颈之间的捷径连接。研究者在 MobileNetV2 分类模型的量化版上对比基于 QNNPACK 的 Caffe2 算子和 TensorFlow Lite 实现。使用的量化 Caffe2 MobileNetV2 模型已开源量化 TensorFlow Lite 模型来自官方库https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md。下表展示了二者在常用测试集上的 top1 准确率 Facebook 研究者利用这些模型建立了 Facebook AI 性能评估平台https://github.com/facebook/FAI-PEP的基准该基准基于 32-bit ARM 环境的大量手机设备。对于 TensorFlow Lite 线程设置研究者尝试了一到四个线程并报告了最快速的结果。结果显示 TensorFlow Lite 使用四线程的性能最优因此后续研究中使用四线程来对比 TensorFlow Lite 和 QNNPACK。下表展示了结果以及在典型智能手机和高端机上基于 QNNPACK 的算子速度比 TensorFlow Lite 快得多。 Facebook开源高性能内核库QNNPACK 百度安全验证 Facebook开源移动端深度学习加速框架比TensorFlow Lite快一倍_DW卷积
支持移动端深度学习的几种开源框架 支持移动端深度学习的几种开源框架_tiny-cnn 移动端-CSDN博客