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.4.0.tar.gz (295.0 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.4.0-cp312-cp312-win_amd64.whl (6.8 MB view details)

Uploaded CPython 3.12Windows x86-64

pywebnn-0.4.0-cp312-cp312-manylinux_2_28_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

pywebnn-0.4.0-cp312-cp312-manylinux_2_28_aarch64.whl (8.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

pywebnn-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (7.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pywebnn-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl (8.8 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pywebnn-0.4.0.tar.gz
Algorithm Hash digest
SHA256 b80bbef8716ba7b5f82401dcb63d82b917a315a12b3fc56a1304dd1815cf6cb7
MD5 24ce99526fed854f7305ad0a60995ce6
BLAKE2b-256 4ab24bf1cbf5cb67277b5165155ac98d1e1d0421ab90b3fe9819c739989fadfe

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pywebnn-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 6.8 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.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e486b7be925f7a58fb4c671f471c70de9b04b665bb1c9735c46369b0ad34d880
MD5 0d4b93ac504c51cc64b6007773646128
BLAKE2b-256 e93924653be8a11c1fe7f894ec17fd8c4e0d4d83938530e1dc029e20050f9e1b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pywebnn-0.4.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 642e7070dfa92034bfb4b86354b62fd3c548d47e8e652f5926b6ecd577ad64e8
MD5 0daf1406b45a23fd7896f9aa153f63da
BLAKE2b-256 bd1c144f2d7e7c6e2fe3358f4048171d9387f3b3000a418f0955687d82cd3641

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pywebnn-0.4.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 559db48126793818f5042ddcb1eb8983cc5192a4f53632fc0f6f86936e85c789
MD5 4fce000e776b2571f7dfc584684f4836
BLAKE2b-256 7a85ece5a1e34af67abb06e81e600070f84e7c0bf35fd3e186fc23ad97750d13

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pywebnn-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a5fb4caf268eecca3d2eda288b910d4c982cf775e39ea6b34efe97d0fefdbfe9
MD5 2422f09ce6e377c305522d4c59e279a6
BLAKE2b-256 edc1cb396fc4ad23ff05e0a130d234f02beb8aed295da1b37330bfbee7140371

See more details on using hashes here.

Provenance

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

File details

Details for the file pywebnn-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pywebnn-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fc852aed6a2f9b118cd4b0f369db2f0f2e4220b4211cc8fe9a098f236bdee01b
MD5 fe4106345cd664ab320c96fb894bf251
BLAKE2b-256 235d0f0dd0334e14afc02a31f1bb30b3ca71fb569b0be746f0301a1d30ce176c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywebnn-0.4.0-cp312-cp312-macosx_10_12_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.

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