Skip to main content

torch-abi-audit

Audit Python extension modules for compliance with the PyTorch Stable ABI (aoti_torch_* C shim and torch::stable::* / torch::headeronly::* C++ wrappers, introduced in PyTorch 2.9). Walks every .so shipped in a package — both Python extension modules and bundled internal libraries — and reports which stick to the stable surface and which reach into at:: / c10:: / torch::jit:: internals.

As a side benefit the same symbol-table walk also reports CPython Stable ABI (PEP 384) compliance, since the data is right there.

📖 Documentation: https://quansight.github.io/torch-abi-audit/

Install

pip install torch-abi-audit

Linux and macOS only for now (Windows requires dumpbin support — not yet implemented).

CLI usage

# Inspect an installed PyTorch ecosystem package by import name
torch-abi-audit torchaudio

# Inspect a path to an installed package or a single .so
torch-abi-audit /path/to/site-packages/somepkg

# Inspect every package in the current environment's site-packages
torch-abi-audit --env

# Inspect a specific site-packages directory
torch-abi-audit --site-packages /opt/venv/lib/python3.12/site-packages

# JSON output for tooling
torch-abi-audit --env --json | jq '.packages[] | select(.torch.uses_torch)'

Example output

Run against the three packages tracked by scripts/check_real_world.py (captured against torch 2.11.0 / torchaudio 2.11.0 / torchcodec 0.11.1):

Package: torchaudio
  Root: <venv>/lib/python3.11/site-packages/torchaudio
  Torch ABI:   STABLE
  CPython ABI: n/a
  Extensions:  0
  Bundled libs: 3
  -- bundled libs --
    [STABLE  ] [abi3-tagged-no-capi   ] lib/_torchaudio.abi3.so  (stable_shim=6, unstable=0)
    [STABLE  ] [abi3-tagged-no-capi   ] lib/libtorchaudio.abi3.so  (stable_shim=80, unstable=0)
    [STABLE  ] [abi3-tagged-no-capi   ] lib/torchaudio_prefixctc.abi3.so  (stable_shim=62, unstable=0)

Package: torch
  Root: <venv>/lib/python3.11/site-packages/torch
  Torch ABI:   UNSTABLE
  CPython ABI: no
  Extensions:  1
  Bundled libs: 13
  -- extensions --
    [NO-TORCH] [not-abi3              ] _C.cpython-311-aarch64-linux-gnu.so
  -- bundled libs --
    [UNSTABLE] [not-abi3              ] lib/libc10_cuda.so  (stable_shim=0, unstable=44)
    [UNSTABLE] [not-abi3              ] lib/libtorch_cpu.so  (stable_shim=0, unstable=327)
    [UNSTABLE] [not-abi3              ] lib/libtorch_cuda.so  (stable_shim=0, unstable=2515)
    [UNSTABLE] [uses-private-api      ] lib/libtorch_python.so  (stable_shim=0, unstable=5085)
    ... (9 more, mostly NO-TORCH or UNSTABLE)

Package: torchcodec
  Root: <venv>/lib/python3.11/site-packages/torchcodec
  Torch ABI:   UNSTABLE
  CPython ABI: no
  Extensions:  5
  Bundled libs: 10
  -- extensions --
    [NO-TORCH] [uses-private-api      ] libtorchcodec_pybind_ops4.so
    ... (4 similar)
  -- bundled libs --
    [UNSTABLE] [not-abi3              ] libtorchcodec_core4.so  (stable_shim=64, unstable=4)
    ... (4 similar)
    [STABLE  ] [uses-private-api      ] libtorchcodec_custom_ops4.so  (stable_shim=68, unstable=0)
    ... (4 similar)

torchaudio is reported as stable because every compiled library it ships links against aoti_torch_* and torch::stable::* only. torch lands on UNSTABLE because its bundled libtorch_python.so, libtorch_cpu.so, etc. naturally reference internal at:: / c10:: namespaces (torch implements those internals, after all). torchcodec is mid-migration: the custom_ops* libs already use the stable surface, but core* libs still link a handful of c10:: symbols.

Python API

from torch_abi_audit import (
    inspect_extension,
    inspect_package,
    inspect_site_packages,
)

report = inspect_package("torchaudio")
print(report.torch_verdict)             # "torch-stable" | "torch-unstable" | "no-torch"

# `extensions` holds Python extension modules; `bundled_libs` holds the
# rest of the compiled .so files (libtorch_python.so, STABLE_TORCH_LIBRARY
# plugins, etc.). Both contribute to the verdict.
for lib in (*report.extensions, *report.bundled_libs):
    print(lib.path, lib.torch.stable, lib.cpython.compliant)

Development

uv sync                          # install + dev dependencies in .venv
uv run pytest                    # run tests
uv run pyrefly check             # type-check
uv run zensical serve docs/      # local docs server

License

MIT — see LICENSE.

Release files for torch-abi-audit 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for torch-abi-audit 0.0.1
File Size Uploaded
torch_abi_audit-0.0.1.tar.gz 25.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for torch-abi-audit 0.0.1
File Interpreter ABI Platform
torch_abi_audit-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 41.6 kB

Release files / torch_abi_audit-0.0.1.tar.gz

Download URL torch_abi_audit-0.0.1.tar.gz
Size 25.0 kB
Tags Source
SHA-256 checksum
How to use checksums
adc0e46217c924841ad1f0d0debdc111d170185bedba2e150a8a59c4d80b8f08
BLAKE2b-256 checksum
How to use checksums
24872d1cf97407ed11b846cd420fed077f55e1655197e3f80f93cc3675d3dd5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 8, 2026.

Transparency log

Release files / torch_abi_audit-0.0.1-py3-none-any.whl

Download URL torch_abi_audit-0.0.1-py3-none-any.whl
Size 16.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2024a9cde3cb6c3794b82030da7768fae23735ab214fa6eccc791495e2b73594
BLAKE2b-256 checksum
How to use checksums
5a0ad701eecd6fef9212d947ecb787472ff6efe62917ff8814755d40c725a802
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 8, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page