All notable changes are listed here. The format follows Keep a Changelog, and versions follow Semantic Versioning.
[Unreleased]
[0.3.0-preview.1] - 2026-10-30
Our own model file, ONNX backend-test conformance with control flow, and exact-mode results checked bit for bit across platforms. Of the 1905 onnx/backend/test cases, 1580 pass in fast mode and 1382 in exact mode, none fail, and the rest are listed gaps (docs/conformance.md). Exact-mode output hashes are equal on Windows, Linux and macOS (x64 and arm64, JIT and NativeAOT) and on browser WebAssembly (docs/golden-hashes.md).
Added
- Exact-mode golden hashes:
tools/GoldenModels,tools/golden*.sh, and a CI check on every platform againsttestdata/graphs/golden-exact.txt. - The OneModel model file (
ModelFormat,docs/format.md; format version 1, unstable until 1.0): a 64-byte header, a JSON manifest of the graph and 64-byte-aligned raw weights that load as memory-mapped views.ModelFormat.Convertturns an ONNX file into one,ModelFormat.Savewrites an imported model, andModel.Load/Session.Loadopen either kind by its first eight bytes. A converted model gives bit-identical outputs. Bad files fail withModelFormatExceptionnaming the field. OnnxSweep conformanceandtools/conformance.sh: one runner overonnx/backend/test(node, simple, pytorch-converted, pytorch-operator) in fast and exact mode, writing per-case status anddocs/conformance.md.- About 70 operators for backend-test coverage (activations and trigonometry, bitwise, scatter and set operators, loss functions, LRN, Einsum, DFT/STFT and windows, GridSample, RoiAlign, NonMaxSuppression, Attention opset 23 and others;
docs/ops-coverage.md), ConvTranspose and Conv with three spatial axes, Resizeantialias, MelWeightMatrix and IsNaN. - Control flow and collections:
If,Loop,Scan, the sequence operators,SequenceMapand the optional operators run as ONNX defines them. Sessions carry sequences and optionals as packeduint8tensors (PackedValue,TensorInfo.Kind); bodies run as nested sessions (docs/graph-runtime.mdsection 8).
Changed
- int8 packing narrows through value-preserving types, so results agree on WebAssembly, where vector narrowing saturates in compiled code and truncates in the interpreter.
- The int8 model-level metric adds a noise floor on the first quantized tensor of token-input encoders (
docs/int8.md). - RoiAlign without
coordinate_transformation_modedefaults tohalf_pixelfrom opset 16; Squeeze and Unsqueeze accept a scalaraxes.
[0.2.0-preview.1] - 2026-10-30
Graph optimizations, int8 and half-precision storage. All reference models still match ONNX Runtime within 1e-4 scaled error in float32 with outputs independent of thread count; exact-mode results are unchanged by the new passes.
Added
- Graph optimizations, chosen by
SessionOptions.OptimizationLevel(None,Basic,All;Allis the default): constant folding, matrix-product weights packed once per session with bias and activation applied per tile, convolution with a following activation, Conv+BatchNormalization folding, Gelu and attention fusion. Passes that change rounding are skipped in exact mode (docs/graph-passes.md). - int8 inference:
QuantizeLinear,DequantizeLinear,DynamicQuantizeLinear,MatMulInteger,ConvInteger,QLinearMatMul,QLinearConv; exact int32 product kernels for AVX2, AVX-512 and Arm dot product with a scalar fallback; theqdqandmatmul-integer-fusionpasses. Seedocs/int8.md. - Half-precision storage: models whose weights or values are float16 or bfloat16 run (each operator widens its inputs to float32 and rounds its results back;
docs/fp16.md).SessionOptions.WeightStoragekeeps large MatMul, Gemm and Conv weights of float32 models as float16 or bfloat16 to halve their memory. tools/export_models.py --fp16makes float16 variants of MiniLM-L6 and ResNet-50;Bartakes--weights original|fp16|bf16.- A direct depthwise convolution (phase planes for strides, 16/8/4/1-lane paths, four rows at a time for narrow maps) replaces the first one: 3-8x faster on MobileNetV3's layers (
docs/kernels-depthwise.md).
Changed
- Matrix products, convolutions and the normalisation operators use no more threads than their work can use (about 80 microseconds of work per thread), so small shapes no longer run slower on many threads; the parallel-for allocates nothing per call.
[0.1.0-preview.1] - 2026-10-29
First preview: ONNX models load and run on the CPU through Model.Load(...).Run(...) or a Session, with no native dependencies. The reference set (ResNet-50, MobileNetV3, BERT-base, MiniLM-L6, Whisper-small encoder and decoder, and two text-recognition models) matches ONNX Runtime within 1e-4 scaled error, with outputs independent of thread count. No graph optimizations, int8 or fp16 compute yet; speed is not tuned.
Added
- Shape and indexing operators: Shape, Size, Squeeze, Unsqueeze, Flatten, Dropout (inference), Transpose, Concat, Split, Slice, Expand, Tile, Gather, GatherElements, GatherND, ScatterND, Pad, ConstantOfShape, Range, OneHot, Trilu, NonZero and TopK. All move or compare elements only, so they are exact in both modes.
- Recurrent operators RNN, GRU and LSTM (all directions, both layouts, sequence lengths, initial state, peepholes, clipping, activation lists; fast and exact) and
Ctc, greedy and prefix-beam CTC decoding for consumers of recognisers and speech models. - Element-wise operators: Sub, Div, Mod, Pow, Max, Min, Sum, Mean, Exp, Log, Tanh, Sigmoid, Erf, Gelu, HardSigmoid, HardSwish, LeakyRelu, Neg, Abs, Sign, Reciprocal, Sqrt, Floor, Ceil, Round, Clip, the comparisons, And, Or, Xor, Not, Where, Cast and CastLike; all but Pow have exact kernels.
- The graph runtime: operator contract and static operator table, shape inference and constant evaluation per set of input shapes, execution plans with liveness-based buffer reuse, thread-safe sessions with fast and exact modes, and the
Modelhappy path. Operators so far: Add, Mul, Relu, MatMul, Gemm, Reshape, Identity, Constant. Bar checkandtools/check_reference.shcompare the library with stored ONNX Runtime outputs and hash outputs across thread counts;tools/op_inventory.pylists the operators a set of models uses. The happy path fills inattention_maskandtoken_type_idsfor text encoders, som.Run(tokens)works on them.- Convolution and pooling operators: Conv (1-D and 2-D, groups, depthwise, dilation,
auto_pad, bias), ConvTranspose, MaxPool (with Indices), AveragePool, GlobalAveragePool, GlobalMaxPool, BatchNormalization (inference), Resize and Upsample.Convkernel jobs no longer allocate per call. - The bar runner can time this library (
--side ours --mode fast|exact). - Operators: LayerNormalization, RMSNormalization, InstanceNormalization, GroupNormalization, Softmax, LogSoftmax, Hardmax, the Reduce* family, ArgMax, ArgMin and CumSum, all with exact kernels (
docs/ops-norms.md). - The solution skeleton: library, tests, NativeAOT and browser-wasm smoke apps, micro-benchmarks and a fuzz harness.
- Tensor layer: data types with fp16/bf16 conversion, strided views, NCHW/NHWC/blocked layouts, a pooled allocator and arena, and gradient records (public, unstable until the first preview).
- Fast and exact fp32 matrix-product, convolution, attention and softmax kernels, exact transcendental functions, and a fixed-chunk thread pool (internal for now).
- Tooling: reference-model export and pinning, reference outputs from ONNX Runtime, cross-machine output hashing, and a benchmark runner against ONNX Runtime.
- ONNX import: a protobuf reader and ONNX model reader of our own (IR versions 3 and later, any opset, external data confined to the model's directory, memory-mapped weights), and the graph representation it builds. Bad input produces
OnnxImportException.