xref: /aosp_15_r20/external/XNNPACK/README.md (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker# XNNPACK
2*4bdc9457SAndroid Build Coastguard Worker
3*4bdc9457SAndroid Build Coastguard WorkerXNNPACK is a highly optimized library of floating-point neural network inference operators for ARM, WebAssembly, and x86 platforms. XNNPACK is not intended for direct use by deep learning practitioners and researchers; instead it provides low-level performance primitives for accelerating high-level machine learning frameworks, such as [TensorFlow Lite](https://www.tensorflow.org/lite), [TensorFlow.js](https://www.tensorflow.org/js), [PyTorch](https://pytorch.org/), and [MediaPipe](https://mediapipe.dev).
4*4bdc9457SAndroid Build Coastguard Worker
5*4bdc9457SAndroid Build Coastguard Worker## Supported Architectures
6*4bdc9457SAndroid Build Coastguard Worker
7*4bdc9457SAndroid Build Coastguard Worker- ARM64 on Android, Linux, macOS, and iOS (including WatchOS and tvOS)
8*4bdc9457SAndroid Build Coastguard Worker- ARMv7 (with NEON) on Android
9*4bdc9457SAndroid Build Coastguard Worker- ARMv6 (with VFPv2) on Linux
10*4bdc9457SAndroid Build Coastguard Worker- x86 and x86-64 (up to AVX512) on Windows, Linux, macOS, Android, and iOS simulator
11*4bdc9457SAndroid Build Coastguard Worker- WebAssembly MVP
12*4bdc9457SAndroid Build Coastguard Worker- WebAssembly SIMD
13*4bdc9457SAndroid Build Coastguard Worker- RISC-V (RV32GV and RV64GC)
14*4bdc9457SAndroid Build Coastguard Worker
15*4bdc9457SAndroid Build Coastguard Worker## Operator Coverage
16*4bdc9457SAndroid Build Coastguard Worker
17*4bdc9457SAndroid Build Coastguard WorkerXNNPACK implements the following neural network operators:
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Worker- 2D Convolution (including grouped and depthwise)
20*4bdc9457SAndroid Build Coastguard Worker- 2D Deconvolution (AKA Transposed Convolution)
21*4bdc9457SAndroid Build Coastguard Worker- 2D Average Pooling
22*4bdc9457SAndroid Build Coastguard Worker- 2D Max Pooling
23*4bdc9457SAndroid Build Coastguard Worker- 2D ArgMax Pooling (Max Pooling + indices)
24*4bdc9457SAndroid Build Coastguard Worker- 2D Unpooling
25*4bdc9457SAndroid Build Coastguard Worker- 2D Bilinear Resize
26*4bdc9457SAndroid Build Coastguard Worker- 2D Depth-to-Space (AKA Pixel Shuffle)
27*4bdc9457SAndroid Build Coastguard Worker- Add (including broadcasting, two inputs only)
28*4bdc9457SAndroid Build Coastguard Worker- Subtract (including broadcasting)
29*4bdc9457SAndroid Build Coastguard Worker- Divide (including broadcasting)
30*4bdc9457SAndroid Build Coastguard Worker- Maximum (including broadcasting)
31*4bdc9457SAndroid Build Coastguard Worker- Minimum (including broadcasting)
32*4bdc9457SAndroid Build Coastguard Worker- Multiply (including broadcasting)
33*4bdc9457SAndroid Build Coastguard Worker- Squared Difference (including broadcasting)
34*4bdc9457SAndroid Build Coastguard Worker- Global Average Pooling
35*4bdc9457SAndroid Build Coastguard Worker- Channel Shuffle
36*4bdc9457SAndroid Build Coastguard Worker- Fully Connected
37*4bdc9457SAndroid Build Coastguard Worker- Abs (absolute value)
38*4bdc9457SAndroid Build Coastguard Worker- Bankers' Rounding (rounding to nearest, ties to even)
39*4bdc9457SAndroid Build Coastguard Worker- Ceiling (rounding to integer above)
40*4bdc9457SAndroid Build Coastguard Worker- Clamp (includes ReLU and ReLU6)
41*4bdc9457SAndroid Build Coastguard Worker- Convert (includes fixed-point and half-precision quantization and
42*4bdc9457SAndroid Build Coastguard Worker  dequantization)
43*4bdc9457SAndroid Build Coastguard Worker- Copy
44*4bdc9457SAndroid Build Coastguard Worker- ELU
45*4bdc9457SAndroid Build Coastguard Worker- Floor (rounding to integer below)
46*4bdc9457SAndroid Build Coastguard Worker- HardSwish
47*4bdc9457SAndroid Build Coastguard Worker- Leaky ReLU
48*4bdc9457SAndroid Build Coastguard Worker- Negate
49*4bdc9457SAndroid Build Coastguard Worker- Sigmoid
50*4bdc9457SAndroid Build Coastguard Worker- Softmax
51*4bdc9457SAndroid Build Coastguard Worker- Square
52*4bdc9457SAndroid Build Coastguard Worker- Transpose
53*4bdc9457SAndroid Build Coastguard Worker- Truncation (rounding to integer towards zero)
54*4bdc9457SAndroid Build Coastguard Worker- PReLU
55*4bdc9457SAndroid Build Coastguard Worker
56*4bdc9457SAndroid Build Coastguard WorkerAll operators in XNNPACK support NHWC layout, but additionally allow custom stride along the **C**hannel dimension. Thus, operators can consume a subset of channels in the input tensor, and produce a subset of channels in the output tensor, providing a zero-cost Channel Split and Channel Concatenation operations.
57*4bdc9457SAndroid Build Coastguard Worker
58*4bdc9457SAndroid Build Coastguard Worker## Performance
59*4bdc9457SAndroid Build Coastguard Worker
60*4bdc9457SAndroid Build Coastguard Worker### Mobile phones
61*4bdc9457SAndroid Build Coastguard Worker
62*4bdc9457SAndroid Build Coastguard WorkerThe table below presents **single-threaded** performance of XNNPACK library on three generations of MobileNet models and three generations of Pixel phones.
63*4bdc9457SAndroid Build Coastguard Worker
64*4bdc9457SAndroid Build Coastguard Worker| Model                   | Pixel, ms | Pixel 2, ms | Pixel 3a, ms |
65*4bdc9457SAndroid Build Coastguard Worker| ----------------------- | :-------: | :---------: | :----------: |
66*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v1 1.0X  |    82     |      86     |      88      |
67*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v2 1.0X  |    49     |      53     |      55      |
68*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Large |    39     |      42     |      44      |
69*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Small |    12     |      14     |      14      |
70*4bdc9457SAndroid Build Coastguard Worker
71*4bdc9457SAndroid Build Coastguard WorkerThe following table presents **multi-threaded** (using as many threads as there are big cores) performance of XNNPACK library on three generations of MobileNet models and three generations of Pixel phones.
72*4bdc9457SAndroid Build Coastguard Worker
73*4bdc9457SAndroid Build Coastguard Worker| Model                   | Pixel, ms | Pixel 2, ms | Pixel 3a, ms |
74*4bdc9457SAndroid Build Coastguard Worker| ----------------------- | :-------: | :---------: | :----------: |
75*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v1 1.0X  |    43     |      27     |      46      |
76*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v2 1.0X  |    26     |      18     |      28      |
77*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Large |    22     |      16     |      24      |
78*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Small |     7     |       6     |       8      |
79*4bdc9457SAndroid Build Coastguard Worker
80*4bdc9457SAndroid Build Coastguard WorkerBenchmarked on March 27, 2020 with `end2end_bench --benchmark_min_time=5` on an Android/ARM64 build with Android NDK r21 (`bazel build -c opt --config android_arm64 :end2end_bench`) and neural network models with randomized weights and inputs.
81*4bdc9457SAndroid Build Coastguard Worker
82*4bdc9457SAndroid Build Coastguard Worker### Raspberry Pi
83*4bdc9457SAndroid Build Coastguard Worker
84*4bdc9457SAndroid Build Coastguard WorkerThe table below presents **multi-threaded** performance of XNNPACK library on three generations of MobileNet models and three generations of Raspberry Pi boards.
85*4bdc9457SAndroid Build Coastguard Worker
86*4bdc9457SAndroid Build Coastguard Worker| Model                   | RPi Zero W (BCM2835), ms | RPi 2 (BCM2836), ms | RPi 3+ (BCM2837B0), ms | RPi 4 (BCM2711), ms | RPi 4 (BCM2711, ARM64), ms |
87*4bdc9457SAndroid Build Coastguard Worker| ----------------------- | :----------------------: | :-----------------: | :--------------------: | :-----------------: | :------------------------: |
88*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v1 1.0X  |          3919            |         302         |          114           |          72         |             77             |
89*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v2 1.0X  |          1987            |         191         |           79           |          41         |             46             |
90*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Large |          1658            |         161         |           67           |          38         |             40             |
91*4bdc9457SAndroid Build Coastguard Worker| FP32 MobileNet v3 Small |           474            |          50         |           22           |          13         |             15             |
92*4bdc9457SAndroid Build Coastguard Worker| INT8 MobileNet v1 1.0X  |          2589            |         128         |           46           |          29         |             24             |
93*4bdc9457SAndroid Build Coastguard Worker| INT8 MobileNet v2 1.0X  |          1495            |          82         |           30           |          20         |             17             |
94*4bdc9457SAndroid Build Coastguard Worker
95*4bdc9457SAndroid Build Coastguard WorkerBenchmarked on Feb 8, 2022 with `end2end-bench --benchmark_min_time=5` on a Raspbian Buster build with CMake (`./scripts/build-local.sh`) and neural network models with randomized weights and inputs. INT8 inference was evaluated on per-channel quantization schema.
96*4bdc9457SAndroid Build Coastguard Worker
97*4bdc9457SAndroid Build Coastguard Worker## Publications
98*4bdc9457SAndroid Build Coastguard Worker
99*4bdc9457SAndroid Build Coastguard Worker- Marat Dukhan "The Indirect Convolution Algorithm". Presented on [Efficient Deep Learning for Compute Vision (ECV) 2019](https://sites.google.com/corp/view/ecv2019/) workshop ([slides](https://drive.google.com/file/d/1ZayB3By5ZxxQIRtN7UDq_JvPg1IYd3Ac/view), [paper on ArXiv](https://arxiv.org/abs/1907.02129)).
100*4bdc9457SAndroid Build Coastguard Worker- Erich Elsen, Marat Dukhan, Trevor Gale, Karen Simonyan "Fast Sparse ConvNets".
101*4bdc9457SAndroid Build Coastguard Worker  [Paper on ArXiv](https://arxiv.org/abs/1911.09723), [pre-trained sparse
102*4bdc9457SAndroid Build Coastguard Worker  models](https://github.com/google-research/google-research/tree/master/fastconvnets).
103*4bdc9457SAndroid Build Coastguard Worker- Marat Dukhan, Artsiom Ablavatski "The Two-Pass Softmax Algorithm".
104*4bdc9457SAndroid Build Coastguard Worker  [Paper on ArXiv](https://arxiv.org/abs/2001.04438).
105*4bdc9457SAndroid Build Coastguard Worker- Yury Pisarchyk, Juhyun Lee "Efficient Memory Management for Deep Neural Net Inference".
106*4bdc9457SAndroid Build Coastguard Worker  [Paper on ArXiv](https://arxiv.org/abs/2001.03288).
107*4bdc9457SAndroid Build Coastguard Worker
108*4bdc9457SAndroid Build Coastguard Worker## Ecosystem
109*4bdc9457SAndroid Build Coastguard Worker
110*4bdc9457SAndroid Build Coastguard Worker### Machine Learning Frameworks
111*4bdc9457SAndroid Build Coastguard Worker
112*4bdc9457SAndroid Build Coastguard Worker- [TensorFlow Lite](https://blog.tensorflow.org/2020/07/accelerating-tensorflow-lite-xnnpack-integration.html).
113*4bdc9457SAndroid Build Coastguard Worker- [TensorFlow.js WebAssembly backend](https://blog.tensorflow.org/2020/03/introducing-webassembly-backend-for-tensorflow-js.html).
114*4bdc9457SAndroid Build Coastguard Worker- [PyTorch Mobile](https://pytorch.org/mobile).
115*4bdc9457SAndroid Build Coastguard Worker- [MediaPipe for the Web](https://developers.googleblog.com/2020/01/mediapipe-on-web.html).
116*4bdc9457SAndroid Build Coastguard Worker- [Alibaba HALO (Heterogeneity-Aware Lowering and Optimization)](https://github.com/alibaba/heterogeneity-aware-lowering-and-optimization)
117*4bdc9457SAndroid Build Coastguard Worker- [Samsung ONE (On-device Neural Engine)](https://github.com/Samsung/ONE)
118*4bdc9457SAndroid Build Coastguard Worker
119*4bdc9457SAndroid Build Coastguard Worker## Acknowledgements
120*4bdc9457SAndroid Build Coastguard Worker
121*4bdc9457SAndroid Build Coastguard WorkerXNNPACK is a based on [QNNPACK](https://github.com/pytorch/QNNPACK) library. Over time its codebase diverged a lot, and XNNPACK API is no longer compatible with QNNPACK.
122