Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

173 lines
13 KiB
Markdown

# rocKE Layout Restructure: Final Structure (SDPA carve)
**Branch:** `users/bharriso/rocke-layout-restructure` (off latest `develop`,
includes the merged `rocke-client` skeleton #8928).
**Scope (locked):** wrap existing `rocKE/` under a `platform/` parent (untouched
internally), and extract only the SDPA/MHA vertical into a new `library/`.
Everything non-attention stays in platform. C++ engine and byte-identity parity
stay where they are (dormant until JIT: status, not a move).
Paths under `dnn-providers/hip-kernel-provider/` (**BASE**), fixed location for now.
> **Update (AICK-1737):** we decided to release rocKE as kernel bundles under
> `hip-kernel-provider`, so the `library/api/` C++ client has been **removed**.
> This doc drops the `api/` layer; the rest of the carve is unaffected.
---
## 1. Top-level final tree
```
BASE/
├── CMakeLists.txt # add_subdirectory(rocke) (was rocke-client + rocKE)
└── rocke/ # project parent
├── CMakeLists.txt # add_subdirectory(platform); library python via rocke-pyenv/rocke-wheels
├── BUILDING.md # build/dev guide (editable installs, PYTHONPATH, rocke.assets)
├── platform/ # former rocKE/, reparented verbatim (only attention-unwiring edits)
│ ├── CMakeLists.txt # former rocKE/CMakeLists.txt
│ ├── pyproject.toml requirements.txt
│ ├── AGENTS.md BUILD.md README.md
│ ├── Cpp/ # C++ engine + bindings (dormant until JIT; unchanged)
│ ├── Python/
│ │ └── rocke/ # the SDK package (import name `rocke`, installable)
│ │ ├── __init__.py # EDIT: drop attention re-exports only
│ │ ├── __main__.py
│ │ ├── core/ # ir, lower_llvm/hip/cktile, passes, ir_serialize, verify, arch, isa, backend
│ │ ├── helpers/ # all helpers stay (generic toolkit, incl. attention-infra primitives)
│ │ ├── runtime/ # comgr, hip_module, launcher
│ │ ├── analysis/ benchmark/
│ │ ├── instances/ # all kernels EXCEPT attention (EDIT __init__s: drop attention)
│ │ ├── dispatch/ # all families EXCEPT attention (EDIT __init__s: drop attention)
│ │ ├── heuristics/ # stays (1 lazy attention import repointed to library)
│ │ ├── examples/ # all examples EXCEPT gfx*/attention
│ │ └── sweep.py sweep_bench.py run_manifest.py torch_backend.py
│ ├── tests/ # C++ tests + platform pytest (minus attention python tests)
│ ├── tools/ cmake/ dsl_docs/
└── library/ # the SDPA/MHA product: build-time-only Python (relies on platform `rocke.*`)
├── pyproject.toml # build-time metadata (library python is NOT installed into the product)
├── kernels/ # was platform instances attention (the SDPA kernel defs)
├── builders/ # was platform examples/gfx*/attention (build-time drivers)
├── dispatch/ # was dispatch/families/attention (1-of-N SDPA select)
├── tests/ # the python attention tests
└── benchmarks/ # per-arch attention benchmark drivers + shape data
# removed: BASE/rocKE/ and BASE/rocke-client/ (their content now under rocke/)
# removed (AICK-1737): BASE/rocke/library/api/ and BASE/rocke/library/CMakeLists.txt
```
## 2. platform: what it is
The entire former `rocKE/`, reparented as `rocke/platform/`, internally unchanged
except the attention-unwiring edits (§4). It remains:
- the installable **SDK** (`rocke` package at `platform/Python/rocke`, via
`platform/pyproject.toml`), usable standalone by others to build kernels;
- the home of `core`, all `helpers` (the generic toolkit, including
attention-infra primitives `mfma_attention`, `mfma_attention_bwd`, `qk_scale`,
`attention`, `rotary`; reusable building blocks), `runtime`, `analysis`,
`benchmark`, and all non-attention `instances`/`dispatch`/`examples`,
`heuristics`, the C++ engine (`Cpp/`), tools, docs, tests.
## 3. library: the SDPA/MHA carve (relies on platform helpers)
Build-time Python (NOT installed into the product). Self-contained SDPA kernels
that import the platform SDK as `rocke.*`.
| `library/` dir | Source (from platform) | Contents |
|---|---|---|
| `kernels/` | `instances/common/` attention + arch attention | `attention_unified`, `attention_arch`, `_fmha_common`, `_fmha_warp_body`, `fmha_{appendkv,arch,bwd,fwd_fp8,head_grouping,mfma,paged_prefill,splitkv_decode,varlen}`, `sage_attention`, `sparse_attention`; `gfx1151/wmma_fmha_fwd`; `gfx1250/{_wmma_attention_common,attention_tiled_2d,attention_tiled_3d,wmma_attention_fwd}`; `gfx942/{attention_tiled_2d,attention_tiled_3d}`; `gfx950/{attention_tiled_2d,attention_tiled_2d_fastkv_regp,attention_tiled_3d}`; plus the inline arch-router builders `build_unified_attention_2d_tiled` / `build_unified_attention_3d_tiled` lifted out of `instances/__init__.py` |
| `builders/` | `examples/gfx{942,950,1151,1250}/attention/`, `examples/common/fmha_fwd_verify_hip.py`, plus the attention halves split out of mixed `examples/common` drivers (`parity_fmha_extended` from `parity_extended_kernels`, `hip_lowering_attention_parity` from `hip_lowering_parity`), the `dsl_probe`/`gen_sweep`/`stage1_benchmark` attention slices (`dsl_probe_attention_demos`, `gen_sdpa_sweep_data`, `benchmark_rocke_unified_attention`), and `gfx950/qwen3_30b_a3b/` decode drivers | the SDPA verify/parity/bench drivers (build-time) |
| `dispatch/` | `dispatch/families/attention.py` | `ATTENTION_REGISTRY`, `AttentionRequest`, `dispatch_attention`: the 1-of-N SDPA select |
| `tests/` | `tests/instances/test_gfx1250_attention.py` (+ any other python attention tests) | python attention tests (C++ `tiled_attention_2d_reentrancy.cpp` stays in platform; it tests the C++ engine) |
**Naming:** `kernels` (was *instances*) and `builders` (was *examples*) are
product nouns; platform keeps its DSL terms `instances`/`examples`.
## 4. The only platform edits (attention-unwiring)
Removing attention from the `instances` package requires editing its re-export
sites (all mechanical "drop/relocate attention"):
- `instances/__init__.py`: strip the attention re-export block (`UnifiedAttention*`, `build_unified_attention_*`) and **move** the inline `build_unified_attention_2d_tiled`/`_3d_tiled` arch-routers to `library/kernels/`.
- `instances/gfx942/__init__.py`, `instances/gfx950/__init__.py`, `instances/gfx1250/__init__.py`: drop attention re-exports.
- `dispatch/__init__.py`, `dispatch/families/__init__.py`: drop `dispatch_attention` / `ATTENTION_REGISTRY`.
- `heuristics/gen_sweep_data.py`: drop the attention sweep-generation path (moved to `library/builders/common/gen_sdpa_sweep_data.py`); the platform copy only *names* that tool in its help text, so it holds no `import` of the library and platform stays fully standalone.
- `examples/run_all.py` REGISTRY + `examples/_goldens/fmha_fwd_hip_mha.json`: remove the `fmha_fwd_hip_mha` (`family="attention"`) entry; its driver `examples/common/fmha_fwd_verify_hip.py` moves to `library/builders/`. Audit `_goldens/` for any other attention entries.
- `rocke/__init__.py`: drop any attention re-export it carries.
- `helpers/__init__.py`: untouched (all helpers stay).
Non-attention platform code is otherwise unchanged.
## 5. Imports
- Platform package name `rocke` is preserved, so non-attention code needs no
import changes.
- **Library** python is build-time; its source root is **`rocke/library/`**
(NOT `rocke/`, which would put `platform/` on `sys.path` and shadow the stdlib
`platform` module). So `kernels`, `builders`, `dispatch` are top-level packages
under that root (not a `library.*` package). Caveat: these are generic
top-level names, acceptable for a build-time-only, controlled-PYTHONPATH
context; wrap them in one named package later if needed.
- Modules import the SDK as `rocke.*` (e.g. `from rocke.helpers.mfma_attention
import ...`, `from rocke.core.ir import ...`, `from rocke.dispatch.core import ...`).
- **Codemod for the moved files:** relative imports that pointed at platform
(`from ..core`, `from ...helpers`, dispatch's `from ..core` to `rocke.dispatch.core`,
etc.) become absolute `from rocke.<...>`; refs to the moved kernels become `from
kernels.<...>` (e.g. `dispatch/attention` becomes `from kernels.common.attention_unified`);
relative imports within a moved subpackage stay relative.
- **`rocke.examples.*.attention*` and `rocke.examples.common.fmha_fwd_verify_hip`
become `builders.<...>`** (statements, string literals, `_goldens` JSON `module`,
REGISTRY rows, `-m` docs), full-occurrence discipline, scoped to attention only.
- Build-time PYTHONPATH (conftest + a `cmake -E env` helper): `platform/Python`
(for `rocke`) + `rocke/library/` (for `kernels`/`builders`/`dispatch`).
- **Editable-install migration:** per-script `sys.path`/`parents[N]`/`Path(__file__)`
hacks are replaced by editable installs plus a `rocke.assets` accessor module
(`platform_root`/`dsl_docs_dir`/`shape_utils_dir`, env overrides
`ROCKE_PLATFORM_ROOT`/`ROCKE_DSL_DOCS`); the only residual path handling lives
in the test `conftest.py` bootstraps and `assets.py` itself.
- One-way rule: `library` imports `platform` only; platform never imports
`library` (verified: zero `kernels`/`builders`/`dispatch` imports anywhere
under `platform/`, static and at runtime).
## 6. CMake
- `BASE/CMakeLists.txt`: `add_subdirectory(rocke)` replaces the `rocke-client` +
`rocKE` adds; keep the `ROCKE_INSTALL_*` staging vars set before it and
`add_subdirectory(src)` after (CTest GLOBAL-staging order preserved).
- `rocke/CMakeLists.txt`: `add_subdirectory(platform)`. The library python
(`kernels`/`builders`/`dispatch`) is not a CMake subdirectory; it is
editable-installed and wheeled by the `rocke-pyenv` / `rocke-wheels` blocks in
this file, which reference `library/pyproject.toml` by path.
- `rocke/platform/CMakeLists.txt` = former `rocKE/CMakeLists.txt`, unchanged
(still installs the `rocke` SDK package, now without attention, builds C++
tests, stages CTest).
- ~~`rocke/library/CMakeLists.txt` + `api/CMakeLists.txt`~~: removed (AICK-1737)
along with the `library/api/` client. Library is now Python-only.
## 7. Tests
- **platform/tests/**: C++ tests (incl. `tiled_attention_2d_reentrancy.cpp`),
non-attention python tests; re-rooted `conftest.py` (platform root).
- **library/tests/**: the python attention tests (`test_gfx1250_attention.py`
+ any others importing the moved kernels/builders) with a conftest inserting
`platform/Python` + `rocke/`.
## 8. Verification
- **Platform standalone:** clean venv, `pip install rocke/platform`, then
`python -c "import rocke, rocke.core, rocke.helpers, rocke.instances, rocke.dispatch; from rocke import lower_kernel_to_llvm"` succeeds without library present. (Proves attention removal is clean and platform stays self-contained.)
- **Platform has no attention *kernels*:** `instances`/`dispatch` carry no
attention modules and `dispatch.dispatch_attention` is no longer importable,
but platform retains the attention-infra *helpers* (`helpers/attention`,
`mfma_attention`, `qk_scale`, ...) and `instances/gfx1250/qwen3_kv_cache` by design.
- **Library on platform:** with both roots on the path (`platform/Python` +
`rocke/library/`),
`python -c "import kernels.common.attention_unified, dispatch, builders.gfx1250.attention..."` and `dispatch.attention.dispatch_attention` resolve.
- **Functional wiring (not just imports):** after the move, actually *run* the
SDPA path end-to-end: invoke `dispatch.attention.dispatch_attention` to select
and build an attention kernel, and run one `builders` driver, to prove the
moved kernels+dispatch+builders are wired and produce output, not merely import.
- **Zero-leftover:** `search 'rocke\.examples.*attention'` and stale
`rocke.instances.common.attention*` references resolve to none.
- **pytest parity:** identical pass/skip/fail for the moved attention tests
(now under library) and the remaining platform tests, pre vs post.
- **CMake both modes** (provider opt-in + default OFF) configure/build/install;
installed CTest lists the platform engine tests staged into the provider bucket.
- **Move integrity:** `git diff -M` shows renames; `pre-commit` clean.
## 9. Notes / follow-ups (out of scope here)
- **AOT** pre-built kernel list (Python builders to platform lowering to
artifacts) is a follow-up, now tracked under AICK-1704 (migration into
`hip-kernel-provider`, off POC / PR #9533).
- Optional later: rename `platform/Python` to `platform/python`, `Cpp` to `cpp`.
```