Skip to content

Fix Q UE8M0 quant and require fp32 LN params in fused DSv3.2 indexer kernel - #3451

Merged
valarLip merged 7 commits into
ROCm:mainfrom
frida-andersson:dsv32-indexer-fused-kernel-fixes
Jul 28, 2026
Merged

valarLip merged 7 commits into
ROCm:mainfrom
frida-andersson:dsv32-indexer-fused-kernel-fixes

Conversation

@frida-andersson

@frida-andersson frida-andersson commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Summary

The fused indexer_qk_rope_quant_and_cache_kernel (added in #3185) diverged from the unfused vLLM path it replaces, dropping DeepSeek-V3.2 GSM8K strict-match (lm-eval, 20-shot) from 0.95 → 0.49 when fusion was enabled. Two independent kernel bugs in csrc/kernels/cache_kernels.cu:

Bug A — Q quant. The unfused reference per_token_group_quant_fp8 multiplies by 1 / fp8_max (avoids GPU fast-division noise) and applies UE8M0 rounding when scale_fmt = "ue8m0", which DSv3.2's indexer always passes. The fused kernel did neither, while the K-side of the same kernel applied UE8M0 correctly. Net: ~94% Q disagreement per call. Fix mirrors the K-side.

Bug B — norm_weight / norm_bias typed scalar_t* (= bf16 at runtime). vLLM stores LayerNorm.weight / bias as fp32 and F.layer_norm consumes them as fp32; the call site was casting fp32 → bf16 before launch, drifting K on ~3% of values per call. Fix hard-types both as float*, drops the now-redundant static_cast<float> in the kernel body, and asserts fp32 on the host. Also adds explicit dim() == 1 and contiguity guards so non-1D or strided views are caught at launch rather than silently producing wrong results.

Breaking change

norm_weight and norm_bias now must be fp32. The dtype contract tightened from "must match q.dtype" to "must be fp32"; any caller passing bf16 LN params will now get a loud AITER_CHECK failure at launch instead of silent ~3% K drift. Caller audit: vLLM DSv3.2 indexer and ROCm/ATOM attention_mla_sparse.py both store LN params as fp32 natively and are unaffected. SGLang does not call this kernel.

End-to-end result

DSv3.2, MI355X, TP=4, lm-eval GSM8K (num_fewshot=20, num_concurrent=256, full 1319-question suite):

Configuration strict-match
Fusion off, fp8 KV cache (baseline) 0.95
Fusion on, no fixes, fp8 0.49
Fusion on + this PR + companion vLLM preshuffle=True, fp8 0.95
Fusion on + this PR + companion vLLM preshuffle=True, bf16 0.9591

The fix is independent of --kv-cache-dtype (the indexer's internal cache is always fp8). Drift harness: fused vs unfused Q fp8 + Q scale and K (with preshuffle=True on both) bit-exact post-fix.

Companion vLLM PR

vllm-project/vllm#43907 — ships preshuffle=True and switches the call site to pass fp32 LN params.

@frida-andersson
frida-andersson requested a review from a team June 1, 2026 07:27
@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

🏷️ CI Guide

Runs automatically on every PR:

  • ✅ Pre-checks (submodule verification, code formatting)
  • ✅ Aiter op tests (gfx942 + gfx950)
  • ✅ Triton tests on MI35X (only when aiter/ops/triton/** or related paths are changed)

Extended tests (opt-in via labels):

Label Tests
ci:triton-300x Run an additional Triton test job on MI300X in PRs; main branch always runs both MI35X and MI300X
ci:sglang SGLang integration tests: DeepSeek-R1-MXFP4 accuracy, Qwen 3.5 accuracy
ci:atom ATOM benchmark: DeepSeek-R1-0528, GPT-OSS-120B
ci:atom_full ATOM accuracy suite for PR and main models from ATOM models_accuracy.json
ci:vllm vLLM benchmark: GPT-OSS-120B, DeepSeek-R1-0528, Kimi-K2.5
ci:all All standard extended tests (excludes ci:atom_full)

Only add ci:atom_full for FlyDSL or Triton upgrades.
Add labels via the sidebar or gh pr edit 3451 --add-label <label>

@frida-andersson
frida-andersson force-pushed the dsv32-indexer-fused-kernel-fixes branch 2 times, most recently from 94eab23 to 0300efa Compare June 1, 2026 07:37
…kernel

The fused `indexer_qk_rope_quant_and_cache_kernel` (added in ROCm#3185) diverged
numerically from the unfused vLLM path it replaces, causing a catastrophic
GSM8K accuracy regression on DeepSeek-V3.2 (0.95 -> 0.49 strict-match,
20-shot) when fusion was enabled. Two independent bugs in this kernel:

1. Q quant skipped UE8M0 rounding and used direct division by a constexpr
   fp8_max. The unfused path is `per_token_group_quant_fp8` in
   vllm/.../fp8_utils.py which (a) multiplies by the reciprocal of fp8_max
   and (b) applies UE8M0 (`scale = 2^ceil(log2(scale))`) when the caller
   passes `scale_fmt = "ue8m0"`. DSv3.2's indexer always passes ue8m0, so
   the fused kernel disagreed with the unfused one on ~94% of Q values
   per call.

   The K-quant block in the same kernel already applied UE8M0 correctly
   (lines ~1429); only the Q block was missing it. Direct division also
   triggers GPU fast-division which adds 1-ULP noise that flips the
   rounded fp8 value at representable boundaries.

2. `norm_weight` and `norm_bias` were typed `scalar_t*`, which in
   production is bf16. vLLM stores `LayerNorm.weight`/`bias` as fp32 and
   `F.layer_norm` consumes them as fp32 in the unfused path. The implicit
   fp32 -> bf16 cast at the call site lost ~16 mantissa bits per element,
   causing K to drift from the unfused reference by 1+ fp8 ULP on ~3% of
   values per call.

Both drifts compounded across the 58 indexer layers in DSv3.2 and broke
long-context accuracy. With both fixes applied (and a separate cache-layout
fix on the vLLM call site), GSM8K strict-match recovered to 0.95.

Changes:

- Apply UE8M0 + multiply-by-reciprocal to the Q scale, mirroring the
  unfused Triton `per_token_group_quant_fp8`.
- Hard-type `norm_weight` and `norm_bias` as `float*` in the kernel
  signature and the launch macro, drop the `static_cast<float>` on each
  load, and assert `dtype == fp32` on the host so the bf16 footgun cannot
  be reintroduced.

ABI note: this tightens the dtype contract for `norm_weight`/`norm_bias`
from "match q.dtype" to "must be fp32". vLLM is the only known caller of
this kernel today and already has fp32 LN params natively, so the change
is benign for it. Any future caller passing bf16 will get a loud host
check failure rather than silent ~3% K drift.
Comment thread csrc/kernels/cache_kernels.cu

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes two numerical-correctness issues in the fused indexer_qk_rope_quant_and_cache_kernel to match the unfused vLLM reference path for DeepSeek-V3.2, restoring accuracy when fusion is enabled.

Changes:

  • Fix Q-side FP8 quant scale computation to match vLLM (reciprocal-multiply + optional UE8M0 power-of-two scaling).
  • Require LayerNorm norm_weight/norm_bias to be FP32 end-to-end (kernel signature, launcher casts, and host-side dtype checks), avoiding silent bf16 precision loss.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread csrc/kernels/cache_kernels.cu
Comment thread csrc/kernels/cache_kernels.cu
@samremes samremes added the ci:all label Jun 1, 2026
sunway513 added a commit to sunway513/aiter that referenced this pull request Jun 1, 2026
…ix lands

The DSv3.2 indexer eval hangs and hits the 3600s timeout (HIP backtrace) on
current AITER main. Verified the ROCm#3451 fix (cache_kernels.cu) cherry-picked
does not resolve it yet, so keep DeepSeek-V3.2 Accuracy disabled
(run_on_pr/run_on_schedule = False -> reported in the 'disabled' bucket, not
deleted) to keep the downstream signal clean. Re-enable once the DSv3.2
indexer kernel fix merges (ROCm#3451 / dsv32-indexer-fused-kernel-fixes).
@sunway513

Copy link
Copy Markdown
Collaborator

Data point from a downstream verification run: I cherry-picked this PR's fix (423f22a8, cache_kernels.cu) onto a clean AITER branch and ran the MI35x DeepSeek-V3.2 accuracy suite (test/registered/amd/accuracy/mi35x/test_deepseek_v32_eval_mi35x.py, 8-GPU, linux-aiter-do-mi350x-8). It still hangs and hits the 3600s timeout (HIP backtrace in libamdhip64.so, exit 255) — i.e. this fix alone does not yet get V3.2 through the eval. Flagging in case there's a remaining indexer hang beyond the Q UE8M0 / fp32-LN-params changes. Happy to re-run once you push more. (FYI: I've temporarily disabled the DeepSeek-V3.2 accuracy entry in sglang_downstream.py to keep the downstream signal clean meanwhile; it flips back on when this lands.)

sunway513 added a commit that referenced this pull request Jun 1, 2026
…+ SGLang) on MI350X (#3441)

* ci(atom-downstream): add Kimi-K2.5-MXFP4 TP8 accuracy gate on MI350X

Add Kimi-K2.5-MXFP4 to the ATOM downstream accuracy matrix so AITER
changes are regression-checked against the Kimi e2e workload.

Verified on MI355X (gfx950) 2026-05-30 with rocm/atom-dev:vllm-latest
(aiter ef114b0), vllm serve TP8: gsm8k 3-shot flexible-extract 0.9409,
matching the amd/Kimi-K2.5-MXFP4 reference. Runs on the requested
linux-aiter-do-mi350x-8 runner; threshold 0.92 leaves margin.

Triggered with the existing ci:atom / ci:all labels (and on push/
schedule/workflow_dispatch).

* ci(kimi-downstream): add vLLM (OOT) + SGLang Kimi-K2.5 accuracy gates on MI350X

Complements the ATOM in-tree gate in atom-test.yaml so AITER is
regression-checked against Kimi-K2.5-MXFP4 across all three downstream
serving stacks.

New workflow kimi-downstream.yaml rebuilds the PR's AITER (gfx950) into
the backend image and runs gsm8k via the in-image launch scripts:
- vllm:  atom-dev:vllm-latest + atom_oot_test.sh (vllm serve), blocking,
         threshold 0.92 (verified 0.9409 on MI355X, aiter ef114b0)
- sglang: atom-dev:sglang-latest + atom_sglang_test.sh, continue-on-error
          (non-blocking) -- SGLang currently can't load AMD Quark MXFP4
          per-expert weights; kept as a visible signal until that loader
          bug is fixed.

Runs on linux-aiter-do-mi350x-8 under ci:kimi / ci:vllm / ci:sglang /
ci:all labels (and push/schedule/workflow_dispatch).

* ci(kimi-downstream): use official ROCm nightly images for vLLM + SGLang

Move the downstream Kimi-K2.5 gates off the AMD-internal atom-dev:*-latest
images onto the official nightly downstream containers, so the gate
validates AITER against what actually ships:
- vLLM:   rocm/vllm-dev:nightly (upstream-native KimiK25ForConditionalGeneration)
- SGLang: lmsysorg/sglang-rocm:v0.5.12.post1-rocm720-mi35x-20260531
          (no floating nightly tag exists; pin latest MI35X/ROCm7.2 build)

These images lack the ATOM launch scripts + lm_eval, so add self-contained
launchers (.github/scripts/kimi_{vllm,sglang}_accuracy.sh) that vllm serve /
sglang.launch_server + lm_eval gsm8k and print KIMI_FLEX_EXTRACT. The PR's
AITER is built from source into the image at runtime (gfx950), avoiding any
torch ABI mismatch. SGLang stays non-blocking (loader bug).

* ci(kimi-downstream): fix vLLM + SGLang Kimi-K2.5 gates on official nightly images

Reproduced both gate failures on MI350X (gfx950) TP8 and fixed them.

vLLM (rocm/vllm-dev:nightly): the worker crash was --load-format
fastsafetensors -- the official image doesn't ship the fastsafetensors
package, so every TP worker died at weight load with an ImportError
(surfaced only as 'WorkerProc initialization failed'). Drop the flag; the
default safetensors loader handles the 521GB checkpoint in ~27s/worker.
Reference accuracy 0.9409.

SGLang (lmsysorg/sglang-rocm:...mi35x-20260531): two upstream-SGLang bugs
on this Kimi-K2.5 path (not AITER):
  1) MoE loader crash with shared-experts fusion vs unfused per-expert
     Quark MXFP4 shard shape -> --disable-shared-experts-fusion.
  2) Default triton/fused-MLA path crashes on Kimi-K2.5 head dims (and fp8
     KV cache dies on the triton fp8 dot) -> --attention-backend aiter +
     bf16 KV (drop --kv-cache-dtype fp8_e4m3). This routes MLA through the
     PR's AITER kernels end to end. Measured gsm8k flexible-extract 0.9272.
SGLang lane is now blocking (continue_on_error: false).

* ci(atom-downstream): expand coverage to InferenceX MI355X frontier set

Add DeepSeek-V4-Pro, Qwen3.5-397B-A17B-FP8, MiniMax-M2.7, GLM-5.1-FP8 to
the ATOM accuracy generator's default set, matching the model coverage of
SemiAnalysisAI/InferenceX on MI355X. All configs come from ATOM
models_accuracy.json; runners pinned to the AITER MI350X pool by TP size
(V4-Pro/GLM-5.1 -> do-mi350x-8, Qwen3.5-397B -> -4, MiniMax-M2.7 -> -2).

GLM-5.1-FP8 chosen over GLM-5-FP8 (GLM-5 has a known ATOM sparse-attn-
indexer crash near the gsm8k request count).

* ci(kimi-perf): add Kimi-K2.5 perf gates (vLLM + SGLang) on official nightly

New kimi-perf-downstream.yaml runs a Kimi-K2.5 throughput sweep
(ISL/OSL 1024/1024, concurrency 4..64) on linux-aiter-do-mi350x-8 and
gates on c=64 output tok/s. Triggered by ci:performance / ci:all label +
nightly schedule (20:43 UTC) + manual dispatch. Builds PR AITER from
source into the official nightly images, reusing the validated accuracy-gate
launch flags.

Validated on MI350X gfx950 TP8 (PR AITER built from source):
  vLLM   (rocm/vllm-dev:nightly)        c=64 3126.4 tok/s -> floor 2250
  SGLang (lmsysorg/sglang-rocm:...531)  c=64 3284.7 tok/s -> floor 2400

* ci(atom-downstream): keep PR-default set small; frontier models via ci:atom_full

Move the InferenceX frontier models (DeepSeek-V4-Pro, Qwen3.5-397B-A17B-FP8,
GLM-5.1-FP8, MiniMax-M2.7) out of the always-on PR default set and back to
on-demand ci:atom_full coverage. Running all of them on every PR overloaded
the do-mi350x pool and flaked the Kimi accuracy + perf gates. The runner
pins (do-mi350x by TP size) are retained, so ci:atom_full still exercises
them on the AITER MI350X cluster. MiniMax-M2.7 (needs an ATOM-side
HSA_NO_SCRATCH_RECLAIM env) is therefore no longer red on every PR.

* ci(sglang-downstream): disable DeepSeek-V3.2 accuracy until indexer fix lands

The DSv3.2 indexer eval hangs and hits the 3600s timeout (HIP backtrace) on
current AITER main. Verified the #3451 fix (cache_kernels.cu) cherry-picked
does not resolve it yet, so keep DeepSeek-V3.2 Accuracy disabled
(run_on_pr/run_on_schedule = False -> reported in the 'disabled' bucket, not
deleted) to keep the downstream signal clean. Re-enable once the DSv3.2
indexer kernel fix merges (#3451 / dsv32-indexer-fused-kernel-fixes).

---------

Co-authored-by: Peng Sun <sunway513@users.noreply.github.com>
@frida-andersson

Copy link
Copy Markdown
Contributor Author

Thanks @sunway513 - worth flagging: SGLang's DSv3.2 indexer (dsa_indexer.py) only imports indexer_k_quant_and_cache (L68) and calls it once at L1247. No references to indexer_qk_rope_quant_and_cache anywhere in sgl-project/sglang.

This PR only touches indexer_qk_rope_quant_and_cache_kernel and its host wrapper, so it's a no-op for the SGLang path, re-enabling your sglang_downstream.py DSv3.2 entry shouldn't be gated on this PR. Whatever's hanging is somewhere else (probably indexer_k_quant_and_cache, the MQA logits kernels, or upstream in dsa_indexer.py)

@ChuanLi1101

ChuanLi1101 commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

The core fix is correct: aligning the Q scale with the unfused per_token_group_quant_fp8 (reciprocal-multiply) and making the LN params fp32 end-to-end. Two non-CI items to address before merge:

  1. Add shape/contiguity guards for norm_weight / norm_bias (re: Copilot's comment). The kernel indexes them as a flat array (norm_weight[dim] / norm_bias[dim]), but the host only validates dtype and size(0) == head_dim. A non-contiguous or non-1D view would silently produce wrong results. Please add explicit dim() == 1 and contiguity checks (e.g. AITER_CHECK(norm_weight.is_contiguous(), ...)) for both tensors before launch — or, if the contract guarantees a 1D contiguous input, reply on the thread so it can be resolved.

  2. Document the breaking dtype change. Host validation changed from "norm_weight/norm_bias dtype must match q.dtype" to "must be fp32". Any existing caller passing bf16 LN params will now hit the AITER_CHECK failure. The caller audit (vLLM / ATOM both fp32) was posted in the thread, which is good — please also note this as a breaking change in the PR description / changelog so downstream is aware.

The kernel indexes norm_weight[dim] / norm_bias[dim] as a flat array;
a non-1D or non-contiguous view would silently produce wrong results.
Add explicit dim() == 1 and is_contiguous() checks before launch so a
bad input is caught immediately rather than corrupting K values.
@frida-andersson

Copy link
Copy Markdown
Contributor Author

Thanks for the review @ChuanLi1101! I've adressed both points:

  1. Shape/contiguity guards - added AITER_CHECK(norm_weight.dim() == 1, ...)AITER_CHECK(norm_weight.is_contiguous(), ...) and the same for norm_bias before launch in 9a1bae8
  2. Breaking change documented - added a Breaking change section to the PR description noting the fp32 dtype contract and the caller audit (vLLM + ATOM both fp32 natively, SGLang doesn't call this kernel)

@ChuanLi1101 ChuanLi1101 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM - the Q UE8M0 + fp32 LN fixes are correct, and my earlier review points are now addressed (contiguity/1D guards added, breaking dtype change documented in the ABI note + caller audit). One thing before merge (non-blocking on the code): please confirm the red CI gates (Kimi-K2.5 vllm, Kimi perf vllm, gpt-oss-120b fp8_kvcache benchmark) are pre-existing/unrelated - none of them exercise the DSv3.2 indexer path this PR touches, and DeepSeek-R1 / SGLang / Standard tests are all green.

@amd-mghanimi

amd-mghanimi commented Jun 16, 2026

Copy link
Copy Markdown

LGTM - the Q UE8M0 + fp32 LN fixes are correct, and my earlier review points are now addressed (contiguity/1D guards added, breaking dtype change documented in the ABI note + caller audit). One thing before merge (non-blocking on the code): please confirm the red CI gates (Kimi-K2.5 vllm, Kimi perf vllm, gpt-oss-120b fp8_kvcache benchmark) are pre-existing/unrelated - none of them exercise the DSv3.2 indexer path this PR touches, and DeepSeek-R1 / SGLang / Standard tests are all green.

Thanks for the review. The Kimi errors here are due to this bug in upstream vllm that is hopefully going to be fixed in the next nightlies: vllm-project/vllm#45596

The GPT-OSS error is related to refactoring triton version update. The current version in vllm is 3.6 but installing aiter automatically updated that to 3.7 (got released 2 weeks ago) this version moved triton_kernels.matmul_ogs to triton_kernels.matmul (this PR in triton). Current vLLM has a non-blocking error message for this on some models but fails on some other models such as gptoss here.

@valarLip

Copy link
Copy Markdown
Collaborator

let me know once ci passed

@frida-andersson

Copy link
Copy Markdown
Contributor Author

Thanks @valarLip! The CI failures are unrelated to this PR, see @amd-mghanimi's comment above. I rebased the PR but need approval to re-start the CI

@amd-mghanimi

amd-mghanimi commented Jun 23, 2026

Copy link
Copy Markdown

New CI issues:

  • Atom tests / Accuracy seems to be failing on python module/package import in the ATOM source code, which is unrelated to this PR.
    ImportError: cannot import name 'moe_shuffle_scale' from 'aiter.ops.shuffle' (/app/aiter-test/aiter/ops/shuffle.py)
  • Kimi Downstream Test and Kimi Perf Downstream seems to be failing because the benchmark script is not waiting enough for the server to load the model and be ready for serving.
    These kimi tests are also failing on the main branch:
    https://github.com/ROCm/aiter/actions/workflows/kimi-perf-downstream.yaml?query=branch%3Amain

In the past, some of these errors could get resolved by rerun. Because part of the slow loading time for these tests were due to model was getting downloaded on the runner machine, so on second attempts often they could pass but I think for Kimi tests the source script should add some waiting time to be able to pass the tests.

@zufayu

zufayu commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

PR #3451 updates LayerNorm weight and bias to FP32, which requires matching changes in ATOM’s LayerNorm module. Merging this PR without corresponding ATOM adjustments will break existing production models.

Background
At present, only the QK normalization layer in the DSV32 workload uses FP32 weights, which is handled by the kernel indexer_qk_rope_quant_and_cache_kernel modified in this PR.

Required ATOM LayerNorm model-op updates

  • Add a data type parameter during initialization.
  • Add type conversion logic: convert FP32 weights to BF16 before feeding them into the CK LayerNorm kernel.

Merge Requirement
ATOM code changes must be submitted together with PR #3451 or merged beforehand. Conditional branch logic is needed to preserve backward compatibility and prevent runtime errors on existing models.

@frida-andersson

Copy link
Copy Markdown
Contributor Author

Thanks @zufayu for the comment, agreed this needs an ATOM-side companion. This PR only changes the dtype contract on indexer_qk_rope_quant_and_cache (norm dtype == q.dtype → == fp32), it doesn't touch ATOM's LayerNorm or layernorm2d_fwd, so the CK kernel shouldn't need any change.

Also, are you seeing an actual accuracy regression in ATOM, or is this from review? On vLLM this fix recovers GSM8K 0.49 → 0.95 (with the vLLM companion #43907) when running with --num_fewshot 20

@zufayu

zufayu commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Checked vLLM #43907 (deepseek_v2.py): it calls .to(torch.float32).contiguous() on k_norm.weight/bias explicitly, commenting "casting to bf16 here loses precision and drifts K from the unfused path." — so the companion ATOM change is required.

PS: :713
https://github.com/vllm-project/vllm/pull/43907/changes#diff-b637aa4a1ce6281b0b1d955c37f7ecce22df2018d37e995cf0fe1b0e6dbd969

@frida-andersson

frida-andersson commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

Rebased cleanly on latest main (no conflicts) - needs approval from a maintainer to re-run the CI. Code is unchanged since @ChuanLi1101's LGTM: contiguity/1D guards and the breaking fp32 dtype-contract doc are in. @junhaha666 (already requested) / @valarLip - could one of you take a look and review this PR?

The ATOM dependency is covered by ROCm/ATOM#1359 (optional dtype on LayerNorm, defaults None so existing models are unchanged; sets DSv3.2 k_norm to fp32) - suggest landing this with #1359.

@valarLip

Copy link
Copy Markdown
Collaborator

btw looks like no accuracy diff for ATOM side?

@frida-andersson

Copy link
Copy Markdown
Contributor Author

btw looks like no accuracy diff for ATOM side?

No accuracy diff on ATOM, @cpersson-amd's numbers in ROCm/ATOM#1359 show DSv3.2 gsm8k 5-shot at 0.9560 vs 0.9591 strict-match on main. ATOM already calls the indexer with preshuffle=True, so it never hit the K-cache layout bug that tanked vLLM (fixed separately in vllm#43907) — here the fp32 LN change is just a precision alignment and accuracy stays flat. #1359 keeps dtype optional (defaults None) so all other models are unchanged, and only pins DSv3.2 k_norm to fp32. Suggest landing the two together. CI's green now

@valarLip
valarLip merged commit 4a1cc77 into ROCm:main Jul 28, 2026
48 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants