Skip to main content

Cross-framework block-scaled tensor primitive (FP8 / FP4 / MXFP8 / NVFP4 / INT4)

Project description

breccia hero banner

A cross-framework block-scaled tensor primitive for low-precision compute (FP8 / FP4 / MXFP8 / NVFP4 / INT4).

import numpy as np
import breccia

# Quantize a tensor to FP8 with per-block-K scaling (DeepSeek-v3 style).
x = np.random.randn(8, 256).astype(np.float32)
st = breccia.cast(x, breccia.Float8BlockScaling(block_k=128))

# Scaled matmul: data stays in FP8, scales fold into the FP32 accumulator.
A = breccia.cast(np.random.randn(16, 256).astype(np.float32),
                 breccia.Float8CurrentScaling())
W = breccia.cast(np.random.randn(256, 64).astype(np.float32),
                 breccia.Float8BlockScaling(block_k=128))
y = breccia.matmul(A, W)

Why

Every framework today reinvents block-scaled low-precision in incompatible ways:

  • NVIDIA TransformerEngine ships four parallel recipe classes (DelayedScaling, Float8CurrentScaling, Float8BlockScaling, MXFP8BlockScaling) — NVIDIA-only.
  • PyTorch torchao rolls its own AffineQuantizedTensor — PyTorch-only.
  • DeepSeek-v3 has a private FP8 format. FP8-Flow-MoE (Nov 2025) has another. COAT has another for optimizer-state compression.
  • Megatron, JAX, TorchTitan each re-derive scale-aware all-gather.
  • AMD MI355, Trainium2, TPU v6 all have incompatible scale semantics across vendors.

No vendor can be the neutral substrate (NVIDIA can't ship for AMD, AMD can't ship for TPU). The cross-vendor gap is widening through 2026–2027 with FP4. breccia is the "safetensors of low-precision" — one neutral primitive that round-trips with each of them.

Sister library to scree:

  • scree handles variable-length data (loose fragments).
  • breccia handles low-precision data bound by its scale (fragments + cement).

What you get

A single core type — ScaledTensor(data, scale, recipe, layout) — plus six recipes, four layouts, five bridges, and reference + Triton kernels.

Six recipes covering 95% of today's fragmentation:

Recipe Format Block size Used by
DelayedScaling FP8 E4M3 / E5M2 per-tensor TE main recipe
Float8CurrentScaling FP8 E4M3 / E5M2 per-tensor TE / torchao
Float8BlockScaling FP8 E4M3 / E5M2 128 along K DeepSeek-v3
MXFP8BlockScaling FP8 + E8M0 scale 32 along K OCP MX standard
NVFP4BlockScaling FP4 E2M1 + FP8 scale 16 along K NVIDIA Blackwell
INT4Scaling INT4 ± fp16 scale configurable GPTQ / AWQ family

Five bridges for zero-copy interop:

Bridge Direction Dep
from_transformer_engine / to_transformer_engine TE Float8Tensor ↔ ScaledTensor transformer-engine
from_torchao / to_torchao AffineQuantizedTensor ↔ ScaledTensor torchao
save_safetensors / load_safetensors safetensors file ↔ dict of ScaledTensor safetensors
to_dlpack / from_dlpack zero-copy across NumPy / PyTorch / MLX / JAX built-in
from_deepseek_v3 / to_deepseek_v3 DeepSeek-v3 buffers ↔ ScaledTensor none

Memory savings vs FP32, computed at v0.0.1 ((1024, 1024) weight):

Format Bytes vs FP32
FP32 4.19 MB 1.00×
FP16 2.10 MB 0.50×
FP8 (Float8CurrentScaling) 1.05 MB 0.25×
FP8 (Float8BlockScaling, b=128) 1.08 MB 0.26×
MXFP8 (block 32, E8M0 scale) 1.08 MB 0.26×
NVFP4 (block 16, E4M3 scale) 1.11 MB 0.27×
INT4 (group 128, fp16 scale) 1.06 MB 0.25×

Reproduce: python benchmarks/bench_memory.py

Accuracy (cosine similarity vs FP32 on Gaussian inputs, mean over 8 seeds):

Recipe Cos sim
Float8CurrentScaling (E4M3) 0.9997
Float8BlockScaling(block_k=128) 0.9997
MXFP8BlockScaling 0.9974
NVFP4BlockScaling 0.9955
INT4Scaling(group_size=128) 0.9932

Reproduce: python benchmarks/bench_accuracy.py

Status

v0.1.0, first beta release.

Component Status
ScaledTensor type + invariants
6 ScalingRecipes
4 Layouts
cast / dequantize / matmul / requantize
Bridges: TE / torchao / HF / DLPack / DeepSeek-v3
NumPy + PyTorch + MLX + JAX backends
Triton FP8 scaled matmul (per-tensor) ✅ validated on H100 (cos sim 0.9993 vs FP32)
Straight-through estimator (cast_ste, cast_ste_clipped)
Asymmetric INT4 (zero-point)
Block-scaled Triton kernel 🟡 v0.2 (per-tensor only in v0.1)
Native PyTorch FP8 acceleration (vs round-trip) 🟡 v0.2

250+ tests passing. CI on Python 3.10 / 3.11 / 3.12 (Ubuntu) + 3.11 (macOS).

Install

pip install breccia                     # NumPy backend
pip install "breccia[torch]"            # + PyTorch
pip install "breccia[mlx]"              # + MLX (Apple Silicon)
pip install "breccia[bridges]"          # + safetensors for HF bridge
pip install "breccia[torch,mlx,bridges,dev]"  # full dev setup

Examples

Documentation

The name

A breccia is a sedimentary rock made of broken angular fragments held together by a cementing matrix. Low-precision data fragments + the scale matrix that gives them meaning — same structure.

It's the natural geological successor to scree: loose fragments (scree) become breccia when cemented together.

Contributing

PRs welcome. See CONTRIBUTING.md for the workflow. Open a GitHub Discussion for anything beyond a small fix.

License

Apache-2.0

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

breccia-0.1.0.tar.gz (49.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

breccia-0.1.0-py3-none-any.whl (39.2 kB view details)

Uploaded Python 3

File details

Details for the file breccia-0.1.0.tar.gz.

File metadata

  • Download URL: breccia-0.1.0.tar.gz
  • Upload date:
  • Size: 49.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for breccia-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6209ab14db4b62222100b0e4388b7317ebd1cca3a937214929d3766ca7474588
MD5 ac213c25b5af7f762310570951304ace
BLAKE2b-256 15982ffd88ea1cfa906dd17425966f65b85fcc6569214c7fc50f2837533fd68c

See more details on using hashes here.

File details

Details for the file breccia-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: breccia-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 39.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for breccia-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 29239e3a1d2aa5f36eda307fb79b64c5f39859fc48ff4ed9cab031a0f51ea01e
MD5 492990f933a6940836078f383f782cc5
BLAKE2b-256 ee74512b7e4266fac3d726e2a9be8a89090ce1e1d178c58ca43472a726d933ce

See more details on using hashes here.

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