|
Download README.md from flashrt/flashrt-adaptive-norms: direct link, hf CLI and curl.
- Browser
- Download file 2.71 kB
-
https://huggingface.co/flashrt/flashrt-adaptive-norms/resolve/main/README.md
- Command line
-
hf download hf://flashrt/flashrt-adaptive-norms/README.md
-
curl -L -o README.md https://huggingface.co/flashrt/flashrt-adaptive-norms/resolve/main/README.md
2.71 kB
| # flashrt-adaptive-norms | |
| Tensor-facing FlashRT adaptive normalization kernels for Hugging Face `kernels`. | |
| This package targets DiT, VLA, video, and world-model blocks that combine | |
| RMSNorm with per-row style scale/shift/gate parameters: | |
| ```text | |
| AdaRMSNorm: x -> RMSNorm(x, weight) -> norm * (1 + style_scale) + style_shift | |
| Fused gate path: residual += x * gate -> AdaRMSNorm(residual) -> static FP8 | |
| ``` | |
| ## Exported APIs | |
| - `ada_rms_norm_style_bf16(x, weight, style, eps=1e-6, out=None, gate_out=None)` | |
| - `gate_residual_ada_norm_fp8_static_bf16(residual, x, gate, weight, style, scale, eps=1e-6, out=None, gate_out=None)` | |
| ## Tensor Conventions | |
| - `x`, `residual`, `gate`: contiguous BF16 matrices, shape `(rows, dim)` | |
| - `weight`: contiguous BF16 vector, shape `(dim,)` | |
| - `style`: contiguous BF16 matrix, shape `(rows, 3 * dim)` or `(1, 3 * dim)` | |
| for a style row broadcast across all rows | |
| - first `dim`: style scale | |
| - second `dim`: style shift | |
| - third `dim`: gate output | |
| - `scale`: CUDA FP32 scalar tensor for static FP8 quantization | |
| - FP8 output dtype: `torch.float8_e4m3fn` | |
| - `dim` must be even. | |
| ## Minimal Usage | |
| ```python | |
| from kernels import get_kernel | |
| import torch | |
| ops = get_kernel( | |
| "flashrt/flashrt-adaptive-norms", | |
| version=1, | |
| trust_remote_code=True, | |
| ) | |
| rows, dim = 2520, 3072 | |
| x = torch.randn((rows, dim), device="cuda", dtype=torch.bfloat16) | |
| residual = torch.randn_like(x) | |
| gate = torch.randn_like(x) | |
| weight = torch.ones((dim,), device="cuda", dtype=torch.bfloat16) | |
| style = torch.randn((rows, 3 * dim), device="cuda", dtype=torch.bfloat16) | |
| scale = torch.tensor([0.04], device="cuda", dtype=torch.float32) | |
| out_bf16, gate_out = ops.ada_rms_norm_style_bf16(x, weight, style) | |
| residual, out_fp8, gate_out = ops.gate_residual_ada_norm_fp8_static_bf16( | |
| residual, | |
| x, | |
| gate, | |
| weight, | |
| style, | |
| scale, | |
| ) | |
| ``` | |
| For prompt/style values shared by every token, pass a single row directly; | |
| the kernel broadcasts it without materializing a `rows x 3*dim` tensor: | |
| ```python | |
| shared_style = torch.randn((1, 3 * dim), device="cuda", dtype=torch.bfloat16) | |
| out_bf16, gate_out = ops.ada_rms_norm_style_bf16( | |
| x, weight, shared_style | |
| ) | |
| ``` | |
| ## Validation | |
| ```bash | |
| python flashrt-adaptive-norms/tests/test_adaptive_norms.py --backend source --mode full | |
| python flashrt-adaptive-norms/benchmarks/benchmark.py --backend source --shapes all | |
| ``` | |
| RTX 5090 and Thor SM110 source-extension validation passes the full source | |
| grid for both per-row and single-row broadcast style. | |
| Residual and gate outputs are bit-level exact. FP8 output uses a boundary-aware | |
| gate because PyTorch and CUDA FP8 casters can choose adjacent FP8 values for | |
| rare tie cases; p99_abs is zero across the source grid. | |