UB Overflow 问题排查指南
概述
UB Overflow 是 Triton-Ascend 开发中常见的问题。本文档详细介绍 UB Overflow 的常见原因、解决方案和调试方法。
常见原因及解决方案
1. 使用了会增加 UB 开销的接口参数
某些接口在特定参数配置下会自动添加额外的处理逻辑,导致 UB 空间使用增加:
tl.maximum、tl.minimum、tl.clamp 接口的 propagate_nan 参数
问题描述:
当设置 propagate_nan=tl.PropagateNAN.NONE 时,系统会自动添加 NaN 值检测和处理逻辑。
影响:
显著增加 UB 空间使用
可能导致性能下降
解决方案:
如果输入数据不包含 NaN 值或不需要严格的 NaN 处理语义,考虑调整
propagate_nan参数值在 UB 空间紧张的场景下,优先选择不会触发额外 NaN 处理的参数配置
2. 中间变量过多
问题: kernel 中定义了大量临时张量或中间计算结果
解决方案:
减少不必要的中间变量
复用已分配的缓冲区
将大计算拆分为多个小 kernel
3. shape 过大
问题: 处理高维/大 shape 张量
解决方案:
考虑将大 tensor 分块处理
修改分块策略,减小每块的大小
调试建议
开启详细日志
使用
TRITON_DEBUG=1查看详细的编译信息定位具体哪个算子导致 UB 溢出
逐步排查
通过注释掉部分代码,定位导致问题的具体操作
参考文档
查看各接口文档中的"特殊限制说明"部分
了解可能增加 UB 开销的参数配置
优化策略
优先处理占用 UB 空间较大的算子
考虑重新设计算法以减少中间变量
考虑修改分块策略