WASM AI Experiments

Live WebAssembly + AI Experiments

Try out interactive demonstrations of WebAssembly accelerating artificial intelligence workloads across different domains.

Tensor Acceleration

Matrix operations in WebAssembly

Rust Implementation


#[wasm_bindgen]
pub fn matrix_mult(a: &[f32], b: &[f32]) -> Vec {
    let mut result = vec![0.0; 9];
    for i in 0..3 {
        for j in 0..3 {
            for k in 0..3 {
                result[i*3 + j] += a[i*3 + k] * b[k*3 + j];
            }
        }
    }
    result
}

This Rust function compiles to WebAssembly using wasm32-unknown-unknown target.

Performance

WebAssembly outperforms JavaScript in tensor operations by:

  • 800ms JavaScript vs 120ms WebAssembly
  • • 80% memory overhead reduction
  • • Native SIMD instruction access

Use wasm-bindgen + rustwasm toolchain for optimal performance

Model Compiler

ONNX to WebAssembly conversion

1. Select Model
onnx/resnet50

Step 1: Convert


$ onnx2wasm resnet50.onnx \
  --target wasm32 \
  --optimize \
  --output resnet50.wasm

Step 2: Load


const rust = wasm_bindgen(resnet50.wasm);
rust.then(obj => {
  obj.inference(input);
});

Output

  • • WebAssembly binary
  • • Text format (.wit)
  • • Memory layout spec

SIMD Acceleration

Vectorized operations in WebAssembly

WebAssembly SIMD Instructions

WebAssembly includes v128 vector registers capable of:

  • • 4x32bit floats
  • • 8x16bit integers
  • • 16x8bit instructions
v128.load
v128.store
v128.add
v128.mul

Performance Boost

SIMD acceleration provides 3-8× performance boost in matrix multiplication, image processing, and neural network operations.

Use wasmtime or wasm3 engines for best SIMD results

Get Started

1️⃣

Install Rust with WebAssembly target:

$ rustup target add wasm32-unknown-unknown
$ cargo install wasm-bindgen-cli
2️⃣

Create a new WASM project:

$ cargo new --lib wargml
$ cd wargml
$ cargo add wasm-bindgen
$ cargo add ndarray
3️⃣

Compile and test:

$ cargo build --target wasm32-unknown-unknown
$ wasm-bindgen target/wasm32-unknown-unknown/debug/libwargml.wasm --out-dir ./out