SkillAgentSearch skills...

XNNPACK

High-efficiency floating-point neural network inference operators for mobile, server, and Web

Install / Use

/learn @google/XNNPACK

README

XNNPACK

XNNPACK is a highly optimized solution for neural network inference on ARM, x86, WebAssembly, and RISC-V 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, TensorFlow.js, PyTorch, ONNX Runtime, ExecuTorch, and MediaPipe.

Supported Architectures

  • ARM64 on Android, iOS, macOS, Linux, and Windows
  • ARMv7 (with NEON) on Android
  • ARMv6 (with VFPv2) on Linux
  • x86 and x86-64 (up to AVX512) on Windows, Linux, macOS, Android, and iOS simulator
  • WebAssembly MVP
  • WebAssembly SIMD
  • WebAssembly Relaxed SIMD (experimental)
  • RISC-V (RV32GC and RV64GC)
  • Hexagon (with HVX)

Operator Coverage

XNNPACK implements the following neural network operators:

  • 2D Convolution (including grouped and depthwise)
  • 2D Deconvolution (AKA Transposed Convolution)
  • 2D Average Pooling
  • 2D Max Pooling
  • 2D ArgMax Pooling (Max Pooling + indices)
  • 2D Unpooling
  • 2D Bilinear Resize
  • 2D Depth-to-Space (AKA Pixel Shuffle)
  • Add (including broadcasting, two inputs only)
  • Subtract (including broadcasting)
  • Divide (including broadcasting)
  • Maximum (including broadcasting)
  • Minimum (including broadcasting)
  • Multiply (including broadcasting)
  • Squared Difference (including broadcasting)
  • Global Average Pooling
  • Channel Shuffle
  • Fully Connected
  • Abs (absolute value)
  • Bankers' Rounding (rounding to nearest, ties to even)
  • Ceiling (rounding to integer above)
  • Clamp (includes ReLU and ReLU6)
  • Convert (includes fixed-point and half-precision quantization and dequantization)
  • Copy
  • ELU
  • Floor (rounding to integer below)
  • HardSwish
  • Leaky ReLU
  • Negate
  • Sigmoid
  • Softmax
  • Square
  • Tanh
  • Transpose
  • Truncation (rounding to integer towards zero)
  • PReLU

All operators in XNNPACK support NHWC layout, but additionally allow custom stride along the Channel 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.

Performance

Mobile phones

The table below presents single-threaded performance of XNNPACK library on three generations of MobileNet models and three generations of Pixel phones.

| 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 |

The 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.

| 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 |

Benchmarked 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.

Raspberry Pi

The table below presents multi-threaded performance of XNNPACK library on three generations of MobileNet models and three generations of Raspberry Pi boards.

| 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 |

Benchmarked 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.

Minimum build requirements

  • C11
  • C++17
  • Python 3

Publications

Ecosystem

Machine Learning Frameworks

Acknowledgements

XNNPACK is based on QNNPACK library. Over time its codebase diverged a lot, and XNNPACK API is no longer compatible with QNNPACK.

Related Skills

View on GitHub
GitHub Stars2.3k
CategoryDevelopment
Updated37m ago
Forks470

Languages

C

Security Score

85/100

Audited on Mar 26, 2026

No findings