已关闭
[Bug-Report|缺陷反馈]: DRCO模式下值依赖算子控制流缺少同步导致aicore error(MTE越界) #3182
wan_jianfen创建于  8月31日关闭于  9月1日
wan_jianfen成员
8月31日 创建

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

DRCO 模式(ENABLE_AICORE_RESOLVE=true)下,值依赖(value-depend)算子的控制流 AICPU 与输入 tensor 的生产者算子之间缺少同步机制,导致控制流读到旧数据、生成错误的循环边界/地址偏移,最终触发 aicore error(MTE DDR 地址越界,error code 263/95)。

具体机理:

  • DRCO 模式采用 launch-early 设计,host 侧无 stream 同步,ctrl AICPU 与算子流并发执行;
  • 值依赖算子(如 fused_recurrent_kda 的 ssm_state_indices 由流上 randperm → to(int32) 生产)的控制流在 AICPU 上通过 SetExprBatch/GetInputData 直接读 tensor 数据求值 exprTbl;
  • 若 ctrl AICPU 早于生产者算子完成执行,读到旧 fp32 数据(位模式 0x3EE5xxxx),exprTbl[32](ssm slot 偏移)解析为约 10^9 的垃圾值,AICore 侧 GetPackedGmAddr/TStoreVec 访问越界;
  • 同时 WaitAicoreStart 在 ENABLE_AICORE_RESOLVE 下被空操作化,且 DRCO 模式无 sched AICPU 握手置位 syncFlag,device 侧等待机制完全缺失。

注:#2227 已修复非 DRCO 路径的 value depend sync flag miss(补充 WaitAicoreStart 发射),但 DRCO 模式下等待被空操作化、无置位者,属于该修复遗漏的场景。

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

  • 服务器/NPU 型号: Ascend950PR (kirinX90)
  • PyPTO 版本/Commit: master 35e99c4ba 起(引入 ENABLE_AICORE_RESOLVE)
  • CANN 版本: 9.1.0
  • Python 版本: Python 3.12.9
  • 操作系统: Ubuntu 24.04.3 LTS
  • torch/torch_npu: 2.7.1 / 2.7.1.post8

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

export ENABLE_AICORE_RESOLVE=true
cd pypto-gym
python3 tests/ops/ling_3_0_flash/fused_recurrent_kda/test_fused_recurrent_kda.py   # case 36 inplace_stress_N1024_bf16(脚本已裁剪为仅跑该 case)
  • 用例 PERF 段中 randn/randperm 在算子流上生产输入,runcase 精度校验通过后,首个 warmup launch 即触发崩溃(约 56 个 AIV core 的首个主块任务同时崩);
  • 崩溃为确定性复现(runcase 后第一次 warmup 必现;单独执行 warmup 不复现,因输入无新生产者)。

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

DRCO 模式下值依赖控制流应等待 AICore kernel 启动(其本身排在流上生产者算子之后)后再读输入 tensor 数据,全部 launch 精度校验通过,无 aicore error。

[ERROR] RUNTIME(xxx,python3) ... FuncErrorReason:rtDeviceSynchronizeWithTimeout execution failed, reason=aicore exception
  >> [36/46] inplace_stress_N1024_bf16: FAIL | IMPL CRASH: aicore error 263/95 (MTE DDR address out of range)

崩溃 PC 固定映射至 GetPackedGmAddr → TStoreVec(写 [?,?,128,128] fp32 state tile),AICore 执行时 ssm_state_indices 内容合法(如 sn=709),但 AICPU 早前求值的 exprTbl[32] 为旧 fp32 randn 数据的位模式(≈0.45),证明竞争窗口在读侧。

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

修复方案见 PR !5810:AICore entry core0 获取 blockIdx 与 ring base 后立即置 syncFlag=1(AICore kernel 排在生产者算子之后,置位即数据就绪);kernel exit 推进 indexFinished 前清 syncFlag=0(AllocateWait/Full 门保证槽复用前必然清零);ctrl InitDyn 在 aicore-resolve 下不再 reset(消除 launch-early 下 reset-after-set 竞争);恢复 WaitAicoreStart 自旋等待。已验证 DRCO/非 DRCO 精度全过。

likedislike
Wwan_jianfen成员
8月31日 将 wan_jianfen 设为负责人
Wwan_jianfen成员
8月31日 issue类型由 任务 改变为 缺陷
Wwan_jianfen成员
8月31日 issue状态由 待办的 改变为 修复中
Wwan_jianfen成员
8月31日 添加了label:Machine
Wwan_jianfen成员
8月31日 关联了看板:PyPTO
wan_jianfen成员
8月31日 评论:

修改中

likedislike
Wwan_jianfen成员
8月31日 关联了pull request:fix(machine): Add aicore-entry syncFlag handshake for DRCO value-depend ops
Ggaoxingwang成员
9月1日 issue状态由 修复中 改变为 已完成
Ggaoxingwang成员
9月1日 关闭了 issue