[AMD] Drop redundant FP8 bpreshuffle scale transpose via fused AR kernel (#33021)

This commit is contained in:
jacky.cheng
2026-08-25 02:49:57 -07:00
committed by GitHub
parent a618d4c064
commit 6a81038317
3 changed files with 32 additions and 9 deletions
@@ -47,6 +47,7 @@ def tensor_model_parallel_fused_allreduce_rmsnorm_quant_per_group(
eps: float,
group_size: int = 128,
emit_bf16: bool = False,
transpose_scale: bool = False,
) -> Optional[Tuple[torch.Tensor, ...]]:
"""Fused TP all-reduce + RMSNorm + per-group FP8 quant (ROCm/aiter).
@@ -57,9 +58,19 @@ def tensor_model_parallel_fused_allreduce_rmsnorm_quant_per_group(
service the request (non-AMD, custom AR disabled, shape unsupported).
Callers MUST handle ``None`` by falling back to the separate
fused-AR-RMSNorm + per-group-quant path.
``transpose_scale=True`` asks the kernel to emit the per-group scale in the
column-major layout the gfx95 bpreshuffle GEMM consumes, so callers can skip
the post-kernel ``materialize_bpreshuffle_fp8_scale`` transpose.
"""
return get_tp_group().fused_allreduce_rmsnorm_quant_per_group(
input_, residual_inp_, weight_, eps, group_size, emit_bf16=emit_bf16
input_,
residual_inp_,
weight_,
eps,
group_size,
emit_bf16=emit_bf16,
transpose_scale=transpose_scale,
)
@@ -840,6 +840,7 @@ class GroupCoordinator:
eps: float,
group_size: int = 128,
emit_bf16: bool = False,
transpose_scale: bool = False,
) -> Optional[Tuple[torch.Tensor, ...]]:
"""Attempt fused all-reduce + RMSNorm + per-group FP8 quant.
@@ -853,6 +854,10 @@ class GroupCoordinator:
``(fp8, residual_out, scale, bf16)`` — used by GDN-style layers that
need both an FP8 projection and a bf16 gating projection without
launching a separate per-group quant kernel.
When ``transpose_scale=True`` the kernel writes the per-group scale in
the column-major layout the gfx95 bpreshuffle GEMM consumes, so the
caller can skip the post-kernel scale transpose.
"""
if not (is_hip() and is_gfx95_supported()):
return None
@@ -899,6 +904,7 @@ class GroupCoordinator:
group_size,
use_1stage_ar,
emit_bf16=emit_bf16,
transpose_scale=transpose_scale,
)
except Exception:
return None
+14 -8
View File
@@ -303,17 +303,24 @@ def _forward_with_allreduce_fusion_quant_per_group(
if world_size <= 1:
return None
# TODO: When ROCm/aiter#3652 is available in our bundled aiter, plumb
# transpose_scale=use_bpreshuffle into the fused AR+RMSNorm+quant kernel
# and drop this explicit post-kernel scale materialization.
# ``transpose_scale=use_bpreshuffle`` asks the fused kernel to emit the
# per-group scale directly in the column-major layout the gfx95 bpreshuffle
# GEMM consumes (identical to ``materialize_bpreshuffle_fp8_scale``), so the
# fused-success paths below need no post-kernel transpose. The separate
# per-group-quant fallbacks still materialize: ``per_1x128_quant``'s own
# ``transpose_scale`` byte-shuffles the scale into a *different* arrangement,
# not the column-major layout this GEMM expects.
if not keep_bf16:
result = tensor_model_parallel_fused_allreduce_rmsnorm_quant_per_group(
x, residual, weight, norm_module.variance_epsilon, group_size
x,
residual,
weight,
norm_module.variance_epsilon,
group_size,
transpose_scale=use_bpreshuffle,
)
if result is not None:
fp8_out, residual_out, scale_out = result
if use_bpreshuffle:
scale_out = materialize_bpreshuffle_fp8_scale(scale_out)
return (fp8_out, scale_out), residual_out
# Fallback: fused AR+RMSNorm then separate per-group quant.
@@ -345,11 +352,10 @@ def _forward_with_allreduce_fusion_quant_per_group(
norm_module.variance_epsilon,
group_size,
emit_bf16=True,
transpose_scale=use_bpreshuffle,
)
if result is not None and len(result) == 4:
fp8_out, residual_out, scale_out, bf16_out = result
if use_bpreshuffle:
scale_out = materialize_bpreshuffle_fp8_scale(scale_out)
return (bf16_out, fp8_out, scale_out), residual_out
fused_result = tensor_model_parallel_fused_allreduce_rmsnorm(