Open
[确定性][一致性] sparse_lightning_indexer_kl_loss_grad:det 用例 deterministic_check Fail 复现与代码分析 #588
Alice_zhouAdd on 1 day ago
11 hours ago Modify description of issue
Alice_zhou
7 hours ago Comments:
7 hours ago Comments:
已提单:DTS2026111406621


已提单:DTS2026111406621


背景
sparse_lightning_indexer_kl_loss_grad。sparse_lightning_indexer_kl_loss_grad_flash_dsv4_test_01_det、..._test_05_det(is_deterministic=True)。libs/comparator.py:636-647 tensor_deterministic_check使用torch.eq逐位比较输出。100.105.89.155,Ascend950DT_9582,CANN 9.3.0(ascend-toolkit/latest→cann-9.3.0);100.102.205.195,Ascend950PR_9589,CANN 9.3.0。问题现象与复现结果
1) deterministic_check 结果(两台环境一致)
2) 逐元素差异定位
固定输入连续调用算子 10 次,与首轮结果逐位对比:
dq不稳定;dk/dw/softmax_out全部逐位一致。sum=-1892.79248;B:sum=-1892.36475);执行torch.npu.empty_cache()或改变显存分配历史后,结果在 A/B 间翻转,同一状态下连续调用逐位一致。现场/代码分析(含 tiling 侧确定性参数确认)
0) 补充确认(2026-11-14):tiling 侧确实获取了确定性参数
op_host/arch35/sparse_lightning_indexer_kl_loss_grad_tiling_general_regbase.cpp:270op_host/sparse_lightning_indexer_kl_loss_grad_tiling_general.cpp:177op_host/arch92/sparse_lightning_indexer_kl_loss_grad_tiling_general_regbase_arch92.cpp:270deterministic = (context_->GetDeterministic() == 1);context_->GetDeterministic()定义在include/exe_graph/runtime/tiling_context.h:464,读取框架下发的“确定性计算等级”(隐藏 tiling 上下文输入),不是算子 attr;等级 1 表示开启确定性计算配置(include/base/context_builder/op_tiling_context_builder.h:60)。workspace size:[43120640], multicoreTotalsize:[26343424]workspace size:[25820160], multicoreTotalsize:[9042944]..._tiling_general_regbase.cpp:1151 [GetWorkspaceSize]GetWorkspaceSize()中if (deterministic)分支一致(deterministic 会额外分配bmm3Size*coreNum + scatterAddOutSize*2),说明 det 用例在 tiling 侧拿到的就是 deterministic=1;harness 同时打印了set torch.use_deterministic_algorithms True。1) 确定性标志进入 tiling key,并选择 kernel 的确定性模板
GetTilingKey直接包含deterministic(..._tiling_general_regbase.cpp:1118;tiling_general.cpp:610还包含privateScatter)。if constexpr (Deterministic)分支(如op_kernel/.../..._kernel_base.h:440/588/625/638/644/660/666/683/707/781、..._vector_block.h:241/251/256/263/269),且有确定性 scatter/rendezvous 实现。2) 仍成立的事实:schema / C++ 封装没有显式
deterministic入参cann_ops_transformer/ops/attention/sparse_lightning_indexer_kl_loss_grad/sparse_lightning_indexer_kl_loss_grad.py:31-46:metadata 与主算子均无deterministic入参。csrc/attention/sparse_lightning_indexer_kl_loss_grad.cpp:57-77:调用aclnnSparseLightningIndexerKLLossGrad时未传 deterministic;脚本里的deterministic=is_deterministic只传给了 CPU 参考实现(harness 第 505 行)。context_->GetDeterministic()从框架获取,实测有效(见第 0 节)。3) 判定标准是逐位相等
libs/comparator.py:636-647:torch.eq(golden_flat, real_flat),任何 ULP 差异即 Fail。4) 新结论
dq仍不可逐位复现。privateScatter判定、SLI_DETER_SCATTER_BANK_NUM分 bank 归约、CrossCoreSetFlag/CrossCoreWaitFlag跨核 rendezvous、固定 reduce 顺序),而不是“开关未下发”。结论与建议
test_01_det、test_05_det在 155/195 均稳定deterministic_check=Fail,可判定为算子确定性问题。GetDeterministic()==1),det 用例实际走确定性分支;建议算子 owner 聚焦 deterministic 路径下 dq 的归约实现:privateScatter判定与SLI_DETER_SCATTER_BANK_NUM分 bank 归约是否真正固定顺序;CrossCoreSetFlag/CrossCoreWaitFlag的 set/wait 配对与跨核 rendezvous 是否完整;sparse_lightning_indexer_kl_loss_grad的“确定性性能”数据需注明 det 侧不保证逐位一致。执行步骤
cd <WORKDIR>/TuringBigKernel/FusionOp_Test export PATH=<CONDA_BIN>:$PATH source activate <CONDA_ENV> source <CANN_TOOLKIT>/set_env.sh # 过滤后的 5 条 det 用例(test_01~05_det) python3 dailyauto_fusion_david_fast.py \ --timeout=1200 \ --casefile=<CASE_DIR>/sligklg_det_only.xlsx \ --runtype=2 --deviceid=<DEVICE_ID> --need_lock_freq=False \ --sheetname=Sheet1 --ti=0-5附件
备注/限制
torch.eq逐位比较),未经过 profiler。torch.npu.empty_cache()复现,说明结果依赖调度/显存分配状态。GetDeterministic()取值。sparse_lightning_indexer_kl_loss_grad网络用例确定性/非确定性性能对比 issue。