Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
f6d706d
patch transform: stop folding inputs; add select_inputs
kali May 28, 2026
b2dc0a0
tract-cli, tract-libcli: make cudarc + tract-cuda truly optional
kali May 28, 2026
5c11d4a
rename: concretize_symbols / substitute_symbols → set_symbols
kali May 28, 2026
3f0176a
cli: `run --set` accepts TDim expressions
kali May 28, 2026
ee52857
core/ops/scan: reuse body state across iterations
czoli1976 May 28, 2026
43a9fee
onnx: com.microsoft GroupQueryAttention (prefill), ORT-validated
czoli1976 May 26, 2026
a5eeab5
build: track Cargo.lock
kali May 28, 2026
5bf8e45
ci/binaries: attach CycloneDX + SPDX SBOMs to release binaries
kali May 28, 2026
8e3b24e
ci/binaries: sign release .tgz with SBOM attestations
kali May 28, 2026
cfd91a9
ci/binaries: embed SBOM in binary + attest build provenance
kali May 28, 2026
d902aa4
ci/binaries: SHA-pin sbom + attestation actions
kali May 28, 2026
86ba417
ci/wheels: cargo-auditable in wheel build + PEP 770 SBOMs
kali May 28, 2026
ff8abf2
changelog update
kali May 28, 2026
cde69ad
drop the unmaintained atty crate; use std::io::IsTerminal
kali May 28, 2026
b577fd6
core/runtime: add virtual `gpu` / `gpu-or-cpu` names
kali May 28, 2026
33d4840
core/runtime: rename `default` to `cpu`, alias `default` in runtime_f…
kali May 28, 2026
5ca8dab
fmt
kali May 29, 2026
bf123a5
drop the libtensorflow binding + `conform` feature
kali May 28, 2026
2614eea
setup deny for cli
kali May 29, 2026
19394ea
onnx: fix LayerNorm output dtype mismatch with F16 inputs
May 24, 2026
1d6d1aa
fmt
kali May 28, 2026
b2239b0
linalg/mmm: cache-adaptive 2D-blocking for the single-thread tile walk
czoli1976 May 23, 2026
091427f
linalg/mmm: rustfmt the Linux L2 cache-detection branch
czoli1976 May 24, 2026
9dcf880
release 0.23.0-dev.6
mathieupoumeyrolsonos Jun 1, 2026
3ed1478
post-release v0.23.0-pre
mathieupoumeyrolsonos Jun 1, 2026
a5e5fb1
release scripts: reject 'v'-prefixed versions
kali Jun 1, 2026
4ffe58b
post-release 0.23.0-pre
kali Jun 1, 2026
57f236a
ci/pydoc: push gh-pages via explicit token URL
kali Jun 1, 2026
9398b06
changelog
kali Jun 1, 2026
bf90b4b
release 0.23.0
mathieupoumeyrolsonos Jun 1, 2026
688b476
post-release 0.23.1-pre
mathieupoumeyrolsonos Jun 1, 2026
176ada9
arm64 SDOT int8 matmul kernel (FEAT_DotProd)
czoli1976 May 26, 2026
9fbbf31
linalg/x86_64: add AVX-512 VNNI int8 GEMM kernel (avx512vnni_mmm_i32_…
czoli1976 May 28, 2026
6037d80
onnx: auto-enable external_state for caller-managed recurrent state
czoli1976 May 27, 2026
9d41153
scan: detect caller-managed state by graph reachability, not an impor…
czoli1976 May 27, 2026
47d0428
linalg/x86_64: add AVX-512 element-wise activations
czoli1976 May 28, 2026
a468525
Merge branch 'main' into feat/int8-sdot-kernel
kali Jun 2, 2026
1e5841f
Merge pull request #2278 from czoli1976/feat/int8-sdot-kernel
kali Jun 2, 2026
7b3e14d
transformers: bounded sliding-window KV cache (ring buffer)
czoli1976 Jun 1, 2026
99baf06
onnx: accept local_window_size on GroupQueryAttention (banded mask)
czoli1976 Jun 1, 2026
019d77f
transformers: fused WindowKvSdpa op — windowed decode through the engine
czoli1976 Jun 1, 2026
1a25338
transformers: WindowKvSdpa auto-wiring transform + NNEF ser/de
czoli1976 Jun 1, 2026
14a8024
onnx/gqa: simplify local_window_size clamp with .max(0) (review #2327)
czoli1976 Jun 1, 2026
4e8bd21
no need to freeze in Runnable::run (#2328)
kali Jun 2, 2026
8398ec0
core/ops/fft: Stft::axes_mapping unlocks pulsification on non-STFT ax…
JulienBalianSonos Jun 2, 2026
2ac5b35
ci/large_models: add pr_number workflow_dispatch input (#2330)
kali Jun 2, 2026
8ab1d71
scan: decouple force_scan_external_state from seq concretization (#2332)
kali Jun 3, 2026
62521d1
ci: bump configure-aws-credentials to v6.1.2 with exact-version pin c…
kali Jun 3, 2026
9d4eec9
Fix cargo lock post release (#2335)
kali Jun 3, 2026
483aced
onnx: handle com.microsoft RotaryEmbedding contrib op
czoli1976 May 26, 2026
e68a35d
pulse/ops/array: linearity-checked per-pulse size for MultiBroadcastT…
JulienBalianSonos Jun 3, 2026
986ad7c
docs: add CLAUDE.md with contributor rules
kali Jun 3, 2026
68a1955
CLAUDE.md/AGENTS.md: split inline vs doc comment guidance
kali Jun 3, 2026
f8adfca
transformers: CPU FlashSdpa — contiguous P·V GEMM + head-parallel exe…
czoli1976 May 30, 2026
6b8550c
add rust-toolchain.toml pinning stable channel
kali Jun 4, 2026
51963c5
consolidate CI on rust-toolchain.toml; check fmt with stable
kali Jun 4, 2026
6158b16
derive MSRV from Cargo.toml rust-version in CI
kali Jun 4, 2026
5f5d7f5
docs: align AGENTS.md fmt rule with stable rust-toolchain.toml
kali Jun 4, 2026
2c8252d
travis: drop hardcoded MSRV toolchain default, inherit stable from ru…
kali Jun 4, 2026
7523a3b
comment rust-version as MSRV source of truth (keep README badge in sync)
kali Jun 4, 2026
d143381
ci: correct actions/checkout pin comments to v6.0.2
kali Jun 4, 2026
95041c9
ci: finish actions/checkout v6.0.2 comment sweep across remaining wor…
kali Jun 4, 2026
2ad1c98
linalg/x86_64: add AVX-512 f16 element-wise activations
czoli1976 May 28, 2026
286b5fe
arm64 SME2 SMOPA int8 matmul kernel (sme_qmmm_i32_32x32)
czoli1976 May 24, 2026
249812d
core/ops/array: implement set_symbols on DynSlice and Topk
JulienBalianSonos Jun 3, 2026
3683dc5
linalg/x86_64: add AVX-512 softmax and max reductions
czoli1976 May 28, 2026
8ff5a7f
linalg/x86_64: add AVX-512 erf kernel
czoli1976 May 28, 2026
7fa2956
linalg/x86_64: add AVX-512 f16 softmax_l2 kernel
czoli1976 May 28, 2026
48e434c
gpu: constant-pad op via copy_nd
kali Jun 5, 2026
d87e06d
doc: note dump --audit-json for programmatic model inspection
kali Jun 5, 2026
0924259
pulse/ops/scan: substitute stream symbol in Scan body during pulsific…
JulienBalianSonos Jun 5, 2026
e086d19
harness/nnef-test-cases: scan-body-stream-drift regression test
JulienBalianSonos Jun 5, 2026
d81567b
linalg/x86_64 + core/nn: fused AVX-512 RmsNorm kernel
czoli1976 May 28, 2026
7f03d4a
core/ops/fft: pulse non-FFT axes via Fft::axes_mapping, drop dedicate…
JulienBalianSonos Jun 5, 2026
69172ed
linalg/x86_64: AVX-512_FP16 native f16 hardswish kernel
czoli1976 May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .all_crates.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@

ALL_CRATES_PATH="data linalg core nnef nnef/nnef-resources pulse-opl pulse extra transformers hir tflite tensorflow onnx-opl onnx gpu metal cuda libcli api api/rs api/ffi api/proxy/sys api/proxy cli"
ALL_CRATES_PATH="data linalg core nnef nnef/nnef-resources transformers pulse-opl pulse extra hir tflite tensorflow onnx-opl onnx gpu metal cuda libcli api api/rs api/ffi api/proxy/sys api/proxy cli"
85 changes: 85 additions & 0 deletions .github/scripts/inject_wheel_sboms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""Inject CycloneDX + SPDX SBOMs into a wheel's `.dist-info/sboms/` per PEP 770.

Reads the wheel, generates SBOMs from its unpacked contents via `syft`
(which understands the `cargo-auditable` section embedded in the
bundled Rust dylib), drops them into the wheel's metadata directory,
and re-packs the wheel. `wheel pack` regenerates RECORD so the new
files are properly listed and hashed.

Usage: python inject_wheel_sboms.py wheel-1.whl wheel-2.whl ...
(in-place; replaces each input wheel with the SBOM-bearing one)

Requires: `syft` on PATH, and the `wheel` Python package installed.
"""

import shutil
import subprocess
import sys
import tempfile
from pathlib import Path


def inject(wheel_path: Path) -> None:
wheel_path = wheel_path.resolve()
with tempfile.TemporaryDirectory() as tmp:
tmp = Path(tmp)
unpack_root = tmp / "unpacked"
repack_root = tmp / "repacked"
unpack_root.mkdir()
repack_root.mkdir()

subprocess.check_call(
[sys.executable, "-m", "wheel", "unpack", "-d", str(unpack_root), str(wheel_path)]
)

# `wheel unpack` writes one top-level dir named `<name>-<version>`
(unpacked,) = list(unpack_root.iterdir())
(dist_info,) = list(unpacked.glob("*.dist-info"))

sboms_dir = dist_info / "sboms"
sboms_dir.mkdir(exist_ok=True)

# syft scans the unpacked tree. Its rust-audit-binary cataloger
# reads the `.dep-v0` ELF/Mach-O section that `cargo-auditable`
# embedded; the Python cataloger picks up METADATA.
subprocess.check_call(
[
"syft",
"scan",
f"dir:{unpacked}",
"--source-name",
unpacked.name,
"-o",
f"cyclonedx-json={sboms_dir / 'sbom.cdx.json'}",
"-o",
f"spdx-json={sboms_dir / 'sbom.spdx.json'}",
]
)

# `wheel pack` rewrites RECORD with hashes for every file under
# `unpacked/`, including the two SBOMs we just added.
subprocess.check_call(
[sys.executable, "-m", "wheel", "pack", "-d", str(repack_root), str(unpacked)]
)

(repacked_wheel,) = list(repack_root.glob("*.whl"))
# Names should match; if `wheel pack` produced a different
# filename (e.g. build-tag difference), prefer the new name.
target = wheel_path.parent / repacked_wheel.name
if target != wheel_path:
wheel_path.unlink()
shutil.move(str(repacked_wheel), str(target))
print(f"injected SBOMs into {target.name}")


def main(argv: list[str]) -> int:
if not argv:
print(__doc__, file=sys.stderr)
return 2
for w in argv:
inject(Path(w))
return 0


if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
2 changes: 1 addition & 1 deletion .github/workflows/asan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
runs-on: ${{matrix.os}}

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Rustup update
Expand Down
55 changes: 52 additions & 3 deletions .github/workflows/binaries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ jobs:
name: Upload Release Binaries
permissions:
contents: write
# OIDC + attestations: cryptographically sign each released .tgz
# against its SBOMs via GitHub's attestation store. Anyone can
# then verify with `gh attestation verify <tgz> --owner sonos`.
id-token: write
attestations: write
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -53,7 +58,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand Down Expand Up @@ -98,15 +103,59 @@ jobs:
export CARGO_TARGET_${RUST_TRIPLE_ENV}_LINKER=$TARGET_CC
fi

cargo build --target ${target} --release -p tract-cli
# cargo-auditable wraps `cargo build` to embed the resolved
# dependency graph into the binary so consumers can recover
# the SBOM directly from the binary via `cargo audit bin`.
cargo install --locked cargo-auditable --version 0.7.0
cargo auditable build --target ${target} --release -p tract-cli --locked
mkdir tract-$name
cp target/${target}/release/tract tract-${name}
tar czf tract-${name}.tgz tract-${name}

- name: Generate CycloneDX SBOM
uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0
with:
path: .
format: cyclonedx-json
artifact-name: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.cdx.json
output-file: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.cdx.json
upload-artifact: false
upload-release-assets: false

- name: Generate SPDX SBOM
uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0
with:
path: .
format: spdx-json
artifact-name: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.spdx.json
output-file: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.spdx.json
upload-artifact: false
upload-release-assets: false

- name: Attest build provenance
uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
with:
subject-path: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.tgz

- name: Attest release tarball with CycloneDX SBOM
uses: actions/attest-sbom@c604332985a26aa8cf1bdc465b92731239ec6b9e # v4.1.0
with:
subject-path: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.tgz
sbom-path: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.cdx.json

- name: Attest release tarball with SPDX SBOM
uses: actions/attest-sbom@c604332985a26aa8cf1bdc465b92731239ec6b9e # v4.1.0
with:
subject-path: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.tgz
sbom-path: tract-${{ matrix.target }}-${{ steps.version.outputs.value }}.spdx.json

- name: Upload asset
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3
with:
files: tract-${{matrix.target}}-${{ steps.version.outputs.value }}.tgz
files: |
tract-${{matrix.target}}-${{ steps.version.outputs.value }}.tgz
tract-${{matrix.target}}-${{ steps.version.outputs.value }}.cdx.json
tract-${{matrix.target}}-${{ steps.version.outputs.value }}.spdx.json
name: ${{ steps.version.outputs.value }}
tag_name: v${{ steps.version.outputs.value }}
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cost_model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
target: [ "aarch64", "armv7" ]
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand Down
26 changes: 16 additions & 10 deletions .github/workflows/crates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,26 @@ jobs:
outputs:
os: ${{steps.set-matrix.outputs.os}}
rust: ${{steps.set-matrix.outputs.rust}}
msrv: ${{steps.set-matrix.outputs.msrv}}

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- id: set-matrix
env:
FULL: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}
run: |
msrv=$(grep -m1 '^rust-version' Cargo.toml | sed -E 's/.*"([^"]+)".*/\1/')
echo "msrv=$msrv" >> $GITHUB_OUTPUT
if [ "$FULL" == "true" ]
then
echo 'os=["ubuntu-latest", "macos-latest"]' >> $GITHUB_OUTPUT
echo 'rust=["1.91.0", "stable", "beta", "nightly"]' >> $GITHUB_OUTPUT
echo "rust=[\"$msrv\", \"stable\", \"beta\", \"nightly\"]" >> $GITHUB_OUTPUT
else
echo ::notice::Skipping macOS checks on PR and commit. Dispatch workflow manually if needed.
echo 'os=["ubuntu-latest"]' >> $GITHUB_OUTPUT
echo 'rust=["1.91.0"]' >> $GITHUB_OUTPUT
echo "rust=[\"$msrv\"]" >> $GITHUB_OUTPUT
fi

crates:
Expand All @@ -53,7 +59,7 @@ jobs:
RUSTUP_TOOLCHAIN: ${{matrix.rust}}

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand All @@ -70,7 +76,7 @@ jobs:
env:
RUSTUP_TOOLCHAIN: ${{matrix.rust}}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand All @@ -85,9 +91,9 @@ jobs:
runs-on: cuda-lovelace
needs: prepare-matrix
env:
RUSTUP_TOOLCHAIN: "1.91.0"
RUSTUP_TOOLCHAIN: ${{ needs.prepare-matrix.outputs.msrv }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Minimum-BOM GPU smoke
Expand All @@ -103,7 +109,7 @@ jobs:
env:
RUSTUP_TOOLCHAIN: ${{matrix.rust}}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand All @@ -122,12 +128,12 @@ jobs:
env:
RUSTUP_TOOLCHAIN: ${{matrix.rust}}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- run: rustup component add clippy && cargo clippy
- name: fmt
run: rustup component add rustfmt && cargo fmt --check
run: rustup component add rustfmt --toolchain stable && cargo +stable fmt --check
- name: Warnings
env:
RUSTFLAGS: -D warnings
Expand All @@ -140,7 +146,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Install cargo-deny
Expand Down
9 changes: 4 additions & 5 deletions .github/workflows/cross-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ on:
env:
CARGO_INCREMENTAL: false
FORCE_JAVASCRIPT_ACTIONS_TO_NODE20: true
RUSTUP_TOOLCHAIN: 1.91.0

permissions:
contents: read
Expand Down Expand Up @@ -83,7 +82,7 @@ jobs:
contents: read

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ needs.prepare.outputs.test_ref }}
fetch-depth: 0
Expand All @@ -95,7 +94,7 @@ jobs:

- name: Configure AWS Credentials
continue-on-error: true
uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6
uses: aws-actions/configure-aws-credentials@acca2b1b2070338fb9fd1ca27ecee81d687e58e5 # v6.1.2
with:
role-to-assume: arn:aws:iam::567805100031:role/github-runner-tract-ci
aws-region: us-east-2
Expand Down Expand Up @@ -141,15 +140,15 @@ jobs:
contents: read

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ needs.prepare.outputs.test_ref }}
fetch-depth: 0
persist-credentials: false

- name: Configure AWS Credentials
continue-on-error: true
uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6
uses: aws-actions/configure-aws-credentials@acca2b1b2070338fb9fd1ca27ecee81d687e58e5 # v6.1.2
with:
role-to-assume: arn:aws:iam::567805100031:role/github-runner-tract-ci
aws-region: us-east-2
Expand Down
Loading
Loading