已关闭
【26.2.0众测】npugraph_ex 后续回放覆写前次输入张量存储(同形状换入参即静默损坏,无任何告警) #5114
程康博创建于 9月25日关闭于 15 天前
9月25日 添加了label:help-wantedbot-triaged
TorchNPU-Bot
9月25日 评论:
9月25日 评论:
检测到社区任务相关 issue,自动添加标签:help-wanted


15 天前 关闭了 issue
15 天前 issue状态由 TODO 改变为 DONE
15 天前 添加了label:resolved
环境信息
问题现象
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关键观测:
xs[0]持有、未由用户释放,torch.equal在第二次回放后由 True 变 False(被改写的是数据而非引用);.clone()即与 eager 完全一致(allclose=True),问题只发生在输入侧;torch_npu/dynamo/npugraph_ex/_acl_concrete_graph/acl_graph.py:1470,并给了clone_output选项),对输入被覆写没有任何提示。初步推测与 ACL graph 固定地址的静态输入槽有关:首次输入的存储可能被 graph pool 当作静态槽复用,后续回放把新输入 copy-in 时写进了上一次输入仍然存活的那块存储(精确机制以官方定位为准)。
对照实验(同机同版本)
影响
任何需要保留上一批次输入的真实场景都会被静默污染,且极难排查:输入缓存/去重、把 batch 写入日志或队列、异步双缓冲/多流流水线、失败样本回捞、回放对比等。常规“每轮新 batch、旧引用立即释放”的训练循环因为地址复用通常恰好不触发,使问题更隐蔽。
临时规避
x_snapshot = x.clone(),或对需要留存的输入显式拷贝;backend="npugraphs"(实测输入受保护)。期望
clone_output的开关;关联但不同