Skip to main content

EXPERIMENTAL: Python bindings for W3C WebNN API - Neural network graph validation, ONNX/CoreML conversion, and cross-platform execution with CPU/GPU/NPU support

Project description

rustnn logo

rustnn / PyWebNN

A Rust implementation of WebNN graph handling with Python bindings that implement the W3C WebNN API specification.


[WARNING] EXPERIMENTAL - DO NOT USE IN PRODUCTION

This is an early-stage experimental implementation for research and exploration. Many features are incomplete, untested, or may change significantly.


What is rustnn?

rustnn provides:

  • Rust Library: Validates WebNN graphs and converts to ONNX/CoreML formats
  • Python API: Complete W3C WebNN API implementation via PyO3 bindings
  • Runtime Backends: Execute on CPU, GPU, or Neural Engine with backend selection at context creation
  • Real Examples: Complete MobileNetV2 (99.60% accuracy) and Transformer text generation

Installation

Python Package (PyWebNN)

PyPI Package (v0.4.0+):

# Install with bundled ONNX Runtime - no additional dependencies needed
pip install pywebnn

# Works immediately with actual execution (no zeros)

Build from Source (For Development):

git clone https://github.com/tarekziade/rustnn.git
cd rustnn
make python-dev  # Sets up venv and builds with ONNX Runtime + CoreML
source .venv-webnn/bin/activate

Requirements: Python 3.11+, NumPy 1.20+

Note: Version 0.4.0+ includes bundled ONNX Runtime. Earlier versions (0.3.0 and below) had no backends and returned zeros.

Rust Library

[dependencies]
rustnn = "0.1"

Quick Start

import webnn
import numpy as np

# Create ML context with device hints
ml = webnn.ML()
context = ml.create_context(accelerated=False)  # CPU execution
builder = context.create_graph_builder()

# Build a simple graph: output = relu(x + y)
x = builder.input("x", [2, 3], "float32")
y = builder.input("y", [2, 3], "float32")
z = builder.add(x, y)
output = builder.relu(z)

# Compile the graph
graph = builder.build({"output": output})

# Execute with real data
x_data = np.array([[1, -2, 3], [4, -5, 6]], dtype=np.float32)
y_data = np.array([[-1, 2, -3], [-4, 5, -6]], dtype=np.float32)
results = context.compute(graph, {"x": x_data, "y": y_data})

print(results["output"])  # [[0. 0. 0.] [0. 0. 0.]]

# Optional: Export to ONNX
context.convert_to_onnx(graph, "model.onnx")

Backend Selection

Following the W3C WebNN Device Selection spec, backends are selected via hints:

# CPU-only execution
context = ml.create_context(accelerated=False)

# Request GPU/NPU (platform selects best available)
context = ml.create_context(accelerated=True)

# Request high-performance (prefers GPU)
context = ml.create_context(accelerated=True, power_preference="high-performance")

# Request low-power (prefers NPU/Neural Engine)
context = ml.create_context(accelerated=True, power_preference="low-power")

Platform-Specific Backends:

  • NPU: CoreML Neural Engine (Apple Silicon macOS only)
  • GPU: ONNX Runtime GPU (cross-platform) or CoreML GPU (macOS)
  • CPU: ONNX Runtime CPU (cross-platform)

Examples

Complete MobileNetV2 Image Classification

# Download pretrained weights (first time only)
bash scripts/download_mobilenet_weights.sh

# Run on different backends
python examples/mobilenetv2_complete.py examples/images/test.jpg --backend cpu
python examples/mobilenetv2_complete.py examples/images/test.jpg --backend gpu
python examples/mobilenetv2_complete.py examples/images/test.jpg --backend coreml

Output:

Top 5 Predictions (Real ImageNet Labels):
  1. lesser panda                                        99.60%
  2. polecat                                              0.20%
  3. weasel                                               0.09%

Performance: 74.41ms (CPU) / 77.14ms (GPU) / 51.93ms (CoreML)

Text Generation with Transformer Attention

# Run generation with attention
make text-gen-demo

# Train on custom text
make text-gen-train

# Generate with trained weights
make text-gen-trained

See examples/ for more samples.

Documentation

Implementation Status

  • 85 of ~95 WebNN operations (89% spec coverage)
  • Shape inference: 85/85 (100%)
  • Python API: 85/85 (100%)
  • ONNX Backend: 85/85 (100%)
  • CoreML MLProgram: 85/85 (100%)
  • 1350+ WPT conformance tests passing

See docs/development/implementation-status.md for complete details.

Rust CLI Usage

# Validate a graph
cargo run -- examples/sample_graph.json

# Visualize a graph (requires graphviz)
cargo run -- examples/sample_graph.json --export-dot graph.dot
dot -Tpng graph.dot -o graph.png

# Convert to ONNX
cargo run -- examples/sample_graph.json --convert onnx --convert-output model.onnx

# Execute with ONNX Runtime
cargo run --features onnx-runtime -- examples/sample_graph.json --convert onnx --run-onnx

See make help for all available targets.

Contributing

Contributions welcome! Please see:

Quick Contribution Guide:

  1. Fork and create feature branch: git checkout -b feature/my-feature
  2. Install hooks (optional): ./scripts/install-git-hooks.sh
  3. Make changes and test: make test && make python-test
  4. Format code: make fmt
  5. Commit and push

License

Licensed under the Apache License, Version 2.0. See LICENSE for details.

Links

Acknowledgments

  • W3C WebNN Community Group for the specification
  • Chromium WebNN implementation for reference
  • PyO3 and Maturin projects for excellent Python-Rust integration

Made with Rust by Tarek Ziade

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pywebnn-0.5.10.tar.gz (304.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pywebnn-0.5.10-cp312-cp312-win_amd64.whl (7.0 MB view details)

Uploaded CPython 3.12Windows x86-64

pywebnn-0.5.10-cp312-cp312-manylinux_2_28_x86_64.whl (10.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

pywebnn-0.5.10-cp312-cp312-manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

pywebnn-0.5.10-cp312-cp312-macosx_11_0_arm64.whl (25.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file pywebnn-0.5.10.tar.gz.

File metadata

  • Download URL: pywebnn-0.5.10.tar.gz
  • Upload date:
  • Size: 304.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pywebnn-0.5.10.tar.gz
Algorithm Hash digest
SHA256 ad523f821d44e61547618c9cb640cdc1d2868b20f973123112a3ac636205b878
MD5 3cefe6c9fc6280b651da83321c912677
BLAKE2b-256 603cd2eda8b33be22bb7d9089141bfdf06ed86b1f24539eab65179d8f0d5a749

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.10.tar.gz:

Publisher: publish-pypi.yml on tarekziade/rustnn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pywebnn-0.5.10-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pywebnn-0.5.10-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 7.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pywebnn-0.5.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4a613af871775c3ba32b189eeb6db6db04d0c6f1096822d56d30880152cdf3c5
MD5 c9de0a44faa0c83a64e7e288e2b2452b
BLAKE2b-256 70219099371ad5d2aede35340601a7be9a7a4653c0e9c2640ff17ae166b79f58

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.10-cp312-cp312-win_amd64.whl:

Publisher: publish-pypi.yml on tarekziade/rustnn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pywebnn-0.5.10-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.10-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3b7a650d8b8847d955aab31eb607eac6ae160f66c63c796ba767d4cac326dbf7
MD5 4ac4a46e5557347336f2f90065871701
BLAKE2b-256 5617c32cc85f0170d5e30114583342a7b770cb0caa00f029fa46fb2de687191d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.10-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on tarekziade/rustnn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pywebnn-0.5.10-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.10-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9b40ac4eb1670e509f640e727819cb34c2b5f91bd53f8e8cec533cd291459f30
MD5 85e05899ca70f5bf9bd64a2928d48812
BLAKE2b-256 5e10d71022d603241e2ca43e2eee07b34070abe25b4f42c49ae8c6e3eeca1aa6

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.10-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: publish-pypi.yml on tarekziade/rustnn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pywebnn-0.5.10-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 114f21abbff97951ee376b96bfc26dac8a17a17ec699845c4af339fe5f84ec83
MD5 4c3f2b80d99cf65c6401f68c3c2bc8e2
BLAKE2b-256 ee6a13794f3f43270f495bf6c099bc8b80ab2b7c16e96b242a0b332e5d1f5dc4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.10-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on tarekziade/rustnn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page