Skip to main content

Deterministic numerical bisection debugger for Triton kernel floating-point drift

Project description

triton-blackhole

Open In Colab PyPI License: MIT

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:

  1. Output space (tensor axes)
  2. Grid space (program_id)
  3. 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

MIT · brian-mwirigi/triton-blackhole

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

triton_blackhole-0.2.0.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

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

triton_blackhole-0.2.0-py3-none-any.whl (29.7 kB view details)

Uploaded Python 3

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

Hashes for triton_blackhole-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a40b7ed0e3c4007a55539c85aa9bc209d9087aedc7f370d335b4d0b3095ead85
MD5 d4dbb67c5955ec8fab71c42b694c32d6
BLAKE2b-256 c972e077939ccd0b1c0f4262161ae2e07a55e2e8d21934c17a90121b39266a6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for triton_blackhole-0.2.0.tar.gz:

Publisher: publish.yml on brian-mwirigi/triton-blackhole

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file triton_blackhole-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for triton_blackhole-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 763f0cfe0beb08d55f5ecb56e3efa54057eaf687535c4961438710ae1ad7ce92
MD5 d2babbe832b2eb7a2ed5c986a2ddf119
BLAKE2b-256 5f9862f2dc2036ab8902fe09dd8ca50cdf43cb773b970b3f2ce7cca2700fad57

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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