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.9.tar.gz (304.4 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.9-cp312-cp312-win_amd64.whl (7.0 MB view details)

Uploaded CPython 3.12Windows x86-64

pywebnn-0.5.9-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.9-cp312-cp312-manylinux_2_28_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

pywebnn-0.5.9-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.9.tar.gz.

File metadata

  • Download URL: pywebnn-0.5.9.tar.gz
  • Upload date:
  • Size: 304.4 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.9.tar.gz
Algorithm Hash digest
SHA256 9451f3a8ca667e53eb79aa843125bc68d0884970de55c06eabfb8f7d1ecfa681
MD5 2f2076d5b6b7a972b7a7e7ab48004939
BLAKE2b-256 960db0581431b6dd6b3dc2a18a9b00bb20adf490a885cbcd06d17757ca6bbe22

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.9.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.9-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pywebnn-0.5.9-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.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9ecaca410e30051542619f7d1c4ebb666390b4c069cd1dc57d3766622ad34327
MD5 786f8b8c99a894bae6953843f61cd228
BLAKE2b-256 5c5ad598289c096f087bd6fbed17358263da22c5f51be95b5e18d11100dd7819

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.9-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.9-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.9-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 87e80603f39f9a150113569a34d585aee080fdccf77ca852d2f68ec0faea89a7
MD5 e24648295f3d2d9860238c13ecc39300
BLAKE2b-256 879be1294d25e7d5203ffbd9f9692bc5a810df662f30c83e1dfd5e2624476697

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.9-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.9-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.9-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 620e73190d5ef84c920ada39b82ac652b154438afb3baa6a5e307a760e658e8c
MD5 9fa43a0887c9ab69343ef98edb4cb962
BLAKE2b-256 4b8d7cf7471728bb67e2bad60e998e985134b590e7a82a53c04bf350e43d74fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.9-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.9-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pywebnn-0.5.9-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f253e8370da1200bf3fd42abc184994c0a74cfb2634149082566d8d94c402753
MD5 b61dfb47292e311a0968274235855429
BLAKE2b-256 8f5fcf8d3ab09b056534972028219cd724807679ed9c813524c639dbefeb3c86

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.5.9-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