Closed
[Bug-Report|缺陷反馈]: QFA 静态编译路径下 v_tail 紧凑 stride {1} 校验误判且 tiling 下发错误步长 #7230
杨志鹏Add on  8 days agoClosed at  6 days ago
杨志鹏Collaborators
8 days ago Create

Describe the current behavior / 问题描述 (Mandatory / 必填)

QuantFlashAttn 在静态编译路径(aclgraph 等静态图场景)下,v_tail 的紧凑 stride {1} 会引发两处问题:tiling 阶段连续性校验直接失败;即使校验放行,tiling 还会把错误步长下发给 kernel,导致按 block 寻址错位、读到错误数据。

问题一:连续性校验误判

GE 静态编译路径对完全连续的张量只下发一维 stride {1}(紧凑写法),表示整体连续。而 QfaBaseChecker::CheckTensorContiguous(attention/quant_flash_attn/op_host/checkers/base_checker.cpp)按 tensorDimNum 逐维比较 stride,当 stride 只有一维时,读取未下发的维度会取到默认值 0,与按 shape 累乘得到的期望 stride 不一致,从而判定为非连续。v_tail 的非连续支持规则只允许轴 0~1 非连续(PA_BNBD/PA_NZ),校验返回的非连续轴越界后会直接拒绝该输入。

问题二:tiling 下发错误步长

tiling 的 SetQFATilingData 直接读取 GetStride(0) / GetStride(1),{1} 会得到 bnStride = 1、n2Stride = 0。kernel 侧 GmLayout<PA_BnNBsD> / GmLayout<PA_NZ> 对两个 stride 分别判 0(if (bn2stride != 0) bnStride = bn2stride;),bnStride = 1 会被当作真实值使用,OffsetCalculator 中 blockIdx * GetStrideBlockNum() 按物理 block 寻址时错位,v_tail 读到错误数据,表现为精度异常。

Environment Information / 环境信息 (Mandatory / 必填)

  • 昇腾硬件型号:Ascend960DT(9201)
  • CANN 版本:9.x(静态编译 / aclgraph 路径)
  • 算子:QuantFlashAttn(arch92 mxfp8)

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

  1. 构造带 v_tail 输入的 QuantFlashAttn(arch92 mxfp8)用例,所有输入张量为完全连续的 ND 张量。
  2. 通过静态编译路径(aclgraph / 静态图)下发,GE 对连续张量只下发一维 stride {1}。
  3. host tiling 执行到 v_tail 连续性校验时返回失败;若校验放行,tiling data 中 vTailStrides.bnStride 会被写成 1。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

连续张量应通过连续性校验,tiling 正常完成;vTailStrides.bnStride / n2Stride 取 0(或按 shape 展开的完整连续 stride),kernel 按连续布局推算步长,不出现寻址错位。

校验未放行时表现为 tiling 阶段连续性校验失败(v_tail 被判为非连续轴越界);放行后表现为 v_tail 读取数据错误引起的精度异常,无独立日志文件留存。

Special notes for this issue/备注 (Optional / 选填)

根因:

  1. CheckTensorContiguous 未识别静态编译路径下 GE 的紧凑 stride 写法 {1},按 tensorDimNum 逐维比较时读到未下发维度的默认值 0。
  2. SetQFATilingData 直接按 GetStride(0) / GetStride(1) 写入 tiling data,未考虑 stride 维数不足两维的情况。

修复:

  1. CheckTensorContiguous 在逐维比较前识别 strides->GetDimNum() == 1 && strides->GetStride(0) == 1 并按连续放行;其余形态(含只填 dim_num 但数组值真实的截断写法)沿用原有逐维比较逻辑,最内轴非连续等非法输入仍会被拦截。
  2. arch35 / arch92 的 SetQFATilingData 增加 GetDimNum() >= 2 保护,stride 不足以描述 bn/n2 两轴时保持 0/0,由 kernel 按连续布局推算。

影响范围:仅 quant_flash_attn 内的 QfaBaseChecker 与 arch35/arch92 tiling,其他算子为独立实现,不受影响。

关联 PR:https://gitcode.com/cann/ops-transformer/merge_requests/15489

likedislike
杨杨志鹏Collaborators
8 days ago Added label: bug-report
杨志鹏Collaborators
8 days ago Comments:
likedislike
CANN-robotCANN-robotCollaborators
8 days ago Assign yang-zhipeng19 as responsible person
周云飞
周云飞Collaborators
8 days ago Comments:

问题说明

按报告描述,静态编译路径用 {1} 表示整体连续,而 CheckTensorContiguous 仍按张量维数比较 stride,可能将未下发维度的默认值 0 判为非连续,进而触发 v_tail 的非连续轴限制。现有片段未覆盖该函数及调用链,具体根因仍待核实。

处理建议

若确认 {1} 的上述语义,可在逐维比较前仅对 GetDimNum() == 1 && GetStride(0) == 1 按连续处理,其余形式保留原有校验。重点确认静态图连续输入通过后,vTailStrides.bnStride、n2Stride 均为 0,且最内轴非连续输入仍被拒绝。已提供关联 PR,但其具体改动及合入状态尚未确认。

likedislike
杨杨志鹏Collaborators
6 days ago Change title to "[Bug-Report|缺陷反馈]: QFA 静态编译路径下 v_tail 紧凑 stride {1} 校验误判且 tiling 下发错误步长", originally titled "[Bug-Report|缺陷反馈]: QFA 静态编译路径下连续 v_tail 因紧凑 stride {1} 被误判为非连续".
杨杨志鹏Collaborators
6 days ago Modify description of issue
CANN-robotCANN-robotCollaborators
6 days ago Close issue
CANN-robotCANN-robotCollaborators
6 days ago changed custom state from 待办的 to 已完成
CANN-robotCANN-robotCollaborators
6 days ago Added label: resolved
周云飞
周云飞Collaborators
5 days ago Comments:

已合入 PR #15489,针对 QFA 静态编译路径下的 v_tail stride 处理作了修复:

  • 连续性校验识别紧凑写法 `{1}``,按连续张量放行;其他 stride 形态仍沿用逐维校验。
  • arch35 和 arch92 的 tiling 在 stride 不足两维时保持 bnStride 和 n2Stride 为 0,由 kernel 按连续布局推算,避免将 1 误作为实际步长下发。

PR 记录显示相关源码编译通过。

关联 PR:PR #15489

likedislike