Bunsen
by ZSpaceLabs
bunsen aims to be a "batteries included" complementary
community standard library for extending the burn tensor library.
Book
Read the bunsen book
Organization
Burn Extensions
bunsen::burner- this is a library ofburn::module::Modulelifecycle components that extend the current functionality of burn.bunsen::burner::module::reflectionhas powerful tools for dynamicburn::module::Modulereflection.bunsen::burner::optimhas parameter-group optimizer extensions.
contracts- this is a library of runtime tensor-shape contracts.
Component Libraries
bunsen::blocks- this is a library ofburn::module::Modulecomponents. This includes simple inner layers, recurrent utility blocks, and entire model families.bunsen::ops- this is a libraryburn::tensor::Tensoroperations.bunsen::kits- this is a library of full models and simulation kits.bimm- image models:resnet,swinngpts- partial implementation ofnanochatsims-conwaygame of life,lbm2D fluid flow.speech- completesilero_vad, partialwhisper
App and Testing Support Libs
bunsen::errors- this is a library of error types and tooling.bunsen::support- this is a library of support functions for bunsen, including testing tooling which may be useful for clients.bunsen::zspace- this is a library of z-space / index utilities.
API Examples
A "good parts" survey of some of bunsen's features. See the
docs and the
book for the full API.
Shape Contracts
bunsen::contracts provides allocation-free, always-on runtime tensor-shape
contracts. A contract pairs paper-style shape notation with runtime checking:
it asserts that a tensor's shape matches a declared pattern and unpacks named
dimensions for downstream use, catching shape errors at their source. Single
checks run in ~160 ns; the amortized periodic variants average a few ns.
use *;
// Assert and unpack named dimensions in one shot:
let shape = ;
let = unpack_shape_contract!;
assert_eq!;
// Patterns support products, sums, and bound dimensions — e.g. a windowed
// image where height = h_wins * window_size:
let = unpack_shape_contract!;
In hot loops, use assert_shape_contract_periodically! to amortize the check
via exponential backoff while still catching regressions:
use *;
assert_shape_contract_periodically!;
TensorData Index Views
TensorDataIndexView and TensorDataIndexMutView wrap burn's low-level
TensorData to give ergonomic multi-dimensional element access via bracket
notation — view[&[i, j]] — instead of manually flattening indices. The views
deref to the underlying TensorData, so .shape and friends are right there.
Handy for inspecting or patching raw tensor data without building full tensors.
use *;
use *;
let data = from;
let view: = view;
// Deref exposes the underlying TensorData metadata:
assert_eq!;
assert_eq!;
assert_eq!;
The mut view supports in-place writes:
use *;
use *;
let mut data = from;
let mut view: = view;
view = 10.0;
assert_eq!;
XML Module Reflection
bunsen::burner::module::reflection::XmlModuleTree turns any burn Module
into a queryable XML meta-description of its structure. This enables
type-erased introspection and XPath-style parameter selection — e.g. "every
rank-2 weight under the transformer blocks" — which is exactly what you need to
slice a model into parameter groups for per-group optimizers.
Take a small container module:
use ;
use *;
let module = ;
Reflecting it yields a queryable XML description of the structure:
use XmlModuleTree;
// As XmlModuleTree holds a non-Send active query environment, it must be `mut`
// to run queries.
let mut mtree = build;
// Dump the structure to inspect it:
println!;
// Select parameters by XPath and collect their ParamIds — e.g. just the
// rank-2 Linear weights:
let matrix_params = mtree
.select_params
.to_param_ids ?;
The dumped structure mirrors the module's fields, with each @name taken from
the struct field and a stable param_id per tensor:
Blocks & Ops
bunsen::blocks is a library of burn::module::Module building blocks (stateful
layers with trainable parameters), and bunsen::ops is a library of stateless
Tensor operations. A survey of what's available:
blocks/
├── transformers/
│ ├── attention — CausalSelfAttention, scaled_dot_product_attention,
│ │ causal_mask, KVCache (autoregressive decode cache)
│ ├── embedding — RotaryEmbedding (RoPE)
│ └── mlp — Mlp feed-forward block, layer_norm_mlp
└── images/
├── conv — ConvNorm2d, ConvBlock2d (Conv → Norm → Activation)
├── patching — PatchEmbed (ViT-style patch tokenizer)
├── pool — AvgPool2dSame (TF-style SAME padding)
└── drop — DropBlock2d, DropPath (stochastic depth)
ops/
├── arange — float_arange, float_linspace (+ Vec variants)
├── noise — noise, noise_like (distribution sampling + clamp)
├── clamp — ClampOp (optional min/max bounds)
├── drop — dropout, drop_block_2d
├── norm — rms_norm (RMS normalization)
├── repeat — repeat_interleave (NumPy/PyTorch semantics)
├── conv — conv output-shape arithmetic, same-padding helpers,
│ convolve_func_2d
└── embedding — unembed, iota_embedding, identity_embedding
Examples
The bunsen repo includes a number of complex demos. The goal of the demos is to showcase the capabilities of the
library; while also collecting a working edge of problems which could and should be improved by further development.
See examples/ for the full index.
License
bunsen is distributed under the terms of both the MIT license and the Apache License
(Version 2.0).