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