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, 卷积神经网络, 图像处理算法, 客户端加密, 底层库, 数据擦除, 服务端推理, 模型部署, 浮点运算, 深度学习, 神经网络推理, 移动端推理, 算子优化, 算子库, 计算机视觉, 边缘计算, 逆向工具, 量化推理, 高性能计算