Releases: NVIDIA/cuEquivariance
Releases · NVIDIA/cuEquivariance
Release list
v0.11.1
0.11.1
Patch release focused on PyTorch compatibility. No API or behavior changes — the pure-Python frontend is unchanged from 0.11.0. This is a coordinated version bump across the frontend and the compiled cuequivariance-ops-* wheels.
Changed
- [ops-torch] Widened PyTorch version support. The
cuequivariance-ops-torch-cu12/-cu13wheels now import and run across PyTorch 2.11, 2.12, and 2.13. Previously the compiled extension was ABI-locked to the exact PyTorch minor it was built against, so any other version failed with an undefined-symbol error at import.
Bug Fixes
- [ops-torch]
torch>=2.11is now a real runtime dependency. It was previously declared only in an optionaltestextra, sopipdid not enforce it — a user on PyTorch < 2.11 could install the wheel and then hit a cryptic import failure.pipnow blocks the incompatible install up front.
v0.11.0
Added
- [Torch]
cuet.triangle_attentionacceptskv_lengths, an int32 per-row key/value length tensor (shape[B, N, 1, 1, 1]) for right-padded sequences. - Passing
kv_lengthsselects the SM100f (B200 / B300) or sm120f (RTX 6000 Pro Blackwell) length fast path when available; on other GPUs it is converted to the equivalent dense prefix mask.kv_lengthsandmaskare mutually exclusive (passing both raises). Addedcuet.mask_to_kv_lengthsto convert and validate prefix masks. - [Torch/JAX] Native
sm120fTriangle Attention kernel for RTX 6000 Pro Blackwell, replacing the generic kernel used on that SKU in 0.10. - [Torch]
cuet.attention_pair_biasexposes the optional generalized projection parametersb_proj_k,b_proj_v,w_ln_q/b_ln_q,w_ln_k/b_ln_k, andb_proj_gas keyword-only arguments (defaultNone), preserving the strict contract onsingle_repr;w_proj_zmay be omitted whenis_cached_z_proj=True. (#293) - [JAX] Added a dictionary-based interface for organizing and processing features by representation type. (#271)
Bug Fixes
- [Torch] Triangle Attention no longer silently mis-handles dense masks on Blackwell. In 0.10, passing any
mask=on Blackwell (B200 / B300) took theSM100ffast path.SM100fis a length/prefix kernel — it attends[0, kv_length)per row — so it collapsed any mask into a single per-row length. A full or right-padded (prefix) mask was fast and correct, but an arbitrary (non-prefix) mask was fast and silently incorrect: interior gaps were dropped, with no warning and no error. In 0.11,SM100frejects any densemask=(including an all-ones mask) and routes it to the correct fallback kernel. Arbitrary masks are now always correct. - [Torch] Fixed TorchScript and Pytorch 2.2 compatibility issues in
cuet.ChannelWiseTensorProductandcuet.SegmentedPolynomial. (#277)
Breaking Changes
- [Torch]
cuet.attention_pair_biasnow takes the single representationsingle_reprplus the node-LayerNorm (w_ln_a/b_ln_a) and Q/K/V/gate projection weights instead of pre-projectedq/k/vand a separates, and performs the projections internally. The pre-projectedq/k/vandsare removed, and the op is now self-attention only (squareN × N) — rectangularU × V(U != V) cross-attention is no longer supported. (#290) - [Torch] On Blackwell (B200 / B300), a dense
mask=passed tocuet.triangle_attention(including an all-ones mask) no longer takes the SM100f fast path — it routes to the correct fallback, which is slower than the fast path. Buildkv_lengthsonce upstream, then passkv_lengths=cuet.mask_to_kv_lengths(mask)for the fast path. A one-time warning points to this whenever a mask would have reachedSM100f. - [Torch] PyTorch 2.11.X is now required.
Notes
- Which masking choice accelerates what (Torch, B200/B300):
- Fully-valid sequences → pass no
maskand nokv_lengths. This is the fastest path, and it routes exactly as it did in 0.10 (unaffected by the mask change). - Right-padded / prefix sequences → pass
kv_lengths. The kernel skips the padded keys entirely, while native PyTorch computes them and masks afterwards — so cuEquivariance's advantage over native PyTorch is largest here. - Arbitrary (non-prefix) masks → pass
mask=. Correct in 0.11, but runs the fallback.
- Fully-valid sequences → pass no
- Build
kv_lengthsonce, upstream.cuet.mask_to_kv_lengthsdoes a one-time host sync (prefix-shape validation; it raises on a non-prefix mask), so compute it in the collator / data-processing stage. The op itself is host-sync-free withkv_lengths: the only range-check.item()is opt-in (CUEQ_TRIATTN_VALIDATE_KV_LENGTHS) and skipped undertorch.compile; the clamp is device-side. - [JAX] The
mask→kv_lengthschanges are Torch-only. The JAX path auto-selects theSM100ffast path from its mask and is unaffected. - Recommended usage. For best performance, run cuEquivariance ops under
torch.compile(model, mode="reduce-overhead")(CUDA graphs), which removes per-call launch/dispatch overhead — most impactful at small shapes and low batch, where the kernels are launch-bound. Warm up first: the first few iterations (≈3) go to tracing and CUDA-graph capture and are slower; the speedups appear only once the graph is set up. CUDA graphs assume static shapes and re-capture when shapes change. - Hardware support. Triangle Attention:
SM100ffast path on B200 / B300 (viakv_lengths); nativesm120fon RTX 6000 Pro Blackwell; generic kernel on H100 / H200 / A100 / L40. APB inference: H100 / H200, B200, B300, RTX 6000 Pro Blackwell, A100 (not L40). APB training: H100 / H200, B200, B300 (not A100, RTX 6000 Pro Blackwell, or L40). - Data type support. Triangle Attention supports BF16, FP16, and FP32/TF32 — the FP32/TF32 kernel requires
hidden_dim <= 32andhidden_dim % 4 == 0; larger head dimensions must use BF16 or FP16. The specializedsm100fandsm120fkernels are BF16/FP16 only. APB's optimized paths for inference and training use BF16 and, for select routes, FP16. - APB shape support. The optimized
attention_pair_biaspath supports pair width 128 and 256, head dimension 8-64, and num heads 4-16. - Triangle Multiplication remains unchanged in 0.11.
- Known issue. A minor per-call overhead affects the Triangle Attention
kv_lengths(padded-sequence) inference path, most visible at short sequences. It does not affect correctness, training, or the no-mask path. A fix is in progress.
Masked and Right-Padded Sequences on B200 / B300
On B200 / B300, supplying kv_lengths selects the SM100f length fast path, and the advantage over native PyTorch grows when sequences are masked or right-padded. Native PyTorch materializes the dense mask and computes the padded keys before masking them; cuEquivariance passes a compact per-row length and skips them in the kernel entirely.
Known issues
- A minor per-call overhead affects the Triangle Attention
kv_lengths(padded-sequence) inference path, most visible at short sequences. It does not affect correctness, training, or the no-mask path. A fix is in progress. - CUDA 12.8 wheels do not support Blackwell's SM100F fast path. In the next release we will upgrade our CUDA 12.8 wheels to use CUDA 12.9 which will support TriAttn’s SM100F fast path on Blackwell.
- TriMul training is slower than native PyTorch (with
torch.compile) at batch sizes > 1 due to a slowdown in the backwards pass – we will work to resolve this in our next release. - There is an issue using torch version 2.11+ which we will fix in a minor update (v0.11.1) coming soon
Documentation
v0.10.0
Added
- Python 3.14 support finalized, including a fix for stale tuple hashes in
SegmentedTensorProductafter in-place operand mutation, and updated CI matrix (#272) - [Torch/JAX]
cuet.triangle_attention/cuex.triangle_attention: new faster sm100f (CC 10.0/10.3) forward kernel for hidden_dim ≤ 256, bwd hidden_dim ≤ 128;biasis cast to q/k/v dtype (instead of always float32) under sm100f; non-contiguous input tensors are handled internally — no manual contiguity assertion is required as long as shape requirements are met; updated docstrings. Only available on cu13 builds (#260) - [JAX] MACE
flax.nnxexample restructured to usennx.split+@jax.jiton(graphdef, state)instead of@nnx.jiton the module, removing the Python-side nnx graph traversal overhead from each training/inference step (#261) - [JAX] NVTX markers added to the MACE examples to make step boundaries visible in
nsysprofiles (#266)
Bug fix
- [Torch]
SegmentedPolynomialcheckpoint portability: GPU-saved models now load correctly on CPU. Implemented via__reduce__onSegmentedPolynomialFromUniform1dJit,SegmentedPolynomialFusedTP,SegmentedPolynomialIndexedLinear, andSegmentedPolynomial, plus graceful fallback when specificcuequivariance_ops_torchextensions (e.g.uniform_1d) are unavailable (#270) - [Torch] Replaced deprecated
is_fx_tracingwithis_fx_symbolic_tracing(#270) - [JAX] Restrict PTX 88 to sm_121 for CUDA 12.9+, avoiding breakage on other architectures (addresses the known issue noted in the 0.9.0 release) (#250)
- [Torch/JAX]
cuet.attention_pair_bias/cuex.attention_pair_bias: fixed incorrect results when the hidden dimension is not a multiple of 32; the previous torch fallback for these cases is removed as the kernel now handles them correctly
Notes
- [Torch] The
CUEQ_TORCH_COMPILEenvironment variable (experimental) enablestorch.compileforcuet.triangle_attention; useful for non-contiguous tensor inputs on Ampere/Hopper architectures
Documentation
- Fixed tutorial format issues (#274)
What's Changed
- Fix eq / lt on segmented polynomial types for Python and JAX compatibility by @mariogeiger in #258
- [merge after release] Restrict PTX 88 to sm_121 for CUDA 12.9+ by @hsadasivan in #250
- doc string and api update for triattn by @hsadasivan in #260
- api: remove dim_order from triangle_attention by @hsadasivan in #262
- Removed dim_order from triAttn by @phiandark in #263
- nnx.split by @mariogeiger in #261
- add nvtx marker by @paulz-nv in #266
- Fixing some torch segmented_polynomial support by @phiandark in #270
- Add Python 3.14 support and fix CI setup by @mariogeiger in #272
- Fix tutorials doc format issues by @LiamZhang100 in #274
- Add skill.md files by @mariogeiger in #269
- Release 0.10.0 by @mariogeiger in #275
New Contributors
Full Changelog: v0.9.0...v0.10.0
v0.9.1 (patch release)
Bug fix
- [Torch/JAX] Fixed a rare overflow in the uniform 1d kernel when indices are large, by casting index arithmetic from 32-bit to 64-bit
- [Torch/JAX] Disabled parallel compilation of uniform 1d kernels by default (
CUEQUIVARIANCE_OPS_PARALLEL_COMPILEnow defaults to0). Parallel compilation caused issues in multi-GPU setups. It will be re-enabled by default in a future release once the underlying bugs are resolved.
v0.9.0
0.9.0 (2026-02-17)
Added
- GB10 (DGX Spark) support
- Support for Python 3.13 and 3.14
- [JAX] Support for Triton 3.6.0
- [JAX]
flax.nnxMACE example - [Torch/JAX] Deterministic indexing mode for uniform 1d kernels
- [Torch/JAX] Parallel JIT compilation for uniform_1d kernels with per-kernel caching, significantly reducing compilation time. New optional environment variable
CUEQUIVARIANCE_OPS_NVRTC_CACHE_DIRallows setting a directory for caching compiled kernels. - Documentation: new tutorials for JAX and PyTorch segmented polynomials
Bug fix
- [JAX] Fixed Triton tuning issue for triangular multiplicative update
- [JAX] Compatibility with JAX 0.8.2: fixed FFI interface and dtype casting issues when x64 mode is not enabled
- [JAX] Improved triangle attention error messages
- [Torch/JAX] Fixed
yx_rotationdescriptor - [Torch] TensorRT QDP plugin workaround
Breaking Changes
- [Torch/JAX] The environment variable
CUEQUIVARIANCE_OPS_USE_JITno longer exists. JIT compilation is now the default behavior for uniform_1d kernels (already since few releases). - [Torch/JAX] Renamed
filter_drop_unsued_operandstofilter_drop_unused_operands(typo fix) - [Torch/JAX] Removed
nvfatbinoptional dependency - [Torch] Removed deprecated primitive classes:
TensorProduct,EquivariantTensorProduct,SymmetricTensorProduct, andIWeightedSymmetricTensorProduct. Usecuet.SegmentedPolynomialwithmethod='uniform_1d'instead, or the high-level APIs (cuet.ChannelWiseTensorProduct,cuet.FullyConnectedTensorProduct,cuet.SymmetricContraction). Attempting to import these classes will raise anImportErrorwith migration instructions. - [Torch] Removed deprecated low-level wrapper classes:
TensorProductUniform1d,TensorProductUniform4x1d,TensorProductUniform3x1dIndexed,TensorProductUniform4x1dIndexed, andSymmetricTensorContractionfromcuequivariance_ops_torch. Usetorch.ops.cuequivariance.uniform_1dorcuet.SegmentedPolynomialinstead.
Notes
- [JAX] DGX Spark/GB10 (sm_121) with CUDA 12.9: This release uses PTX 87, which works correctly for most architectures but is not compatible with DGX Spark/GB10 on CUDA 12.9. To enable DGX Spark/GB10 support with CUDA 12.9, refer to #250 for a simple frontend integration tweak that restricts PTX 88 to sm_121 only. This fix will be merged after the 0.9.0 release.
v0.8.1
0.8.1 (2026-01-09)
Bug fix
- [Torch] Fixed
torch.compilecompatibility for non-contiguous tensors in backward pass forcuet.triangle_attention,cuet.triangle_multiplicative_update, andcuet.attention_pair_bias. This resolves stride mismatch errors in TorchInductor when compiling models using these operations (#223)
v0.8.0
Added
- Support for CUDA 13 on ARM
- [Torch/JAX] Blackwell-optimized BF16/FP16 forward and backward kernels for
cuet.triangle_attention(runs on compute capabilities 10.0 and 10.3). These kernels provide superior performance especially for long sequences and higher head dimensions. This is only supported on cu13 builds as of this release
Bug fix
- [Torch/JAX] Fixed index overflow and out of bound issues leading to illegal memory access in
cuet.triangle_attention
Notes
- [Torch/JAX] Blackwell-optimized kernels require the sequence length N to be a multiple of 8 for the forward pass; pad the sequence if necessary
- [Torch/JAX] Blackwell-optimized kernels are currently supported only for CUDA 13 builds
What's Changed
- 16bit math datatype for uniform_1d by @mariogeiger in #188
- [JAX] code examples by @mariogeiger in #156
- [docs] add mace perf figure in docs by @mariogeiger in #192
- Adding examples to the documentation by @phiandark in #191
- Small SegmentedPolynomial improvements by @phiandark in #210
- fix by @mariogeiger in #212
- Added wrappers for ONNX/TRT initialization by @borisfom in #214
- [JAX] triatt 16bit fix by @mariogeiger in #213
- [Torch] Improve error messages for uniform 1d by @mariogeiger in #217
- triatt jax bwd dtype issue by @mariogeiger in #219
- doc-string updates+ rel-notes by @hsadasivan in #220
Full Changelog: v0.7.0...v0.8.0
v0.7.0
Added
- Support for CUDA 13
- Support for Python 3.13
- [Torch] MACE example in the documentation
- [JAX] MACE and NequIP examples in the folder
cuequivariance_jax/examples - [Torch/JAX] The Segmented Polynomial operation's
math_dtypeargument now accepts method-specific string values, with each method supporting different options - [Torch] ONNX export and TensorRT runtime plugin support for triangle attention, triangle multiplication and attention with pairwise bias
- [Torch] Support for caching the "bias tensor z" calculated from the proj_z linear layer in the Attention with pairwise bias kernel (as implemented in the Boltz code)
Bug fix
- Correct the documentation
CUEQ_TRITON_TUNING_MODE->CUEQ_TRITON_TUNING - [JAX] Make
triangle_multiplicative_updateuse the same tuning cache files as its PyTorch counterpart
What's Changed
- [JAX] expand math_dtype argument by @mariogeiger in #153
- [JAX] add (partial) jax.vmap support for triangle attention and triangle multiplicative update by @mariogeiger in #155
- [JAX] Use nondiff_argnums instead of nondiff_argnames by @mariogeiger in #158
- [JAX] trimul batch dims and int64 support by @mariogeiger in #157
- Merge release to main by @mariogeiger in #169
- apb w/ caching api changes by @hsadasivan in #174
- [JAX] fix benchmarking function by @mariogeiger in #161
- Enabling richer string math_dtype for SegmentedPolynomial by @phiandark in #172
- [JAX] make trimul cache name/keys similar to their torch counterpart by @mariogeiger in #173
- api defaults change for apb with caching by @hsadasivan in #179
- setup copy-pr-bot by @mariogeiger in #180
- update ruff by @mariogeiger in #181
- GHA tests by @mariogeiger in #182
- Update tolerance parameters in spherical harmonics test by @mariogeiger in #185
- update aot flag name in docstring by @hsadasivan in #186
- [JAX] add sharding notes in docstrings by @mariogeiger in #197
- update changelog and version by @mariogeiger in #196
Full Changelog: v0.6.0...v0.7.0
v0.6.1
Latest Changes
0.6.1 (2025-09-04)
Added
- [Torch/JAX] Support for variable leading batch dimensions in triangle multiplicative update
- [Torch/JAX] Triangle attention kernel support for additional input configs: all hidden_dim<=32 and divisible by 4 for tf32/fp32, and for all hidden_dim<=128 and divisible by 8 for bf16/fp16. In the rare instance that the kernel does not support an input config, fallback to torch is enabled instead of erroring out.
- [Torch/JAX] Tuned config for RTX PRO 6000 GPUs for triangle multiplicative update.
- [JAX] vmap support for triangle multiplicative update and triangle attention
- [Torch] Improved error reporting on import failure with traceback information for stacktrace
Bug fix
- [Torch/JAX] Fixed illegal memory access issue stemming from int32 indexing for longer sequences in triangle multiplicative update and attention with pair bias.
- [JAX] Moved to using nondiff_argnums instead of nondiff_argnames to be compatible with older JAX versions
v0.6.0
Added
- [Torch] New feature: Added
cuet.attention_pair_bias(support for caching the pair bias tensor & further kernel acceleration coming up soon. There maybe API related changes for this in the next release) - [Torch/JAX] Added
methodargument tocuet.SegmentedPolynomial/cuex.segmented_polynomialto give users control over which backend solution is used (naive, uniform_1d, fused_tp, indexed_linear). - [Torch/JAX] Added torch fallback option based on sequence lengths for triangle kernels and attention pair bias. The user may control this by setting env vars:
CUEQ_TRIMUL_FALLBACK_THRESHOLD,CUEQ_TRIATTN_FALLBACK_THRESHOLD,CUEQ_ATTENTION_PAIR_BIAS_FALLBACK_THRESHOLD. The corresponding APIs default to torch fallback for seq_lens < 100 for optimal performances. - [Torch/JAX] Added support for the optional projection and gating biases in the input and output of
cuex.triangle_multiplicative_update - [JAX] Added JAX bindings for triangle operations with
cuex.triangle_attentionandcuex.triangle_multiplicative_update
Bug fix
- [Torch] Added
cueuivariance_ops_torch.init_triton_cache()for users to initialize triton cache before calling torch compiled triangular multiplicative update. If not used, Torch compile would break if directly applied oncuex.triangle_multiplicative_update. - [Torch/JAX] Fixed the illegal memory access error for long sequences in triangle attention. This increases the usable limits on sequence lengths.
Breaking Changes
- Dropped support for CUDA 11. Only CUDA 12 is now supported (
cuequivariance-ops-torch-cu12,cuequivariance-ops-jax-cu12). - [Torch/JAX] Simplified precision arg of triangular multiplicative update to just two: None (defaults to triton language dot's default for non-32b input and for 32b input, tf32/tf32x3 based on 1/0 value set in torch.backends.cuda.matmul.allow_tf32) and IEEE-754.
- [Torch/JAX] We have moved away from the default round-towards-zero (RZ) implementation to round-nearest (RN) for better tf32 accuracy in cuex.triangle_multiplicative_update. In rare circumstances, this may cause minor differences in results observed.
Known Issues
- [JAX] The function
cuex.triangle_multiplicative_updaterequirestriton<=3.3.1. We are waiting for an update of the packagejax-triton. - [PyTorch] The function
cuet.triangle_multiplicative_updaterequirestriton>=3.4.0on Blackwell GPUs. - As a consequence of the two last point,
cuex.triangle_multiplicative_updatecan't run on Blackwell GPUs. cuet.attention_pair_biasdoes not support caching of projected pairwise tensor. We are working on adding support for this.
What's Changed
- Add methods to slice operands of descriptors by @mariogeiger in #127
- [Torch] skip many tests by @mariogeiger in #129
- [JAX] triangle attention by @mariogeiger in #122
- [JAX] triangle multiplication by @mariogeiger in #126
- [JAX] Rename a variable by @mariogeiger in #134
- [JAX] method API by @mariogeiger in #132
- [Torch+JAX] add/improve measure clock ticks by @mariogeiger in #138
- [JAX] add bias to tri-mul by @mariogeiger in #139
- Improve CI stuff by @mariogeiger in #140
- Enhance benchmarking in measure_clock_ticks function by @mariogeiger in #141
- [PyTorch] SegmentedPolynomial "method" argument by @phiandark in #130
- Improvements to the PyTorch SegmentedPolynomial by @phiandark in #142
- Update trimul inputs by @phiandark in #145
- Adding attention_pair_bias to frontend by @phiandark in #146
- Update benchmarking scripts by @mariogeiger in #147
- [WIP] Update changelog and documentation by @mariogeiger in #148
- Update CHANGELOG.md by @mariogeiger in #151
New Contributors
- @phiandark made their first contribution in #130
Full Changelog: v0.5.1...v0.6.0