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


8 days ago Assign yang-zhipeng19 as responsible person
周云飞
8 days ago Comments:
8 days ago Comments:
问题说明
按报告描述,静态编译路径用 {1} 表示整体连续,而 CheckTensorContiguous 仍按张量维数比较 stride,可能将未下发维度的默认值 0 判为非连续,进而触发 v_tail 的非连续轴限制。现有片段未覆盖该函数及调用链,具体根因仍待核实。
处理建议
若确认 {1} 的上述语义,可在逐维比较前仅对 GetDimNum() == 1 && GetStride(0) == 1 按连续处理,其余形式保留原有校验。重点确认静态图连续输入通过后,vTailStrides.bnStride、n2Stride 均为 0,且最内轴非连续输入仍被拒绝。已提供关联 PR,但其具体改动及合入状态尚未确认。


6 days ago Change title to "[Bug-Report|缺陷反馈]: QFA 静态编译路径下 v_tail 紧凑 stride {1} 校验误判且 tiling 下发错误步长", originally titled "[Bug-Report|缺陷反馈]: QFA 静态编译路径下连续 v_tail 因紧凑 stride {1} 被误判为非连续".
6 days ago Close issue
6 days ago changed custom state from 待办的 to 已完成
6 days ago Added label: resolved
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 / 必填)
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
{1}。vTailStrides.bnStride会被写成 1。Describe the expected behavior / 预期结果 (Mandatory / 必填)
连续张量应通过连续性校验,tiling 正常完成;
vTailStrides.bnStride/n2Stride取 0(或按 shape 展开的完整连续 stride),kernel 按连续布局推算步长,不出现寻址错位。Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
校验未放行时表现为 tiling 阶段连续性校验失败(v_tail 被判为非连续轴越界);放行后表现为 v_tail 读取数据错误引起的精度异常,无独立日志文件留存。
Special notes for this issue/备注 (Optional / 选填)
根因:
CheckTensorContiguous未识别静态编译路径下 GE 的紧凑 stride 写法{1},按tensorDimNum逐维比较时读到未下发维度的默认值 0。SetQFATilingData直接按GetStride(0)/GetStride(1)写入 tiling data,未考虑 stride 维数不足两维的情况。修复:
CheckTensorContiguous在逐维比较前识别strides->GetDimNum() == 1 && strides->GetStride(0) == 1并按连续放行;其余形态(含只填dim_num但数组值真实的截断写法)沿用原有逐维比较逻辑,最内轴非连续等非法输入仍会被拦截。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