google/XNNPACK

GitHub: google/XNNPACK

一个跨平台的高效神经网络推理算子库,为移动端、服务器和 Web 端的机器学习框架提供底层加速原语。

Stars: 2285 | Forks: 472

# XNNPACK XNNPACK 是一个针对 ARM、x86、WebAssembly 和 RISC-V 平台上神经网络推理的高度优化解决方案。XNNPACK 并非旨在供深度学习从业者和研究人员直接使用;相反,它提供了低级性能原语,用于加速高级机器学习框架,例如 [TensorFlow Lite](https://www.tensorflow.org/lite)、[TensorFlow.js](https://www.tensorflow.org/js)、[PyTorch](https://pytorch.org/)、[ONNX Runtime](https://onnxruntime.ai)、[ExecuTorch](https://pytorch.org/executorch-overview) 和 [MediaPipe](https://mediapipe.dev)。 ## 支持的架构 - Android、iOS、macOS、Linux 和 Windows 上的 ARM64 - Android 上的 ARMv7(带 NEON) - Linux 上的 ARMv6(带 VFPv2) - Windows、Linux、macOS、Android 和 iOS 模拟器上的 x86 和 x86-64(最高支持 AVX512) - WebAssembly MVP - WebAssembly SIMD - [WebAssembly Relaxed SIMD](https://github.com/WebAssembly/relaxed-simd)(实验性) - RISC-V(RV32GC 和 RV64GC) - Hexagon(带 HVX) ## 算子覆盖范围 XNNPACK 实现了以下神经网络算子: - 2D Convolution(包括分组和深度可分离) - 2D Deconvolution(亦称 Transposed Convolution) - 2D Average Pooling - 2D Max Pooling - 2D ArgMax Pooling(Max Pooling + 索引) - 2D Unpooling - 2D Bilinear Resize - 2D Depth-to-Space(亦称 Pixel Shuffle) - Add(包括广播,仅限两个输入) - Subtract(包括广播) - Divide(包括广播) - Maximum(包括广播) - Minimum(包括广播) - Multiply(包括广播) - Squared Difference(包括广播) - Global Average Pooling - Channel Shuffle - Fully Connected - Abs(绝对值) - Bankers' Rounding(四舍六入五成双) - Ceiling(向上取整) - Clamp(包括 ReLU 和 ReLU6) - Convert(包括定点和半精度量化及 反量化) - Copy - ELU - Floor(向下取整) - HardSwish - Leaky ReLU - Negate - Sigmoid - Softmax - Square - Tanh - Transpose - Truncation(向零取整) - PReLU XNNPACK 中的所有算子都支持 NHWC 布局,但额外允许沿 **C**hannel 维度的自定义步长。因此,算子可以使用输入张量中的一个通道子集,并在输出张量中生成一个通道子集,从而提供零成本的 Channel Split 和 Channel Concatenation 操作。 ## 性能 ### 移动电话 下表展示了 XNNPACK 库在三款 MobileNet 模型和三代 Pixel 手机上的**单线程**性能。 | Model | Pixel, ms | Pixel 2, ms | Pixel 3a, ms | | ----------------------- | :-------: | :---------: | :----------: | | FP32 MobileNet v1 1.0X | 82 | 86 | 88 | | FP32 MobileNet v2 1.0X | 49 | 53 | 55 | | FP32 MobileNet v3 Large | 39 | 42 | 44 | | FP32 MobileNet v3 Small | 12 | 14 | 14 | 下表展示了 XNNPACK 库在三款 MobileNet 模型和三代 Pixel 手机上的**多线程**(使用与大核心数量相同的线程)性能。 | Model | Pixel, ms | Pixel 2, ms | Pixel 3a, ms | | ----------------------- | :-------: | :---------: | :----------: | | FP32 MobileNet v1 1.0X | 43 | 27 | 46 | | FP32 MobileNet v2 1.0X | 26 | 18 | 28 | | FP32 MobileNet v3 Large | 22 | 16 | 24 | | FP32 MobileNet v3 Small | 7 | 6 | 8 | 基准测试于 2020 年 3 月 27 日进行,使用 `end2end_bench --benchmark_min_time=5`,基于 Android/ARM64 构建(使用 Android NDK r21:`bazel build -c opt --config android_arm64 :end2end_bench`),神经网络模型采用随机权重和输入。 ### Raspberry Pi 下表展示了 XNNPACK 库在三款 MobileNet 模型和三代 Raspberry Pi 开发板上的**多线程**性能。 | Model | RPi Zero W (BCM2835), ms | RPi 2 (BCM2836), ms | RPi 3+ (BCM2837B0), ms | RPi 4 (BCM2711), ms | RPi 4 (BCM2711, ARM64), ms | | ----------------------- | :----------------------: | :-----------------: | :--------------------: | :-----------------: | :------------------------: | | FP32 MobileNet v1 1.0X | 3919 | 302 | 114 | 72 | 77 | | FP32 MobileNet v2 1.0X | 1987 | 191 | 79 | 41 | 46 | | FP32 MobileNet v3 Large | 1658 | 161 | 67 | 38 | 40 | | FP32 MobileNet v3 Small | 474 | 50 | 22 | 13 | 15 | | INT8 MobileNet v1 1.0X | 2589 | 128 | 46 | 29 | 24 | | INT8 MobileNet v2 1.0X | 1495 | 82 | 30 | 20 | 17 | 基准测试于 2022 年 2 月 8 日进行,使用 `end2end-bench --benchmark_min_time=5`,基于 Raspbian Buster 构建并使用 CMake(`./scripts/build-local.sh`),神经网络模型采用随机权重和输入。INT8 推理在逐通道量化模式下进行评估。 ## 最低构建要求 - C11 - C++17 - Python 3 ## 出版物 - Marat Dukhan “The Indirect Convolution Algorithm”。发表于 [Efficient Deep Learning for Compute Vision (ECV) 2019](https://sites.google.com/corp/view/ecv2019/) 研讨会([幻灯片](https://drive.google.com/file/d/1ZayB3By5ZxxQIRtN7UDq_JvPg1IYd3Ac/view),[ArXiv 论文](https://arxiv.org/abs/1907.02129))。 - Erich Elsen, Marat Dukhan, Trevor Gale, Karen Simonyan “Fast Sparse ConvNets”。 [ArXiv 论文](https://arxiv.org/abs/1911.09723),[预训练稀疏 模型](https://github.com/google-research/google-research/tree/master/fastconvnets)。 - Marat Dukhan, Artsiom Ablavatski “The Two-Pass Softmax Algorithm”。 [ArXiv 论文](https://arxiv.org/abs/2001.04438)。 - Yury Pisarchyk, Juhyun Lee “Efficient Memory Management for Deep Neural Net Inference”。 [ArXiv 论文](https://arxiv.org/abs/2001.03288)。 ## 生态系统 ### 机器学习框架 - [TensorFlow Lite](https://blog.tensorflow.org/2020/07/accelerating-tensorflow-lite-xnnpack-integration.html)。 - [TensorFlow.js WebAssembly backend](https://blog.tensorflow.org/2020/03/introducing-webassembly-backend-for-tensorflow-js.html)。 - [PyTorch Mobile](https://pytorch.org/mobile)。 - [ONNX Runtime Mobile](https://onnxruntime.ai/docs/execution-providers/Xnnpack-ExecutionProvider.html) - [MediaPipe for the Web](https://developers.googleblog.com/2020/01/mediapipe-on-web.html)。 - [Alibaba HALO (Heterogeneity-Aware Lowering and Optimization)](https://github.com/alibaba/heterogeneity-aware-lowering-and-optimization) - [Samsung ONE (On-device Neural Engine)](https://github.com/Samsung/ONE) ## 致谢 XNNPACK 基于 [QNNPACK](https://github.com/pytorch/QNNPACK) 库。随着时间的推移,其代码库发生了很大分歧,并且 XNNPACK API 不再与 QNNPACK 兼容。
标签:AI工具, AVX512, C++, HVX, MediaPipe, NEON, ONNX Runtime, PyTorch, RISC-V, SIMD加速, TensorFlow Lite, WebAssembly, x86, 前端AI, 卷积神经网络, 图像处理算法, 客户端加密, 底层库, 数据擦除, 服务端推理, 模型部署, 浮点运算, 深度学习, 神经网络推理, 移动端推理, 算子优化, 算子库, 计算机视觉, 边缘计算, 逆向工具, 量化推理, 高性能计算