docs: add training runtime guide and examples

Co-authored-by: wawahejun <hejunlbbc@gmail.com>
This commit is contained in:
yutianyu 2026-05-02 00:41:54 +08:00
parent ddbbc09019
commit 529e7fc7b7
5 changed files with 145 additions and 0 deletions

52
README.md Normal file
View File

@ -0,0 +1,52 @@
# Operator Runtime Training Camp
This repository is a training-oriented GPU operator runtime. It is intentionally
small, but its workflow mirrors production operator libraries:
1. Define the operator contract in `ops/<op>/operator.yaml`.
2. Generate build and runtime registries from the manifest.
3. Implement a backend-specific descriptor lifecycle.
4. Expose a Python API with out-of-place, out-variant, and prepared execution.
5. Validate correctness against PyTorch and benchmark steady-state execution.
The project is rooted directly at `/workspace`; it does not create a nested
`/workspace/camp` project directory.
## Operators
| Operator | NVIDIA C++ | TileLang | MetaX |
| --- | --- | --- | --- |
| `copy` | runnable | runnable when TileLang is installed | stub |
| `vector_add` | runnable | runnable when TileLang is installed | stub |
| `reduce_sum` | runnable, row-wise fp32 | runnable when TileLang is installed | stub |
| `softmax` | runnable, row-wise fp32 | runnable when TileLang is installed | stub |
## Build
```bash
mkdir -p build
cd build
cmake .. -DCAMP_ENABLE_NVIDIA=ON -DCAMP_ENABLE_METAX=OFF
cmake --build . -j$(nproc)
```
## Validate
```bash
python tools/validate_operator_manifest.py --ops-root ops --tests-root tests
CAMP_BUILD_DIR=build pytest tests/ -v --backend nvidia
pytest tests/ -v --backend tilelang
python tests/bench_all.py --backend nvidia --profile tests/perf_profiles/local_gpu.yaml
```
The TileLang backend requires the `tilelang` Python package.
## Production Mapping
| Training concept | Production equivalent |
| --- | --- |
| `operator.yaml` | reviewed operator spec / manifest |
| descriptor lifecycle | create, workspace, execute, destroy |
| generated registry | operation table / backend registry |
| `tests/cases/<op>.py` | correctness, layout, and API contract coverage |
| `PerformanceResult` | profiler report row with latency, bytes, flops, bandwidth |

23
examples/01_copy.py Normal file
View File

@ -0,0 +1,23 @@
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "python"))
import torch
from operator_runtime import copy
def main() -> None:
src = torch.randn((1024,), device="cuda", dtype=torch.float32)
out = copy(src, backend="nvidia")
torch.testing.assert_close(out, src)
print("copy ok")
if __name__ == "__main__":
main()

24
examples/02_vector_add.py Normal file
View File

@ -0,0 +1,24 @@
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "python"))
import torch
from operator_runtime import vector_add
def main() -> None:
a = torch.randn((1024,), device="cuda", dtype=torch.float32)
b = torch.randn_like(a)
out = vector_add(a, b, backend="nvidia")
torch.testing.assert_close(out, a + b)
print("vector_add ok")
if __name__ == "__main__":
main()

23
examples/03_reduce_sum.py Normal file
View File

@ -0,0 +1,23 @@
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "python"))
import torch
from operator_runtime import reduce_sum
def main() -> None:
src = torch.randn((32, 128), device="cuda", dtype=torch.float32)
out = reduce_sum(src, dim=1, backend="nvidia")
torch.testing.assert_close(out, torch.sum(src, dim=1), atol=1e-5, rtol=1e-5)
print("reduce_sum ok")
if __name__ == "__main__":
main()

23
examples/04_softmax.py Normal file
View File

@ -0,0 +1,23 @@
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "python"))
import torch
from operator_runtime import softmax
def main() -> None:
src = torch.randn((32, 128), device="cuda", dtype=torch.float32)
out = softmax(src, dim=1, backend="nvidia")
torch.testing.assert_close(out, torch.softmax(src, dim=1), atol=1e-5, rtol=1e-5)
print("softmax ok")
if __name__ == "__main__":
main()