Deterministic numerical bisection debugger for Triton kernel floating-point drift
Project description
triton-blackhole
torch.allclose failed. Now what?
triton-blackhole is a deterministic numerical debugger for Triton kernels. It finds where your output diverges from a PyTorch reference — and whether it's benign fp16/bf16 drift or a real bug — without tl.device_print floods or TRITON_INTERPRET.
from triton_blackhole import verify_drift
@verify_drift(torch_ref, block_sizes=(BLOCK_M, BLOCK_N))
def run(a, b):
return launch_triton(a, b)
run(a, b) # silent if OK; AssertionError + drift artifact if not
▶ Open the 2‑minute Colab demo (Runtime → GPU)
The pain
| You try… | What happens |
|---|---|
torch.allclose(...) |
False. No index. No cause. |
tl.device_print |
Thousands of unsynced lines. No tensor context. |
TRITON_INTERPRET=1 |
Breaks on bf16 / tl.load(tl.load(...)). Not your real kernel. |
The fix (TritonDrift loop)
| Feature | What you get |
|---|---|
@verify_drift |
Drop-in decorator: capture inputs, compare, emit artifact |
Output → program_id |
Map hotspot [i,j] → tile / program_id via BLOCK_* |
| AST probe injection | Rewrite kernel AST; dump intermediates only on the failing pid |
| Precision-aware diff | bf16/fp16 tolerances + classify_drift |
| Terminal artifact | Failing block, expected vs actual, probe stats |
from triton_blackhole import verify_drift, run_drift_verify, index_to_program_id
# Decorator (pytest-friendly)
@verify_drift(torch_ref, block_sizes=(32, 32), raise_on_fail=True)
def run(a, b):
return triton_launch(a, b)
# Or functional
art = run_drift_verify(tri_out, ref_out, block_sizes=(32, 32))
print(art.report()) # compare + grid map + bisect
Optional: AST dump on the failing block
def relaunch(ikernel, failing_pid, debug_buf, a, b):
out = torch.empty_like(...)
ikernel[(grid,)](
a, b, out, ...,
_bh_dbg_ptr=debug_buf,
_BH_FAILING_PID=failing_pid,
)
return out
@verify_drift(
torch_ref,
block_sizes=(BLOCK_M, BLOCK_N),
kernel=my_kernel, # original @triton.jit fn
probes=["acc"], # local names assigned in the kernel
relaunch=relaunch,
)
def run(a, b):
return launch(a, b)
Install
pip install triton-blackhole
Optional (Linux / WSL2 / Colab with NVIDIA):
pip install triton-blackhole[triton]
# On Colab, pin Triton to whatever torch wants, e.g.:
# pip install "triton==3.6.0"
From source:
pip install -e ".[dev]"
Platforms
| Piece | Native Windows | WSL2 + NVIDIA | Linux + NVIDIA | Colab GPU |
|---|---|---|---|---|
| Debugger (compare / bisect / classify) | ✅ | ✅ | ✅ | ✅ |
| Live Triton kernels | ❌ | ✅ | ✅ | ✅ |
No NVIDIA laptop? Use the Colab badge above.
Tile bisection (real kernels)
from triton_blackhole import bisect_tiles
def launch(pid_lo, pid_hi):
return run_triton_kernel(..., pid_lo=pid_lo, pid_hi=pid_hi)
print(bisect_tiles(launch, torch_ref, num_programs=grid).report())
Stage probes (not device_print)
from triton_blackhole.probe import ProbeBank
bank = ProbeBank()
bank.capture("pre_softmax", scores_ref, side="ref")
bank.capture("pre_softmax", scores_tri, side="tri")
print(bank.report()) # first diverging stage
CLI
triton-blackhole compare triton_out.pt torch_ref.pt --bisect --suggest
Why not TRITON_INTERPRET?
We never interpret the kernel. We bisect:
- Output space (tensor axes)
- Grid space (
program_id) - Stage space (named intermediates)
Same binary as production — bf16, tensor cores, indirect loads included.
Examples
python examples/demo_verify_drift.py
python examples/demo_verify_ast_triton.py # needs CUDA + triton
python examples/demo_softmax_drift.py
python examples/demo_tile_bisect.py
python examples/demo_triton_add.py
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file triton_blackhole-0.2.0.tar.gz.
File metadata
- Download URL: triton_blackhole-0.2.0.tar.gz
- Upload date:
- Size: 28.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a40b7ed0e3c4007a55539c85aa9bc209d9087aedc7f370d335b4d0b3095ead85
|
|
| MD5 |
d4dbb67c5955ec8fab71c42b694c32d6
|
|
| BLAKE2b-256 |
c972e077939ccd0b1c0f4262161ae2e07a55e2e8d21934c17a90121b39266a6a
|
Provenance
The following attestation bundles were made for triton_blackhole-0.2.0.tar.gz:
Publisher:
publish.yml on brian-mwirigi/triton-blackhole
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
triton_blackhole-0.2.0.tar.gz -
Subject digest:
a40b7ed0e3c4007a55539c85aa9bc209d9087aedc7f370d335b4d0b3095ead85 - Sigstore transparency entry: 2226919048
- Sigstore integration time:
-
Permalink:
brian-mwirigi/triton-blackhole@451b9719f4ee35723f9db1944e3203159a30618c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/brian-mwirigi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@451b9719f4ee35723f9db1944e3203159a30618c -
Trigger Event:
release
-
Statement type:
File details
Details for the file triton_blackhole-0.2.0-py3-none-any.whl.
File metadata
- Download URL: triton_blackhole-0.2.0-py3-none-any.whl
- Upload date:
- Size: 29.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
763f0cfe0beb08d55f5ecb56e3efa54057eaf687535c4961438710ae1ad7ce92
|
|
| MD5 |
d2babbe832b2eb7a2ed5c986a2ddf119
|
|
| BLAKE2b-256 |
5f9862f2dc2036ab8902fe09dd8ca50cdf43cb773b970b3f2ce7cca2700fad57
|
Provenance
The following attestation bundles were made for triton_blackhole-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on brian-mwirigi/triton-blackhole
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
triton_blackhole-0.2.0-py3-none-any.whl -
Subject digest:
763f0cfe0beb08d55f5ecb56e3efa54057eaf687535c4961438710ae1ad7ce92 - Sigstore transparency entry: 2226919572
- Sigstore integration time:
-
Permalink:
brian-mwirigi/triton-blackhole@451b9719f4ee35723f9db1944e3203159a30618c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/brian-mwirigi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@451b9719f4ee35723f9db1944e3203159a30618c -
Trigger Event:
release
-
Statement type: