| --- |
| library_name: kernels |
| license: apache-2.0 |
| tags: |
| - cuda |
| - native-cuda |
| - flashrt |
| - moe |
| - nvfp4 |
| - blackwell |
| --- |
| |
| # grouped-moe-gemv |
|
|
| Native CUDA FlashRT grouped MoE GEMV kernels for dynamic device-side routing. |
| Version 2 covers BF16-activation/NVFP4-weight W4A16 and fully NVFP4 W4A4. |
|
|
| Hardware support is backend-specific: |
|
|
| - SM110 (Jetson AGX Thor): native FlashRT W4A16 decode/grouped GEMV, built |
| with the SM110-only `kUnroll=2` tuning from FlashRT PR #169; |
| - SM120/SM121: W4A16 plus block-scaled-MMA W4A4; |
| - W4A4 rejects SM110 explicitly instead of dispatching an incompatible |
| device image or silently falling back. |
|
|
| Available functions: |
|
|
| - `w4a16_decode_gemv_bf16` |
| - `grouped_w4a16_gemv_bf16` |
| - `quantize_activations_nvfp4_bf16` |
| - `quantize_weights_nvfp4_bf16` |
| - `grouped_w4a4_gemv_bf16` |
| - `grouped_w4a4_gemv_from_bf16` |
|
|
| W4A4 routing is token-major: packed activations `[M,K/2]`, device indices |
| `[M,top_k]`, packed expert library `[E,N,K/2]`, output `[M,top_k,N]`. |
| Use `M=routed_pairs, top_k=1` when each expert receives a distinct activation. |
| See the repository README for static-buffer and CUDA Graph usage. |
|
|
| Load version 2 with both current and legacy `kernels` clients: |
|
|
| ```python |
| from kernels import get_kernel |
| |
| try: |
| moe = get_kernel( |
| "flashrt/grouped-moe-gemv", version=2, trust_remote_code=True |
| ) |
| except TypeError: # kernels==0.12.x |
| moe = get_kernel("flashrt/grouped-moe-gemv", version=2) |
| ``` |
|
|
| Use `quantize_activations_nvfp4_bf16` once for `[M,K]`, followed by |
| `grouped_w4a4_gemv_bf16` for all `[M,top_k]` routes. The convenience function |
| `grouped_w4a4_gemv_from_bf16` performs both calls and accepts preallocated |
| `packed`, `sfa`, and `out` buffers for CUDA Graph capture. |
|
|
| On SM110, call `grouped_w4a16_gemv_bf16` with BF16 activations and the packed |
| expert library. This path is allocation-free with a caller-provided `out` |
| buffer and supports device-side `expert_idx` mutation during graph replay. |
|
|