diff --git a/.claude/skills/write-sglang-test/SKILL.md b/.claude/skills/write-sglang-test/SKILL.md index 6c945c6d2..6ae221361 100644 --- a/.claude/skills/write-sglang-test/SKILL.md +++ b/.claude/skills/write-sglang-test/SKILL.md @@ -11,7 +11,7 @@ This skill covers **how to write and register tests**. For CI pipeline internals 1. **Always use `CustomTestCase`** — never raw `unittest.TestCase`. It ensures `tearDownClass` runs even when `setUpClass` fails, preventing resource leaks in CI. 2. **`tearDownClass` must shut the server down gracefully** — call `terminate_and_kill_process_tree(cls.process)`, never a bare `kill_process_tree`. SIGKILL alone skips the server's userspace cleanup and leaves its GPU memory charged to the dead process; the next class then OOMs while loading weights. Keep it defensive too: `hasattr`/null checks before accessing resources (e.g. `cls.process`) that `setUpClass` may not have finished allocating. -3. **Place tests in `test/registered///`** — `` is `unit`, `kernel`, `e2e`, `accuracy`, `perf`, or `stress`; hardware belongs in registrations, not directory names +3. **Place non-kernel tests in `test/registered///`** — `` is `unit`, `e2e`, `accuracy`, `perf`, or `stress`; kernel tests use `test/registered/kernels/{ops,benchmark}//`; hardware belongs in registrations, not directory names 4. **Reuse server fixtures** — inherit from `DefaultServerBase` or write `setUpClass`/`tearDownClass` with `popen_launch_server` 5. **Mock boundaries, not SGLang behavior** — mock slow or external dependencies only when the assertion still checks an observable result, state transition, or error. A test whose evidence is only `assert_called*` mirrors its mock and is not admissible. Launch a real server only when inference results or lifecycle behavior are the contract under test. @@ -31,10 +31,8 @@ This skill covers **how to write and register tests**. For CI pipeline internals JIT kernel notes: - If the task is adding or updating code under `python/sglang/kernels/jit/`, prefer the `add-jit-kernel` skill first. -- New JIT kernel correctness tests use `test/registered/kernel/jit/**/test_*.py`. -- New JIT kernel benchmarks use `test/registered/kernel/jit/benchmark/**/bench_*.py`. -- `test/registered/jit/` also exists and still runs. It is a leftover from the kernel - reclassification (RFC #29630) that was never finished; do not add files there. +- JIT kernel correctness tests use `test/registered/kernels/ops//test_*.py`. +- JIT kernel benchmarks use `test/registered/kernels/benchmark//bench_*.py`. - Those files are executed by `test/run_suite.py` through dedicated kernel suites (`base-b-kernel-*`); a `register_*_ci(...)` call placed under `python/sglang/` is rejected by the `check-no-registered-tests-in-package` pre-commit hook. --- @@ -336,12 +334,12 @@ They are ordinary registered tests; only their stage differs: ```python from sglang.test.ci.ci_register import register_cuda_ci -# Correctness tests in test/registered/kernel/jit/ +# Correctness tests in test/registered/kernels/ops// register_cuda_ci(est_time=30, stage="base-b-kernel-unit", runner_config="1-gpu-large") register_cuda_ci(est_time=30, stage="base-b-kernel-unit", runner_config="4-gpu-b200") register_cuda_ci(est_time=120, stage="base-b-kernel-unit", runner_config="8-gpu-h200") -# Benchmarks in test/registered/kernel/jit/benchmark/ +# Benchmarks in test/registered/kernels/benchmark// register_cuda_ci(est_time=6, stage="base-b-kernel-benchmark", runner_config="1-gpu-large") # Optional nightly registration — same form, stage is just "nightly" @@ -375,8 +373,9 @@ A `register_*_ci(...)` under `python/sglang/` is rejected by the **Decision rule** (see also `test/registered/README.md`): - CPU component logic, no server → `registered/unit//` -- JIT kernel correctness / benchmarks → `registered/kernel/jit/` -- Other accelerator operator correctness → `registered/kernel//` +- JIT kernel correctness → `registered/kernels/ops//` +- JIT kernel benchmarks → `registered/kernels/benchmark//` +- Other accelerator operator correctness → `registered/kernels/ops//` - Server needed → `registered/e2e//` - Eval floor / performance contract → `registered/{accuracy,perf}//` - Local debugging → `manual/` @@ -422,7 +421,7 @@ Before submitting a test: - [ ] Inherits from `CustomTestCase` (not `unittest.TestCase`) - [ ] Has `register_*_ci(...)` call at module level - [ ] Placed in `test/registered///` -- [ ] JIT kernel work: test files live in `test/registered/kernel/jit/`; only test-only helpers stay under `python/sglang/kernels/jit/` +- [ ] JIT kernel work: correctness tests live in `test/registered/kernels/ops//`, benchmarks live in `test/registered/kernels/benchmark//`, and only test-only helpers stay under `python/sglang/kernels/jit/` - [ ] Backend-independent tests: `register_cuda_ci` only + smallest model - [ ] Logic that doesn't need a server / engine launch → unit test in `registered/unit/` (see Unit Tests section) - [ ] `tearDownClass` is defensive — uses `hasattr`/null checks before accessing resources that may not have been allocated diff --git a/.github/workflows/_pr-test-check-changes.yml b/.github/workflows/_pr-test-check-changes.yml index 9262678ea..6355e6e98 100644 --- a/.github/workflows/_pr-test-check-changes.yml +++ b/.github/workflows/_pr-test-check-changes.yml @@ -112,7 +112,6 @@ jobs: - "python/sglang/kernels/ops/diffusion/**" - "test/registered/kernels/ops/diffusion/**" - "test/registered/kernels/benchmark/diffusion/**" - - "test/registered/kernel/diffusion/**" - "test/registered/unit/diffusion/**" - "python/sglang/cli/**" jit_kernel: @@ -120,7 +119,6 @@ jobs: - ".github/workflows/pr-test-jit-kernel.yml" - "python/pyproject.toml" - "test/registered/kernels/**" - - "test/registered/kernel/diffusion/**" # sglang.kernels is the migrated kernel namespace (RFC #29630 / #30044); the # base-b-kernel suites import it directly, so kernel edits must run them. - "python/sglang/kernels/!(*.md)" diff --git a/python/sglang/multimodal_gen/runtime/layers/attention/backends/subblock_sparse/README.md b/python/sglang/multimodal_gen/runtime/layers/attention/backends/subblock_sparse/README.md index 283fb8afb..68f2185d8 100644 --- a/python/sglang/multimodal_gen/runtime/layers/attention/backends/subblock_sparse/README.md +++ b/python/sglang/multimodal_gen/runtime/layers/attention/backends/subblock_sparse/README.md @@ -191,7 +191,7 @@ are comparable. | `../subblock_sparse_attn.py` | the `AttentionBackend`: schedule, gating, dense fallback | Tests: `test/unit/test_subblock_sparse_attention.py` and -`test/registered/kernel/attention/test_subblock_sage_fp8_sm90.py`. The GPU +`test/registered/kernels/ops/attention/test_subblock_sage_fp8_sm90.py`. The GPU test covers the native production dispatch. Running at a full block budget must reproduce dense attention up to the expected quantization error, pinning routing indices, ragged tails, scale domains and the softmax scale in one check. diff --git a/python/sglang/srt/distributed/device_communicators/configs/custom_all_reduce_v2.py b/python/sglang/srt/distributed/device_communicators/configs/custom_all_reduce_v2.py index 8eb0962fc..c434ee861 100644 --- a/python/sglang/srt/distributed/device_communicators/configs/custom_all_reduce_v2.py +++ b/python/sglang/srt/distributed/device_communicators/configs/custom_all_reduce_v2.py @@ -1,9 +1,9 @@ """Hand-tuned dispatch configs for the JIT custom all-reduce (v2). Thresholds and block counts come from sweeps of -``test/registered/jit/benchmark/bench_custom_all_reduce.py`` on the listed -GPUs; ``get_all_reduce_config`` picks the table for the current arch and -world size. +``test/registered/kernels/benchmark/communication/bench_custom_all_reduce.py`` +on the listed GPUs; ``get_all_reduce_config`` picks the table for the current +arch and world size. """ from functools import cache diff --git a/scripts/lint/check_no_registered_tests_in_package.py b/scripts/lint/check_no_registered_tests_in_package.py index a1e6a30ff..d1e8e4f1f 100755 --- a/scripts/lint/check_no_registered_tests_in_package.py +++ b/scripts/lint/check_no_registered_tests_in_package.py @@ -4,11 +4,12 @@ Pre-commit hook: reject CI-registered tests that live inside the importable `sglang` package (python/sglang/). Registered tests and benchmarks must live under test/registered/ (e.g. -test/registered/jit/ for JIT kernel tests and test/registered/jit/benchmark/ -for JIT kernel benchmarks) so they are not shipped in the wheel and are -collected by run_suite.py's registered glob. A registered file placed inside -the package would be shipped to users AND silently dropped by run_suite.py -(which no longer globs the package) -- it would never run in CI. This guard +test/registered/kernels/ops/ for kernel tests and +test/registered/kernels/benchmark/ for kernel benchmarks) so they are not +shipped in the wheel and are collected by run_suite.py's registered glob. A +registered file placed inside the package would be shipped to users AND +silently dropped by run_suite.py (which no longer globs the package) -- it +would never run in CI. This guard turns that silent skip into a hard failure. Reuses ut_parse_one_file() from ci_register.py (AST-based) so the registry @@ -65,8 +66,8 @@ def main() -> int: ) print( " Registered tests and benchmarks must live under test/registered/\n" - " (e.g. test/registered/jit/ for JIT kernel tests and\n" - " test/registered/jit/benchmark/ for JIT kernel benchmarks) so they\n" + " (e.g. test/registered/kernels/ops/ for kernel tests and\n" + " test/registered/kernels/benchmark/ for kernel benchmarks) so they\n" " are not shipped in the wheel and are collected by run_suite.py.\n" ) for f in offenders: diff --git a/scripts/lint/check_registered_tests.py b/scripts/lint/check_registered_tests.py index 2cb489a97..79d753255 100755 --- a/scripts/lint/check_registered_tests.py +++ b/scripts/lint/check_registered_tests.py @@ -39,10 +39,11 @@ _MODERN_SHAPE = re.compile(r"^(.+)-test-(.+)$") # no suite any workflow invokes and the test silently never runs. _LEGACY_CUDA_PREFIXES = ("stress",) -_TEST_KINDS = {"unit", "kernel", "e2e", "accuracy", "perf", "stress"} +_TEST_KINDS = {"unit", "e2e", "accuracy", "perf", "stress"} +_KERNEL_ROOT = "kernels" # Flat vendor trees. Vendor-only coverage fits no kind above: no XPU/NPU suite -# carries the `-kernel-` infix `kernel` needs, and these launch device work. +# carries the `-kernel-` infix the kernel tree needs, and these launch device work. _VENDOR_DIRS = {"amd", "mlx", "musa", "npu", "xpu"} @@ -132,11 +133,22 @@ def taxonomy_errors(path: str, registries: list, tree: ast.AST) -> list[str]: relative_parts = parts[2:] if parts[:2] == ["test", "registered"] else [] if relative_parts and relative_parts[0] in _VENDOR_DIRS: return [] + if relative_parts and relative_parts[0] == _KERNEL_ROOT: + errors = [] + if len(relative_parts) < 4 or relative_parts[1] not in {"ops", "benchmark"}: + errors.append( + f"{path}: kernel tests must live under " + "test/registered/kernels/{ops,benchmark}//" + ) + if any("-kernel-" not in (r.effective_suite or "") for r in registries): + errors.append(f"{path}: kernel tests must use a *-kernel-* suite") + return errors if len(relative_parts) < 3 or relative_parts[0] not in _TEST_KINDS: return [ f"{path}: registered tests must live under " "test/registered///; kind must be one of " + ", ".join(sorted(_TEST_KINDS)) + + "; kernel tests use test/registered/kernels/{ops,benchmark}//" ] kind = relative_parts[0] @@ -153,9 +165,6 @@ def taxonomy_errors(path: str, registries: list, tree: ast.AST) -> list[str]: errors.append(f"{path}: unit test est_time must be <= 60 seconds") if _contains_call(tree, "popen_launch_server"): errors.append(f"{path}: unit tests may not launch a server") - elif kind == "kernel": - if any("-kernel-" not in (r.effective_suite or "") for r in registries): - errors.append(f"{path}: kernel tests must use a *-kernel-* suite") elif kind in {"accuracy", "perf"}: invalid = [ r diff --git a/scripts/lint/test_check_registered_tests.py b/scripts/lint/test_check_registered_tests.py new file mode 100644 index 000000000..cbed176d1 --- /dev/null +++ b/scripts/lint/test_check_registered_tests.py @@ -0,0 +1,51 @@ +import ast +import unittest +from types import SimpleNamespace + +from scripts.lint.check_registered_tests import taxonomy_errors + + +def _registry(suite: str): + return SimpleNamespace(effective_suite=suite, est_time=1) + + +class TestRegisteredTestTaxonomy(unittest.TestCase): + def setUp(self): + self.tree = ast.parse("") + self.kernel_registry = [_registry("base-b-kernel-unit-test-1-gpu-large")] + + def test_plural_kernel_ops_layout_is_accepted(self): + errors = taxonomy_errors( + "test/registered/kernels/ops/attention/test_example.py", + self.kernel_registry, + self.tree, + ) + self.assertEqual(errors, []) + + def test_plural_kernel_benchmark_layout_is_accepted(self): + errors = taxonomy_errors( + "test/registered/kernels/benchmark/attention/bench_example.py", + [_registry("base-b-kernel-benchmark-test-1-gpu-large")], + self.tree, + ) + self.assertEqual(errors, []) + + def test_singular_kernel_root_is_rejected(self): + errors = taxonomy_errors( + "test/registered/kernel/attention/test_example.py", + self.kernel_registry, + self.tree, + ) + self.assertTrue(errors) + + def test_kernel_group_is_required(self): + errors = taxonomy_errors( + "test/registered/kernels/ops/test_example.py", + self.kernel_registry, + self.tree, + ) + self.assertTrue(errors) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/README.md b/test/README.md index 1656837cd..9ce06d2af 100644 --- a/test/README.md +++ b/test/README.md @@ -11,9 +11,9 @@ The CI pipeline runs in three sequential stages: **A** (pre-flight, ~3 min) → ## Folder Organization -- `registered/`: CI test files, auto-discovered by `run_suite.py`. Most tests live here. JIT kernel tests are an exception (see below). +- `registered/`: CI test files, including kernel tests and benchmarks, auto-discovered by `run_suite.py`. - `manual/`: Non-CI tests for local debugging or special setups. -- `run_suite.py`: CI runner — scans `registered/` and JIT kernel directories. +- `run_suite.py`: CI runner — scans `registered/` recursively. The system supports both [unittest](https://docs.python.org/3/library/unittest.html) and [pytest](https://docs.pytest.org/en/stable/). The launcher runs `python filename.py -f` with **failfast enabled by default**. @@ -44,7 +44,7 @@ python3 test/registered/core/test_srt_endpoint.py python3 test/registered/core/test_srt_endpoint.py TestSRTEndpoint.test_simple_decode # Single JIT kernel test -python3 test/registered/jit/test_add_constant.py +python3 test/registered/kernels/ops/elementwise/test_add_constant.py # Run a suite python3 test/run_suite.py --hw cpu --suite base-a-test-cpu @@ -72,13 +72,15 @@ Parameters: `est_time` (seconds), `stage` + `runner_config` (target stage and ru Keep `est_time`, `stage`, `runner_config` as **literal values** — `run_suite.py` collects them by AST parsing. -New and renamed tests use this layout: +New and renamed non-kernel tests use this layout: ```text test/registered///test_*.py ``` -`` is one of `unit`, `kernel`, `e2e`, `accuracy`, `perf`, or `stress`. +`` is one of `unit`, `e2e`, `accuracy`, `perf`, or `stress`. Kernel tests +use `test/registered/kernels/{ops,benchmark}//`, retaining the established +plural `kernels` root. Hardware is expressed by one or more `register_*_ci` calls, never by creating a new top-level hardware directory. The admission checker applies the layout and kind/suite contract incrementally while legacy paths are migrated. @@ -87,13 +89,13 @@ Diffusion workflows also enter through `test/run_suite.py`; registered bridge files preserve their case-level pytest partitioning until the remaining diffusion cases are moved out of the package test-support tree. -New JIT kernel correctness tests and benchmarks live under -`test/registered/kernel/jit/`; legacy `test/registered/jit/` files are migrated -incrementally. Helpers stay alongside the kernel source under -`python/sglang/kernels/jit/` and are imported by absolute path: +Kernel correctness tests and benchmarks use the established plural `kernels` +root and mirror the operator group under `python/sglang/kernels/ops/`. Helpers +stay alongside the kernel source under `python/sglang/kernels/jit/` and are +imported by absolute path: -- Correctness tests: `test/registered/kernel/jit/test_*.py` → `base-b-kernel-unit-test-1-gpu-large` -- Benchmarks: `test/registered/kernel/jit/benchmark/bench_*.py` → `base-b-kernel-benchmark-test-1-gpu-large` +- Correctness tests: `test/registered/kernels/ops//test_*.py` → `base-b-kernel-unit-test-1-gpu-large` +- Benchmarks: `test/registered/kernels/benchmark//bench_*.py` → `base-b-kernel-benchmark-test-1-gpu-large` ## Choosing a Suite diff --git a/test/registered/kernels/benchmark/attention/bench_fused_qknorm_rope.py b/test/registered/kernels/benchmark/attention/bench_fused_qknorm_rope.py index 51942890e..2d80a4dfc 100644 --- a/test/registered/kernels/benchmark/attention/bench_fused_qknorm_rope.py +++ b/test/registered/kernels/benchmark/attention/bench_fused_qknorm_rope.py @@ -5,7 +5,7 @@ Measures throughput (µs) for fused_qk_norm_rope across typical LLM configurations (head_dim × num_heads × num_tokens). Run: - python test/registered/jit/benchmark/bench_fused_qknorm_rope.py + python test/registered/kernels/benchmark/attention/bench_fused_qknorm_rope.py """ import itertools diff --git a/test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py b/test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py index 51d8addbe..e2fb7d7aa 100644 --- a/test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py +++ b/test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py @@ -11,9 +11,9 @@ Providers: Usage:: # Benchmark on the default world sizes (2, 4, 8 GPUs): - python test/registered/jit/benchmark/bench_symm_mem_all_gather.py + python test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py # Pick a specific world size (or comma-separated list): - python test/registered/jit/benchmark/bench_symm_mem_all_gather.py --num-gpu 8 + python test/registered/kernels/benchmark/communication/bench_symm_mem_all_gather.py --num-gpu 8 """ from __future__ import annotations diff --git a/test/registered/kernel/diffusion/benchmark/bench_vdn_delta_factors.py b/test/registered/kernels/benchmark/diffusion/bench_vdn_delta_factors.py similarity index 100% rename from test/registered/kernel/diffusion/benchmark/bench_vdn_delta_factors.py rename to test/registered/kernels/benchmark/diffusion/bench_vdn_delta_factors.py diff --git a/test/registered/kernels/benchmark/gemm/bench_dsv3_fused_a_gemm.py b/test/registered/kernels/benchmark/gemm/bench_dsv3_fused_a_gemm.py index 8f6e4acc8..36b976cea 100644 --- a/test/registered/kernels/benchmark/gemm/bench_dsv3_fused_a_gemm.py +++ b/test/registered/kernels/benchmark/gemm/bench_dsv3_fused_a_gemm.py @@ -1,7 +1,7 @@ """Benchmark for DeepSeek V3 fused QKV-A GEMM: CuTe DSL vs CUDA JIT vs torch. Run on SM90+ (Hopper or later): - python test/registered/jit/benchmark/bench_dsv3_fused_a_gemm.py + python test/registered/kernels/benchmark/gemm/bench_dsv3_fused_a_gemm.py """ import torch diff --git a/test/registered/jit/benchmark/bench_hisparse_spec.py b/test/registered/kernels/benchmark/kvcache/bench_hisparse_spec.py similarity index 100% rename from test/registered/jit/benchmark/bench_hisparse_spec.py rename to test/registered/kernels/benchmark/kvcache/bench_hisparse_spec.py diff --git a/test/registered/kernel/attention/test_deepseek_v4_compress_plan_bounds.py b/test/registered/kernels/ops/attention/test_deepseek_v4_compress_plan_bounds.py similarity index 100% rename from test/registered/kernel/attention/test_deepseek_v4_compress_plan_bounds.py rename to test/registered/kernels/ops/attention/test_deepseek_v4_compress_plan_bounds.py diff --git a/test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py b/test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py index 9a2f392a0..b201874f8 100644 --- a/test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py +++ b/test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py @@ -11,10 +11,10 @@ # # Test command: # python3 -m pytest -q \ -# test/registered/jit/test_deepseek_v4_compress_state_runtime_shapes.py +# test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py # # Runtime-shape benchmark command: -# python3 test/registered/jit/test_deepseek_v4_compress_state_runtime_shapes.py \ +# python3 test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py \ # --benchmark \ # --shape-source runtime \ # --warmup 20 \ @@ -22,7 +22,7 @@ # --csv /data00/eval_results/operator_bench/runtime_shape_bench.csv # # Synthetic Flash/Pro shape benchmark command: -# python3 test/registered/jit/test_deepseek_v4_compress_state_runtime_shapes.py \ +# python3 test/registered/kernels/ops/attention/test_deepseek_v4_compress_state_runtime_shapes.py \ # --benchmark \ # --shape-source preset \ # --shape-presets all \ diff --git a/test/registered/kernel/attention/test_dsa_kpool_metadata_fusion.py b/test/registered/kernels/ops/attention/test_dsa_kpool_metadata_fusion.py similarity index 100% rename from test/registered/kernel/attention/test_dsa_kpool_metadata_fusion.py rename to test/registered/kernels/ops/attention/test_dsa_kpool_metadata_fusion.py diff --git a/test/registered/kernel/attention/test_dsa_metadata_replay.py b/test/registered/kernels/ops/attention/test_dsa_metadata_replay.py similarity index 100% rename from test/registered/kernel/attention/test_dsa_metadata_replay.py rename to test/registered/kernels/ops/attention/test_dsa_metadata_replay.py diff --git a/test/registered/kernel/attention/test_dsv4_q_rope_store.py b/test/registered/kernels/ops/attention/test_dsv4_q_rope_store.py similarity index 100% rename from test/registered/kernel/attention/test_dsv4_q_rope_store.py rename to test/registered/kernels/ops/attention/test_dsv4_q_rope_store.py diff --git a/test/registered/kernel/attention/test_flashmla_sched_meta.py b/test/registered/kernels/ops/attention/test_flashmla_sched_meta.py similarity index 100% rename from test/registered/kernel/attention/test_flashmla_sched_meta.py rename to test/registered/kernels/ops/attention/test_flashmla_sched_meta.py diff --git a/test/registered/kernel/attention/test_kda_fused_verify_backend.py b/test/registered/kernels/ops/attention/test_kda_fused_verify_backend.py similarity index 100% rename from test/registered/kernel/attention/test_kda_fused_verify_backend.py rename to test/registered/kernels/ops/attention/test_kda_fused_verify_backend.py diff --git a/test/registered/kernel/ops/attention/test_kda_track_state.py b/test/registered/kernels/ops/attention/test_kda_track_state.py similarity index 100% rename from test/registered/kernel/ops/attention/test_kda_track_state.py rename to test/registered/kernels/ops/attention/test_kda_track_state.py diff --git a/test/registered/kernel/attention/test_subblock_sage_fp8_sm90.py b/test/registered/kernels/ops/attention/test_subblock_sage_fp8_sm90.py similarity index 100% rename from test/registered/kernel/attention/test_subblock_sage_fp8_sm90.py rename to test/registered/kernels/ops/attention/test_subblock_sage_fp8_sm90.py diff --git a/test/registered/kernel/communication/test_deterministic_reduce_scatter.py b/test/registered/kernels/ops/communication/test_deterministic_reduce_scatter.py similarity index 100% rename from test/registered/kernel/communication/test_deterministic_reduce_scatter.py rename to test/registered/kernels/ops/communication/test_deterministic_reduce_scatter.py diff --git a/test/registered/kernels/ops/communication/test_symm_mem_all_gather.py b/test/registered/kernels/ops/communication/test_symm_mem_all_gather.py index 5d613701f..5cdd16470 100644 --- a/test/registered/kernels/ops/communication/test_symm_mem_all_gather.py +++ b/test/registered/kernels/ops/communication/test_symm_mem_all_gather.py @@ -7,12 +7,12 @@ NCCL all-gather for a sweep of token counts, hidden widths, and the Usage:: # Run on the default world sizes (2, 4, 8 GPUs): - python test/registered/jit/test_symm_mem_all_gather.py + python test/registered/kernels/ops/communication/test_symm_mem_all_gather.py # Pick a specific world size (or comma-separated list): - python test/registered/jit/test_symm_mem_all_gather.py --num-gpu 4 - python test/registered/jit/test_symm_mem_all_gather.py --num-gpu 2,4,8 + python test/registered/kernels/ops/communication/test_symm_mem_all_gather.py --num-gpu 4 + python test/registered/kernels/ops/communication/test_symm_mem_all_gather.py --num-gpu 2,4,8 # Extra pytest args (forwarded to each torchrun worker): - python test/registered/jit/test_symm_mem_all_gather.py -k 16384 + python test/registered/kernels/ops/communication/test_symm_mem_all_gather.py -k 16384 """ from __future__ import annotations diff --git a/test/registered/kernel/cuda_graph/test_cuda_graph_dedup.py b/test/registered/kernels/ops/cuda_graph/test_cuda_graph_dedup.py similarity index 100% rename from test/registered/kernel/cuda_graph/test_cuda_graph_dedup.py rename to test/registered/kernels/ops/cuda_graph/test_cuda_graph_dedup.py diff --git a/test/registered/jit/test_flux2_gated_resnorm.py b/test/registered/kernels/ops/diffusion/test_flux2_gated_resnorm.py similarity index 100% rename from test/registered/jit/test_flux2_gated_resnorm.py rename to test/registered/kernels/ops/diffusion/test_flux2_gated_resnorm.py diff --git a/test/registered/kernel/diffusion/test_longcat_image_norm_modulate.py b/test/registered/kernels/ops/diffusion/test_longcat_image_norm_modulate.py similarity index 100% rename from test/registered/kernel/diffusion/test_longcat_image_norm_modulate.py rename to test/registered/kernels/ops/diffusion/test_longcat_image_norm_modulate.py diff --git a/test/registered/kernel/diffusion/test_mxfp8_swizzled.py b/test/registered/kernels/ops/diffusion/test_mxfp8_swizzled.py similarity index 100% rename from test/registered/kernel/diffusion/test_mxfp8_swizzled.py rename to test/registered/kernels/ops/diffusion/test_mxfp8_swizzled.py diff --git a/test/registered/kernel/diffusion/test_qknorm_rope_out_of_place.py b/test/registered/kernels/ops/diffusion/test_qknorm_rope_out_of_place.py similarity index 100% rename from test/registered/kernel/diffusion/test_qknorm_rope_out_of_place.py rename to test/registered/kernels/ops/diffusion/test_qknorm_rope_out_of_place.py diff --git a/test/registered/kernel/diffusion/test_sana_wm_conv_post.py b/test/registered/kernels/ops/diffusion/test_sana_wm_conv_post.py similarity index 100% rename from test/registered/kernel/diffusion/test_sana_wm_conv_post.py rename to test/registered/kernels/ops/diffusion/test_sana_wm_conv_post.py diff --git a/test/registered/kernel/diffusion/test_sana_wm_reverse_scan.py b/test/registered/kernels/ops/diffusion/test_sana_wm_reverse_scan.py similarity index 100% rename from test/registered/kernel/diffusion/test_sana_wm_reverse_scan.py rename to test/registered/kernels/ops/diffusion/test_sana_wm_reverse_scan.py diff --git a/test/registered/kernel/diffusion/test_vdn_delta_factors.py b/test/registered/kernels/ops/diffusion/test_vdn_delta_factors.py similarity index 100% rename from test/registered/kernel/diffusion/test_vdn_delta_factors.py rename to test/registered/kernels/ops/diffusion/test_vdn_delta_factors.py diff --git a/test/registered/kernel/diffusion/test_vdn_linear_branch.py b/test/registered/kernels/ops/diffusion/test_vdn_linear_branch.py similarity index 100% rename from test/registered/kernel/diffusion/test_vdn_linear_branch.py rename to test/registered/kernels/ops/diffusion/test_vdn_linear_branch.py diff --git a/test/registered/kernel/disaggregation/test_kv_checksum.py b/test/registered/kernels/ops/disaggregation/test_kv_checksum.py similarity index 100% rename from test/registered/kernel/disaggregation/test_kv_checksum.py rename to test/registered/kernels/ops/disaggregation/test_kv_checksum.py diff --git a/test/registered/kernel/jit/test_fast_topk.py b/test/registered/kernels/ops/elementwise/test_fast_topk.py similarity index 100% rename from test/registered/kernel/jit/test_fast_topk.py rename to test/registered/kernels/ops/elementwise/test_fast_topk.py diff --git a/test/registered/kernel/jit/test_hc_combine.py b/test/registered/kernels/ops/elementwise/test_hc_combine.py similarity index 100% rename from test/registered/kernel/jit/test_hc_combine.py rename to test/registered/kernels/ops/elementwise/test_hc_combine.py diff --git a/test/registered/kernel/embeddings/test_qwen4_ple_offload.py b/test/registered/kernels/ops/embeddings/test_qwen4_ple_offload.py similarity index 100% rename from test/registered/kernel/embeddings/test_qwen4_ple_offload.py rename to test/registered/kernels/ops/embeddings/test_qwen4_ple_offload.py diff --git a/test/registered/kernel/hyperconnection/test_hc_mix_triton.py b/test/registered/kernels/ops/hyperconnection/test_hc_mix_triton.py similarity index 100% rename from test/registered/kernel/hyperconnection/test_hc_mix_triton.py rename to test/registered/kernels/ops/hyperconnection/test_hc_mix_triton.py diff --git a/test/registered/kernels/ops/kimi_k3/test_ar_fusion.py b/test/registered/kernels/ops/kimi_k3/test_ar_fusion.py index 4b04e87b4..0bbcadd5a 100644 --- a/test/registered/kernels/ops/kimi_k3/test_ar_fusion.py +++ b/test/registered/kernels/ops/kimi_k3/test_ar_fusion.py @@ -10,7 +10,7 @@ semaphore window cycling. Usage:: - python test/registered/jit/kimi_k3/test_ar_fusion.py # relaunches under torchrun (8 GPUs) + python test/registered/kernels/ops/kimi_k3/test_ar_fusion.py # relaunches under torchrun (8 GPUs) """ from __future__ import annotations diff --git a/test/registered/jit/test_hisparse_spec.py b/test/registered/kernels/ops/kvcache/test_hisparse_spec.py similarity index 100% rename from test/registered/jit/test_hisparse_spec.py rename to test/registered/kernels/ops/kvcache/test_hisparse_spec.py diff --git a/test/registered/kernel/jit/test_grouped_gemma_rmsnorm.py b/test/registered/kernels/ops/layernorm/test_grouped_gemma_rmsnorm.py similarity index 100% rename from test/registered/kernel/jit/test_grouped_gemma_rmsnorm.py rename to test/registered/kernels/ops/layernorm/test_grouped_gemma_rmsnorm.py diff --git a/test/registered/kernel/layernorm/test_mxfp8_epilogue.py b/test/registered/kernels/ops/layernorm/test_mxfp8_epilogue.py similarity index 100% rename from test/registered/kernel/layernorm/test_mxfp8_epilogue.py rename to test/registered/kernels/ops/layernorm/test_mxfp8_epilogue.py diff --git a/test/registered/kernel/memory/test_adler32_checksum.py b/test/registered/kernels/ops/memory/test_adler32_checksum.py similarity index 100% rename from test/registered/kernel/memory/test_adler32_checksum.py rename to test/registered/kernels/ops/memory/test_adler32_checksum.py diff --git a/test/registered/kernel/moe/test_deepep_v2_contig_scatter.py b/test/registered/kernels/ops/moe/test_deepep_v2_contig_scatter.py similarity index 100% rename from test/registered/kernel/moe/test_deepep_v2_contig_scatter.py rename to test/registered/kernels/ops/moe/test_deepep_v2_contig_scatter.py diff --git a/test/registered/kernel/moe/test_jit_grouped_topk.py b/test/registered/kernels/ops/moe/test_jit_grouped_topk.py similarity index 100% rename from test/registered/kernel/moe/test_jit_grouped_topk.py rename to test/registered/kernels/ops/moe/test_jit_grouped_topk.py diff --git a/test/registered/kernel/qsa/test_qsa.py b/test/registered/kernels/ops/qsa/test_qsa.py similarity index 100% rename from test/registered/kernel/qsa/test_qsa.py rename to test/registered/kernels/ops/qsa/test_qsa.py diff --git a/test/registered/kernel/qsa/test_qsa_indexer.py b/test/registered/kernels/ops/qsa/test_qsa_indexer.py similarity index 100% rename from test/registered/kernel/qsa/test_qsa_indexer.py rename to test/registered/kernels/ops/qsa/test_qsa_indexer.py diff --git a/test/registered/kernel/qsa/test_qsa_strided_zero_fill.py b/test/registered/kernels/ops/qsa/test_qsa_strided_zero_fill.py similarity index 99% rename from test/registered/kernel/qsa/test_qsa_strided_zero_fill.py rename to test/registered/kernels/ops/qsa/test_qsa_strided_zero_fill.py index 9e8422884..89973cd8a 100644 --- a/test/registered/kernel/qsa/test_qsa_strided_zero_fill.py +++ b/test/registered/kernels/ops/qsa/test_qsa_strided_zero_fill.py @@ -4,7 +4,7 @@ Poison the packed scratch with NaN, gather with the strided layout used by `_forward_trtllm_sparse`, and require that (a) valid rows are copied exactly and (b) every slot in [valid_count, stride) is zero, so the paged decode kernel can never multiply masked probabilities into stale NaN/Inf bytes. Also checks the compact -(FA2 fallback) layout is unchanged. Intended for test/registered/kernel/qsa/. +(FA2 fallback) layout is unchanged. Intended for test/registered/kernels/ops/qsa/. """ import sys diff --git a/test/registered/kernel/quantization/test_fp8_utils_aiter.py b/test/registered/kernels/ops/quantization/test_fp8_utils_aiter.py similarity index 100% rename from test/registered/kernel/quantization/test_fp8_utils_aiter.py rename to test/registered/kernels/ops/quantization/test_fp8_utils_aiter.py diff --git a/test/registered/kernel/speculative/test_dflash_domino.py b/test/registered/kernels/ops/speculative/test_dflash_domino.py similarity index 100% rename from test/registered/kernel/speculative/test_dflash_domino.py rename to test/registered/kernels/ops/speculative/test_dflash_domino.py diff --git a/test/registered/kernel/speculative/test_spec_kv_indices_grid.py b/test/registered/kernels/ops/speculative/test_spec_kv_indices_grid.py similarity index 100% rename from test/registered/kernel/speculative/test_spec_kv_indices_grid.py rename to test/registered/kernels/ops/speculative/test_spec_kv_indices_grid.py diff --git a/test/registered/kernel/speculative/test_verify_commit_triton.py b/test/registered/kernels/ops/speculative/test_verify_commit_triton.py similarity index 100% rename from test/registered/kernel/speculative/test_verify_commit_triton.py rename to test/registered/kernels/ops/speculative/test_verify_commit_triton.py diff --git a/test/registered/unit/README.md b/test/registered/unit/README.md index 5a5fb66f9..7fc2576a5 100644 --- a/test/registered/unit/README.md +++ b/test/registered/unit/README.md @@ -2,7 +2,7 @@ CPU-only component tests that do **not** launch a server, load model weights, or require an accelerator. GPU operator correctness belongs under -`test/registered/kernel//`. +`test/registered/kernels/ops//`. ## Quick Start