已关闭
【26.2.0众测】npugraph_ex 后续回放覆写前次输入张量存储(同形状换入参即静默损坏,无任何告警) #5114
程康博创建于  9月25日关闭于  15 天前
程康博
程康博
9月25日 创建

环境信息

项目 版本
硬件 Atlas 800T A2(910B2)
CANN 9.1.0
Python 3.12 aarch64
torch / torch_npu 2.12.0+cpu / 2.12.0

问题现象

backend="npugraph_ex"(ACL graph)下,同一已捕获图被不同输入张量回放时,前一次调用的输入存储会被后续回放覆写,全程没有任何报错或告警,属于静默数据损坏:

import torch, torch_npu
torch.manual_seed(0)
model = torch.nn.Linear(128, 64).npu().eval()
xs = [torch.randn(16, 128, device="npu") for _ in range(3)]  # 形状完全相同,仅数据/地址不同
snaps = [t.clone() for t in xs]

cf = torch.compile(model, backend="npugraph_ex")
for t in xs:
    cf(t)
torch.npu.synchronize()

for i, (t, s) in enumerate(zip(xs, snaps)):
    print(i, torch.equal(t, s))
# 实测:0 False   1 True   2 True

关键观测:

  1. 同形状即可触发(16×128 → 16×128),不涉及 shape 变化或动态形状;
  2. 仅紧邻的前一次输入被改写(x0 在 call1 后即损坏,之后保持损坏);
  3. 输入对象始终被 xs[0] 持有、未由用户释放,torch.equal 在第二次回放后由 True 变 False(被改写的是数据而非引用);
  4. 输出侧只要及时 .clone() 即与 eager 完全一致(allclose=True),问题只发生在输入侧;
  5. 运行时只对输出有保留内存覆盖的告警(torch_npu/dynamo/npugraph_ex/_acl_concrete_graph/acl_graph.py:1470,并给了 clone_output 选项),对输入被覆写没有任何提示。

初步推测与 ACL graph 固定地址的静态输入槽有关:首次输入的存储可能被 graph pool 当作静态槽复用,后续回放把新输入 copy-in 时写进了上一次输入仍然存活的那块存储(精确机制以官方定位为准)。

对照实验(同机同版本)

backend 旧输入是否完整 输出 clone 后正确性
npugraph_ex 否(x0 被覆写) 正确
npugraphs 是 正确
npu / aot_eager 是 正确

影响

任何需要保留上一批次输入的真实场景都会被静默污染,且极难排查:输入缓存/去重、把 batch 写入日志或队列、异步双缓冲/多流流水线、失败样本回捞、回放对比等。常规“每轮新 batch、旧引用立即释放”的训练循环因为地址复用通常恰好不触发,使问题更隐蔽。

临时规避

  • 传入前自行保留 x_snapshot = x.clone(),或对需要留存的输入显式拷贝;
  • 对正确性敏感的场景先用 backend="npugraphs"(实测输入受保护)。

期望

  1. npugraph_ex 的静态输入槽 copy-in 不应写入仍被用户持有的旧输入存储(参考 npugraphs 的保护策略),或在检测到旧输入仍存活时自动拷贝/换槽;
  2. 与输出侧对齐:输入侧存在保留内存覆盖风险时给出明确告警/文档说明,并提供类似 clone_output 的开关;
  3. 补充“同形状、不同输入张量、保留旧引用”的回放看护用例。

关联但不同

  • #5105:非 batch 维 shape 变化时报 fake-tensor 错误(报错信息不友好);本单是同形状下的静默存储覆写,连异常都没有。
  • #4379(已关闭):多流 + sleep/wakeup 后侧流越界(v2.9.0,PR #32810 已修),触发链路与本单不同。
likedislike
TorchNPU-BotTorchNPU-Bot成员
9月25日 添加了label:help-wantedbot-triaged
TorchNPU-Bot
TorchNPU-Bot成员
9月25日 评论:

检测到社区任务相关 issue,自动添加标签:help-wanted

likedislike
ascend-robotascend-robot成员
15 天前 关闭了 issue
ascend-robotascend-robot成员
15 天前 issue状态由 TODO 改变为 DONE
ascend-robotascend-robot成员
15 天前 添加了label:resolved