liangsu9988's picture
Promote latest kernel artifacts to main
a1f2c72 verified
|
Raw History Blame Contribute Delete
2.51 kB
# flashrt-residual-norm-quant
Tensor-facing FlashRT residual, RMSNorm, and static FP8 quantization kernels for
Hugging Face `kernels`.
This package is runtime glue for model hot paths that need to produce the next
layer's FP8 activation without falling back to multiple PyTorch operations:
```text
BF16 residual/x -> residual add -> RMSNorm -> static-scale FP8 E4M3 activation
```
## Exported APIs
- `rms_norm_bf16(x, weight, eps=1e-6, out=None)`
- `rms_norm_quant_fp8_static_bf16(x, weight, scale, eps=1e-6, out=None)`
- `residual_add_rms_norm_quant_fp8_static_bf16(residual, x, weight, scale, eps=1e-6, out=None)`
- `residual_add_rms_norm_bf16(residual, x, weight, eps=1e-6, out=None)`
The residual API updates `residual` in place with `residual += x`, rounded to
BF16, then emits the normalized FP8 activation.
The no-quant twin preserves the same in-place BF16 residual contract and emits
BF16, for runtimes whose next consumer is not low precision.
## Tensor Conventions
- `x`: BF16 tensor, shape `(rows, dim)`
- `residual`: BF16 tensor, shape `(rows, dim)`, in-place updated
- `weight`: BF16 tensor, shape `(dim,)`
- `scale`: CUDA `float32` scalar tensor used for static FP8 quantization
- `out`: FP8 E4M3 tensor, shape `(rows, dim)`
The hidden dimension must be even because this version uses FlashRT's packed
BF16 pair path.
## Minimal Usage
```python
from kernels import get_kernel
import torch
ops = get_kernel(
"flashrt/flashrt-residual-norm-quant",
version=1,
trust_remote_code=True,
)
x = torch.randn((10, 1024), device="cuda", dtype=torch.bfloat16)
residual = torch.randn_like(x)
weight = torch.ones((1024,), device="cuda", dtype=torch.bfloat16)
scale = torch.tensor([0.04], device="cuda", dtype=torch.float32)
x_fp8 = ops.residual_add_rms_norm_quant_fp8_static_bf16(
residual,
x,
weight,
scale,
eps=1e-6,
)
```
## Validation
```bash
python flashrt-residual-norm-quant/tests/test_residual_norm_quant.py --backend source --mode full
python flashrt-residual-norm-quant/benchmarks/benchmark.py --backend source --shapes all
```
Current RTX 5090 source-extension rows pass the package's strict BF16/FP8
distribution gates across the PI0.5, VLA, video, and Cosmos3-Edge shape grid.
Built artifacts must pass the same gate before publication.
The no-quant BF16 path is also gated at the Cosmos3-Edge production hidden
size (`rows=128`, `dim=2048`) and preserves the in-place residual contract.
Its static-output CUDA Graph replay is checked bitwise.