Skip to content

[Cake] rmsnorm: vendor FlashInfer's dw-accuracy fixes and flashinfer-ai/flashinfer#8848 - #15

Open
yyihuang wants to merge 1 commit into
radixark:mainfrom
yyihuang:rmsnorm-dw-accuracy
Open

yyihuang wants to merge 1 commit into
radixark:mainfrom
yyihuang:rmsnorm-dw-accuracy

Conversation

@yyihuang

@yyihuang yyihuang commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Summary

On main, fast's FP32 weight gradient on B200 goes over FlashInfer's per-element dw budget at large token counts. The budget requires every element to be within atol 1e-4 + rtol 1e-4 of an FP64 sum; we measured single elements at 1.295 to 1.364 times that budget at H 4096 T 393216 and 524288 and at H 5120 T 524288. This PR re-vendors both Cake RMSNorm packages from flashinfer-ai/flashinfer@c51a7540, whose backward routes bring the worst element at those points down to 0.075–0.086 of the budget, and adds flashinfer-ai/flashinfer#8848's blocked-FP32 B200 backward for large T up to 131072. The cost is fast backward time in some windows (main/PR by CUPTI kernel time as low as 0.72 on R200, 0.83 on B200 and 0.92 on GB300), while det at the smallest token counts gets faster on GB300 and R200.

Changes

Both packages, cake_rmsnorm_det_train_backend (det) and cake_rmsnorm_train_backend (fast), now come from flashinfer-ai/flashinfer@c51a7540f042d7607f23bc29417147ca7a921828 (main, the merge of flashinfer-ai/flashinfer#8848); before this PR they were at eb3eb68d. The table lists the FlashInfer pull requests in that range that touch the packages, limited to the FP32-weight [T, H] routes the op uses:

FlashInfer PR Arch Change
flashinfer-ai/flashinfer#8810 sm_103a fast backward at H 2048 runs det's program from T 58497 to 61952. FlashInfer measured the pair that ran there before above the dw budget at T 58560.
flashinfer-ai/flashinfer#8827 sm_100a, sm_107a fast backward runs one kernel in windows where FlashInfer measured the previous pair with a larger dw error than the eager FP32 reduction: H 2048 T 337–4096 (sm_100a) and T 1025–16384 (sm_107a); H 4096 T 1793–3584 (sm_100a); H 5120 T 65–6144 (sm_100a) and T 4097–19968 (sm_107a). On sm_100a, H 5120 runs one kernel above T 56256, where FlashInfer measured the replaced programs above the budget, and H 2048 runs one kernel from T 45057 to 58880. Above T 65536, H 2048 (sm_100a) and H 4096 (sm_100a, sm_107a) run compensated (TwoSum) programs; on sm_100a, flashinfer-ai/flashinfer#8848 replaces them up to T 131072. On sm_107a, H 2048 T 65–127 and H 4096 T 65–256 run a different single kernel. Other widths get such routes too.
flashinfer-ai/flashinfer#8813 sm_103a, sm_107a det backward at the smallest token counts (at H 2048: T 3–171 on sm_103a, up to 256 on sm_107a) runs a new column-task kernel. It sums dw columns with FP32 compensated arithmetic in a fixed row order. On sm_103a it replaces the FP64 fold of the previous column-task kernel. On sm_107a it replaces a main kernel and its reduce, so det's dw there no longer depends on the SM count. det's bits change at those token counts and stay reproducible run to run. On sm_107a, det's H 256 backward at T ≤ 70656 also moves to the TwoSum main kernel and dw reduce it ran above T 70656 (the form sm_100a runs), so its H 256 bits change there too. On sm_107a the H 5120 forward above 49152 rows also uses a new grid.
flashinfer-ai/flashinfer#8464 – Docstring formatting.
flashinfer-ai/flashinfer#8849 sm_103a fast backward of H 4096 above T 262144 and of H 5120 above T 196608 runs one kernel with TwoSum per-thread dw sums. It replaces the kernel FlashInfer measured above the budget there (1.038 times the budget at H 4096 T 393216, 1.004 times at H 5120 T 262144).
flashinfer-ai/flashinfer#8848 sm_100a fast backward runs one kernel with blocked FP32 dw sums up to T 131072: from T 65537 at H 2048, 4096 and 6144, from T 56257 at H 5120, and from T 75777 at H 1536. Above T 131072 the TwoSum programs from flashinfer-ai/flashinfer#8827 still run. FlashInfer measured the new backward at 1.029–1.266 times the speed of those programs on B200, with no measured dw element above the budget. At H 5120 it runs the kernels that sm_107a runs above T 49152. Their sources gain an SM100a-only branch, and their sm_107a SASS does not change.
  • perf(cake_rmsnorm_det): compensate every step in the large-token backward on SM100, SM103 and SM107 flashinfer-ai/flashinfer#8835, an open upstream PR on the deterministic package, is not included (see Known limitation).
  • perf(cake_rmsnorm): blocked FP32 dw sums for the large-T GB300 backward windows flashinfer-ai/flashinfer#8899 merged into FlashInfer main after c51a7540 and is not included. It changes only the GB300 (sm_103a) fast backward speed at H 1536, 2048 and 6144 up to T 131072; it can follow in a separate update.
  • The packages' entry points do not change, so neither the op code nor the miles call form changes. Apart from the vendored trees, only the op docstring and 4 test files change (3 test modules and a helper module). The docstring now names det's column-task backward at the smallest token counts on every architecture.
  • Files: cake_rmsnorm_det_train_backend goes from 582 to 634, cake_rmsnorm_train_backend from 581 to 653. Prebuilding all seven widths now builds 146 libraries on sm_100a (was 142), 160 on sm_103a (was 154) and 138 on sm_107a (was 133).
  • The programs above the 232448 B shared-memory opt-in are unchanged. They are det's backward reduce at H 4096 on sm_107a and its copy in fast (271360 B, CUDA 13.4's oversized mode), so the op's CUDA-runtime check still covers the same programs.

Vendoring command:

python tools/vendor_cake.py fi --checkout ../flashinfer --commit c51a7540f042d7607f23bc29417147ca7a921828 \
    --op rmsnorm --package flashinfer/cake_rmsnorm_det_train_backend \
    --package flashinfer/cake_rmsnorm_train_backend

Accuracy

worst = max over inputs and elements of |dw − ref| / (1e-4 + 1e-4·|ref|). The reference is FP64 at the forward's rstd, and the budget is 1.0. All rows use the FP32 weight.

B200 (sm_100a). 32 inputs per point, T up to 524288. Measured on the previous revision of this branch, which runs this PR's programs at these points.

fast point main worst PR worst relL2 main → PR
H 4096, T 393216 1.300 (1 of 32 inputs over) 0.082 8.04e-08 → 2.67e-08
H 4096, T 524288 1.364 (2 of 32 over) 0.075 8.11e-08 → 2.65e-08
H 5120, T 524288 1.295 (3 of 32 over) 0.086 8.00e-08 → 2.67e-08
H 2048, T 58880 0.505 0.707 1.02e-07 → 8.10e-08
  • dw relL2 falls at every point where fast's program changes. Inside the fix(cake_rmsnorm): sm_100a and sm_107a dw-accuracy backward routes flashinfer-ai/flashinfer#8827 window H 2048 T 45057–58880, the worst element rises at some points even though relL2 falls. The 0.707 at T 58880 is the highest PR fast worst in this measurement.
  • In the measured perf(cake_rmsnorm): blocked FP32 dw sums for the large-T B200 backward windows flashinfer-ai/flashinfer#8848 windows (H 2048/4096 T 65537–131072, H 5120 T 56257–131072), this PR runs programs that the measured revision did not run. For those windows we used the accuracy check from the B200 timing run at this PR's head (one input per point, first process only). It gives fast relL2 5.86e-08–6.15e-08 (main 7.61e-08–8.57e-08) and worst ≤ 0.312 (main ≤ 0.399). As in the #8827 window, the worst element rises at some of these points while relL2 falls (for example H 4096 T 131072: 0.269 → 0.312). The #8848 windows at H 1536 and H 6144 were not measured.
  • det does not change on sm_100a; see Known limitation.

GB300 (sm_103a). Measured on the previous revision of this branch; the programs are identical for this architecture. On our GB300 no main case went over the budget, including the points where FlashInfer measured main's kernel above it:

fast point main worst PR worst
H 4096, T 393216 0.599 0.062
H 5120, T 262144 0.437 0.072

R200 (sm_107a). Max over 2 seeds. Measured on the previous revision of this branch; the programs are identical for this architecture. No case on main or on this PR went over the budget.

Point main worst PR worst relL2 main → PR
fast H 2048, T 1025 0.039 0.001 7.49e-08 → 2.55e-08
fast H 4096, T 131072 0.567 0.001 7.91e-08 → 2.53e-08
fast H 5120, T 19968 0.286 0.201 1.09e-07 → 7.90e-08
det H 2048, T 128 0.016 0.001 6.57e-08 → 2.47e-08

Performance

All tables show backward time. main/PR > 1 means this PR is faster. The "FI PR" column gives the flashinfer-ai/flashinfer pull request that changed the route.

B200 (sm_100a, 148 SMs), fast backward

CUPTI kernel time (sum of the op's kernels and memsets, median of per-process medians), FP32 weight, L2 flushed before every timed op, main and PR builds interleaved across processes. Rows marked † were measured on this PR's head. The other rows were measured on the previous revision of this branch, whose sm_100a programs are the same as this PR's outside the 8848 windows.

H T FI PR main (µs) PR (µs) main/PR
2048 337 8827 8.9 7.6 1.170
2048 1025 8827 11.0 13.2 0.831
2048 58880 8827 127.8 122.6 1.043
2048 98304 † 8848 199.4 192.6 1.035
2048 131073 † 8827 (TwoSum) 263.7 270.3 0.976
4096 3584 8827 27.5 26.3 1.046
4096 131072 † 8848 513.9 497.7 1.033
4096 131073 † 8827 (TwoSum) 515.3 518.7 0.994
5120 65 8827 8.2 5.9 1.390
5120 1792 8827 21.9 26.2 0.837
5120 6144 8827 44.2 48.8 0.905
5120 56257 † 8848 273.4 285.4 0.958
5120 131072 † 8848 685.7 628.6 1.091
5120 262144 8827 (TwoSum) 1439.5 1630.5 0.883

GB300 (sm_103a, 152 SMs)

CUPTI kernel time (sum of the op's kernels and memsets, median of per-process medians), FP32 weight, L2 flushed before every timed op, main and PR builds interleaved across processes. Measured on the previous revision of this branch; the programs are identical for this architecture.

H T Variant FI PR main (µs) PR (µs) main/PR
2048 171 det 8813 8.4 6.7 1.254
4096 152 det 8813 8.7 7.3 1.188
5120 25 det 8813 7.2 5.8 1.237
2048 58560 fast 8810 124.6 124.4 1.002
2048 61952 fast 8810 130.2 130.3 1.000
4096 262145 fast 8849 985.4 989.4 0.996
5120 196609 fast 8849 976.7 1065.8 0.916

R200 (sm_107a, 212 SMs)

CUPTI kernel time (sum of the op's kernels and memsets, median of per-process medians), FP32 weight, L2 flushed before every timed op, main and PR builds interleaved across processes. Measured on the previous revision of this branch; the programs are identical for this architecture. One run of 6 processes per build; an earlier 4-process run of the same builds measured H 2048 T 1025 at 0.715. In the same run, det's backward at H 2048 T 1025–16384, whose SASS is identical in both builds, measured 1.043–1.150, so R200 differences within about 15 % at small T are not attributable to the code.

H T Variant FI PR main (µs) PR (µs) main/PR
2048 127 fast 8827 11.5 7.8 1.481
2048 1025 fast 8827 10.7 14.8 0.721
2048 4096 fast 8827 16.4 21.1 0.778
2048 16384 fast 8827 34.8 36.3 0.961
4096 256 fast 8827 16.4 9.6 1.705
4096 131072 fast 8827 (TwoSum) 353.9 381.3 0.928
5120 4097 fast 8827 27.7 31.3 0.883
5120 12288 fast 8827 57.9 70.6 0.820
5120 19968 fast 8827 87.7 103.7 0.846
2048 127 det 8813 7.3 5.4 1.358
4096 256 det 8813 9.0 6.7 1.331

Trade-off

  • Slower: the fast backward in windows where FlashInfer moved to more accurate programs:
    • R200: H 2048 T 1025–16384 (0.721–0.961), H 4096 above T 65536 (0.925–0.928) and H 5120 T 4097–19968 (0.820–0.883).
    • B200: H 2048 at the measured T 1024 and 1025 (0.831–0.863; T 337 and 3072, on the same programs, measured faster), H 5120 at T 1792, 1793 and 6144 (0.837–0.905; T 257 measured faster), and above T 131072, where the TwoSum programs run (0.877–0.994).
    • GB300: H 5120 above T 196608 (0.916 at T 196609 by CUPTI kernel time; 0.855 by CUDA events).
  • Faster:
    • B200: the other 8827 single-kernel rows (1.028–1.390) and the measured 8848 windows at H 2048, 4096 and 5120 (1.011–1.092). The one exception is H 5120 T 56257 at 0.958. H 1536 and H 6144 were not timed.
    • R200 fast: H 2048 T 127 (1.481) and H 4096 T 256 (1.705).
    • det's column-task backward at the smallest token counts: GB300 (1.188–1.254) and R200 (1.241–1.358 at H 2048 T 127 and 256 and H 4096 T 256).
  • Same programs:
    • B200: det and the forward run the same programs. Their measured ratios are 0.988–1.062; the 1.062 is det at H 5120 T 65, 5.7 vs 5.4 µs.
    • GB300: the forward measured 0.999–1.023.
    • R200: the forward runs the same programs except H 5120 above 49152 rows, which uses the new grid (1.013–1.026). The same-program forward rows at T ≤ 2048 are 4–7 µs kernels and measured 0.975–1.132.
  • Unchanged speed: GB300 fast at the 8810 rows and at H 4096 T 262145 measured 0.996–1.002.

Tests

Test changes:

  • test_fixed_windows.py (no GPU): checks the routes above in the packages' registry. This covers the cuts, the single-kernel windows, and det's column-task backward at the smallest token counts on every architecture and every width except 256. This is the test that fails on a build without these routes: 35 passed on this PR, while on main 23 failed and 12 passed.
  • test_dw_accuracy_gpu.py (GPU, 63 cases): FlashInfer's gates at the token counts these changes moved. 31 points, each run as an FP32-weight and a BF16-weight case with two inputs (62 cases), plus one aggregate test.
    • Points at H 2048 on every architecture, for det and fast: T 128, 337, 1025, 4096, 16384, 58497, 58560, 61952 and 65536, plus T 98304 for fast.
    • fast points at H 4096 and 5120 (and H 2048 above T 131072), one token count per changed window, on that window's architectures: H 2048 T 131073; H 4096 T 256, 3584, 65537, 131073, 262145; H 5120 T 1792, 6144, 19968, 56257, 131073, 196609.
    • Each case checks:
      • every dw element within atol 1e-4 + rtol 1e-4 of the FP64 sum at the forward's rstd, and dw relL2 ≤ 1e-4 (BF16 widened by its rounding);
      • rstd, y and dx within FlashInfer's tolerances;
      • where fast runs one kernel, FP32 dw relL2 at most that of the eager FP32 reduction (or 2^-23 if larger);
      • det identical bit for bit across two runs.
    • The aggregate test checks that, over the FP32-weight cases, the median ratio of dw error to the eager FP32 reduction is at most 1, for det and for each backward form of fast.
    • det cases stop at T 65536.
  • test_rmsnorm_gpu.py: the det repeatability test at the smallest token counts now also covers sm_103a's second column-task window at H 2048.
  • _windows.py: helpers that read from the packages' registry which backward programs a token count runs and in which form (one kernel, column task or pair). The two new modules and test_rmsnorm_gpu.py use it.

Runs:

  • CPU, all green with no new failures vs main:
    • full CPU suite in a torch-free venv and in the project image;
    • vendoring check in both forms, plus --upstream;
    • pre-commit, with no diff.
  • B200 (sm_100a, 148 SMs; torch 2.14.1+cu130, CUDA runtime 13.0), at this PR's head:
    • prebuild from an empty cache: 10/10 passed, 146 libraries;
    • tests/cake/rmsnorm (not multi_gpu): 206 passed, 8 skipped (accuracy cases for other architectures);
    • tests/cake/_runtime: 316 passed;
    • det digests bitwise equal across 3 processes;
    • 2-GPU sequence-parallel test passed. It ran on the previous revision, whose sm_100a det and forward programs are identical.
  • GB300 (sm_103a, 152 SMs; CUDA 13.0 runtime), on the previous revision (programs identical for this architecture):
    • rmsnorm suite (not multi_gpu, empty cache): 190 passed, 14 skipped (accuracy cases for other architectures);
    • sequence-parallel test: 1/1 on 2 GPUs;
    • _runtime: 316/316;
    • prebuild: 10/10, 160 libraries;
    • test_dw_accuracy_gpu.py: 43 passed, 14 skipped (cases for other architectures; the previous revision's 57-case file, and the 6 cases this PR adds are sm_100a-only);
    • det digests bitwise equal across 4 processes on 3 GPUs;
    • libraries common to main and this PR have identical SASS (151).
  • R200 (sm_107a, 212 SMs; CUDA 13.4.2 runtime), on the previous revision (programs identical for this architecture):
    • rmsnorm suite passed, both single-GPU and the 2-GPU sequence-parallel test with an NCCL topology file;
    • test_dw_accuracy_gpu.py: 45 passed, 12 skipped, the same result as on main (the previous revision's 57-case file; the 6 added cases are sm_100a-only).

Known limitation

On B200, the det backward from FlashInfer's deterministic package goes over the element budget in single elements at very large token counts (32 FP32 inputs per point):

  • H 2048 T 196608: 1.044 (1 of 32 inputs)
  • H 4096 T 524288: 1.222 (3 of 32)
  • H 5120 T 393216: 1.113 (2 of 32)
  • H 5120 T 524288: 1.406 (4 of 32)

main and this PR run the same det programs at these points, so this PR does not change the behaviour. test_dw_accuracy_gpu.py checks det only up to T 65536, which is where FlashInfer's deterministic suite checks the same element bound. FlashInfer also measured det above the budget at large token counts on sm_103a (flashinfer-ai/flashinfer#8849) and on sm_100a (flashinfer-ai/flashinfer#8827); our GB300 and R200 runs did not reach those token counts. The upstream draft flashinfer-ai/flashinfer#8835 targets all three architectures and is not included here.

🤖 Generated with Claude Code

Re-vendor both Cake RMSNorm packages from flashinfer-ai/flashinfer
c51a7540f042d7607f23bc29417147ca7a921828 (main, the merge of #8848). Since the previous commit, eb3eb68d, these
changes touched them:

- flashinfer-ai/flashinfer#8810: on SM103a the non-deterministic backward of H = 2048 ([T, H] rows, BF16 and FP32
  weight) runs the deterministic package's program from T 58497 to 61952. FlashInfer measured the pair it ran there
  before above the weight-gradient budget (every element within atol 1e-4 + rtol 1e-4 of an FP64 sum) at T 58560.
- flashinfer-ai/flashinfer#8827: new non-deterministic backward routes on SM100a and SM107a. With the FP32 weight the
  op passes, the backward runs one kernel where FlashInfer measured the pair it ran before with a larger
  weight-gradient error than the eager FP32 reduction of the same inputs: at H = 2048 on SM100a from T 337 to 4096
  and on SM107a from T 1025 to 16384, at H = 4096 on SM100a from T 1793 to 3584, at H = 5120 on SM100a from T 65 to
  6144 and on SM107a from T 4097 to 19968. On SM100a, H = 5120 runs one kernel above T 56256, where FlashInfer
  measured the programs it replaces above the budget, and H = 2048 one kernel from T 45057 to 58880; above T 65536,
  H = 2048 (SM100a) and H = 4096 (SM100a and SM107a) run compensated programs. On SM107a, H = 2048 from T 65 to 127
  and H = 4096 from T 65 to 256 run another single kernel than before. Other widths get such routes too.
- flashinfer-ai/flashinfer#8813: the deterministic backward of the smallest token counts on SM103a and SM107a (at
  H = 2048: T 3 to 171 on SM103a, up to 256 on SM107a) runs a new column-task kernel whose weight-gradient column
  sums use FP32 compensated arithmetic in a fixed row order. On SM103a it replaces the FP64 fold of the previous
  column-task kernel; on SM107a it replaces a main kernel and its reduce, so det's dw there no longer depends on the
  SM count. det's bits change at those token counts and stay reproducible run to run. On SM107a the deterministic
  backward of H = 256 also runs, from T 1 to 70656, the TwoSum main kernel and dw reduce it ran above T 70656 (the
  form SM100a runs), so det's H = 256 bits on SM107a change there too. On SM107a the FP32-weight forward of
  H = 5120 above 49152 rows also takes a new grid.
- flashinfer-ai/flashinfer#8464: docstring formatting.
- flashinfer-ai/flashinfer#8849: on SM103a the non-deterministic FP32-weight backward of H = 4096 above T 262144 and
  of H = 5120 above T 196608 runs a single kernel with TwoSum per-thread weight-gradient sums, in place of the kernel
  FlashInfer measured above the budget there (1.038 times it at T 393216 for H = 4096, 1.004 times at T 262144 for
  H = 5120). The BF16-weight routes, which the op does not use, switch at T 262144 and 393216.
- flashinfer-ai/flashinfer#8848: on SM100a the non-deterministic backward runs a single kernel with blocked FP32
  weight-gradient sums up to T 131072, from T 65537 at H = 2048, 4096 and 6144 (also with the residual), from
  T 56257 at H = 5120 and, at H = 1536, from T 75777 (FP32 weight) or 78785 (BF16 weight). Above T 131072 the TwoSum
  programs #8827 put in these windows still run. FlashInfer measured the new backward 1.029 to 1.266 times as fast
  as those programs on B200, with no measured dw element above the budget. At H = 5120 it runs the kernels SM107a
  runs above T 49152, whose sources gain a branch for SM100a only; their SM107a SASS does not change.

FlashInfer's open pull request #8835 on the deterministic package is not included, nor #8899, which merged into main
after c51a7540 and changes only SM103a's non-deterministic backward at H = 1536, 2048 and 6144 up to T 131072
(speed). The packages' entry points do not change, so the op code does not. cake_rmsnorm_det_train_backend goes from
582 to 634 files, cake_rmsnorm_train_backend from 581 to 653. Prebuilding all seven widths builds 146 libraries on
SM100a (was 142), 160 on SM103a (was 154) and 138 on SM107a (was 133). The programs above the 232448 B shared-memory
opt-in are unchanged: only det's backward reduce at 4096 on SM107a and its copy in the non-deterministic package
(271360 B, CUDA 13.4's oversized mode), so the op's CUDA-runtime check covers the same programs; every binding above
the opt-in sets that mode.

The op's docstring names the column-task backward of det's smallest token counts on every architecture.

Tests:

- test_dw_accuracy_gpu.py (GPU): FlashInfer's gates at the token counts these changes moved. At H = 2048, on every
  architecture, T 128, 337, 1025, 4096, 16384, 58497, 58560, 61952 and 65536 with det and fast (fast also 98304);
  fast at one token count per window #8827, #8848 and #8849 changed, on that window's architectures, at H = 2048 (T
  131073), H = 4096 (T 256, 3584, 65537, 131073, 262145) and H = 5120 (T 1792, 6144, 19968, 56257, 131073, 196609).
  An FP32 and a BF16 weight parameter, two inputs each: rstd within relative L2 1e-5 of FP64; y and dx within
  FlashInfer's tolerance; every dw element within atol 1e-4 + rtol 1e-4 of the FP64 sum at the forward's rstd and dw
  within relative L2 1e-4 (a BF16 gradient widened by its rounding); where fast's backward runs one kernel, the FP32
  dw's relative L2 error at most the eager FP32 reduction's (or 2^-23 if larger); det bit for bit twice; over the
  FP32-parameter cases, the median ratio of the dw error to the eager FP32 reduction's at most 1, over det and over
  each backward form of fast. det stops at T 65536, where FlashInfer's deterministic suite checks the same element
  bound. These checks hold the installed build to the budget; test_fixed_windows.py is what fails on a build without
  these routes.
- test_fixed_windows.py (no GPU): the windows above in the packages' registry: on SM103a fast runs det's programs
  from T 58497 to 61952 (H = 2048); fast runs one kernel in the #8827 windows; above a cut another single kernel
  than at the cut, the same one up to the next cut: on SM100a above T 65536 (H = 2048 and 4096) and T 131072
  (H = 2048, 4096 and 5120), on SM107a above T 65536 (H = 4096), on SM103a above T 262144 (H = 4096) and T 196608
  (H = 5120); on SM107a fast's T 65 to 127 at H = 2048 and T 65 to 256 at H = 4096 run another single kernel than
  the one they ran before; det's smallest token counts run a column-task kernel on every architecture and every
  width but 256.
- test_rmsnorm_gpu.py: det's repeatability at the smallest token counts also covers the second column-task window
  of SM103a at H = 2048.

    python tools/vendor_cake.py fi --checkout ../flashinfer --commit c51a7540f042d7607f23bc29417147ca7a921828 \
        --op rmsnorm --package flashinfer/cake_rmsnorm_det_train_backend \
        --package flashinfer/cake_rmsnorm_train_backend

Co-Authored-By: Claude <noreply@anthropic.com>
@yyihuang yyihuang changed the title rmsnorm: vendor FlashInfer's dw-accuracy fixes and flashinfer-ai/flashinfer#8848 [Cake] rmsnorm: vendor FlashInfer's dw-accuracy fixes and flashinfer-ai/flashinfer#8848 Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants