Skip to content

kernels: describe-api for enlisting functions and layers. - #900

Open
sayakpaul wants to merge 1 commit into
mainfrom
kernels-describe-api-cli
Open

sayakpaul wants to merge 1 commit into
mainfrom
kernels-describe-api-cli

Conversation

@sayakpaul

@sayakpaul sayakpaul commented Oct 13, 2026 •

Copy link
Copy Markdown
Member

The final PR for kernels describe-api after:

Example:

kernels describe-api sayakpaul/liger-kernels

Repository: sayakpaul/liger-kernels
Revision: v2
Variant: torch-cuda

Functions:
  LigerForCausalLMLoss
  liger_rotary_pos_emb

Layers:
  LigerRMSNorm  has_backward=unknown  can_torch_compile=unknown
  LigerLinear  has_backward=unknown  can_torch_compile=True
  LigerSwiGLUMLP  has_backward=unknown  can_torch_compile=True
  LigerGEGLUMLP  has_backward=unknown  can_torch_compile=True
  LigerTiledSwiGLUMLP  has_backward=unknown  can_torch_compile=True
  LigerTiledGEGLUMLP  has_backward=unknown  can_torch_compile=True

@HuggingFaceDocBuilderDev

Copy link
Copy Markdown

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

@github-actions

Copy link
Copy Markdown

Coverage report — kernels/

Measured on: Python 3.10 / Torch 2.13.0.
Other CI configurations are not included in this number.
Hardware-gated code paths (ROCm/XPU/NPU/Darwin/Windows) are excluded or unreachable on the Linux+CUDA runner.

Total coverage: 87.5% — threshold: 80% — ✅

Per-file breakdown
Name Stmts Miss Cover Missing
src/kernels/__init__.py 14 0 100%
src/kernels/_system.py 6 1 83% 10
src/kernels/_versions.py 130 14 89% 53, 59-60, 63-64, 102, 165-170, 199, 219
src/kernels/archs.py 56 1 98% 94
src/kernels/backends.py 214 62 71% 42, 46, 50-53, 70, 92, 110, 119, 123, 127-129, 150, 159, 163, 167-169, 190, 201, 203, 210-213, 222, 226, 230-250, 258, 281-301
src/kernels/compat.py 9 1 89% 5
src/kernels/deps.py 70 1 99% 56
src/kernels/hf_hub.py 63 2 97% 21, 23
src/kernels/importer.py 44 5 89% 80, 84, 87, 101-102
src/kernels/install.py 21 7 67% 76-100
src/kernels/layer/__init__.py 6 0 100%
src/kernels/layer/_interval_tree.py 103 4 96% 23, 52, 147, 150
src/kernels/layer/device.py 48 14 71% 42, 47-49, 91, 96-98, 101, 149, 152, 155-157
src/kernels/layer/func.py 85 6 93% 90, 115, 191, 311, 338, 368
src/kernels/layer/globals.py 5 0 100%
src/kernels/layer/kernelize.py 82 8 90% 259, 297, 305-306, 312, 316, 332-334
src/kernels/layer/layer.py 309 22 93% 211, 258, 285, 416, 437, 444-447, 453-454, 556-557, 578, 586, 597, 637, 641, 654, 708, 738, 813
src/kernels/layer/mode.py 14 0 100%
src/kernels/layer/repos.py 144 42 71% 27, 33, 36-43, 63-64, 70, 73-76, 90, 94, 103-104, 110, 113-116, 123-124, 130, 133-136, 143-144, 150, 153-156, 163-164, 170, 173-176, 257
src/kernels/load.py 71 2 97% 338, 378
src/kernels/locking.py 89 64 28% 35-83, 91-98, 102-125, 137, 152-159, 165-175, 179-186
src/kernels/python_deps.py 58 6 90% 59-60, 64-65, 101, 104
src/kernels/resolver.py 158 1 99% 231
src/kernels/status.py 50 2 96% 25, 79
src/kernels/validate.py 88 5 94% 9, 100, 167, 190-191
src/kernels/variants.py 278 17 94% 65, 96, 117, 147, 256-257, 299-302, 304, 388-394, 400-406, 455-461
src/kernels/verify.py 127 6 95% 46, 202-204, 318-319
TOTAL 2342 293 87%

Updated by the Test kernels workflow on commit 14bc5620c9790c6d87ad51831ca5621ebc1a0e08.

def _find_variant_symbols(
variants: list[Variant], get_path: Callable[[str], Path | None], *, location: str
) -> tuple[Path, str]:
variant = min((v.variant_str for v in variants), default=None)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

???

Also, don't we want the variant that corresponds to the currently running system? E.g. some exports may be conditioned on on the backend. Seems like it'd be better to use a resolver?

Comment on lines +79 to +111
if version is not None:
revision = resolve_version_spec_as_ref(repo_id, version, local_files_only=constants.HF_HUB_OFFLINE).name
elif revision is None:
versions = _get_available_versions(repo_id, local_files_only=constants.HF_HUB_OFFLINE)
version = max(versions, default=None)
revision = versions[version].name if version is not None else "main"

location = f"{repo_id} (revision: {revision})"
if version is not None:
location = f"{repo_id} (version: {version}, revision: {revision})"

api = _get_hf_api()
try:
variants = get_variants(api, repo_id=repo_id, revision=revision)
except RemoteEntryNotFoundError:
variants = []

def get_path(filename: str) -> Path | None:
try:
symbols_path = api.hf_hub_download(
repo_id,
repo_type="kernel",
filename=f"build/{filename}",
revision=revision,
cache_dir=_get_cache_dir(),
local_files_only=constants.HF_HUB_OFFLINE,
)
except RemoteEntryNotFoundError:
return None
return Path(symbols_path)

symbols_path, variant = _find_variant_symbols(variants, get_path, location=location)
return symbols_path, revision, variant

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd get the latest version (if no version or revision is specified) and then completely rely on the resolver. I think we should avoid having custom fetches and variant discovery in the code base again.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants