UB Overflow 问题排查指南

概述

UB Overflow 是 Triton-Ascend 开发中常见的问题。本文档详细介绍 UB Overflow 的常见原因、解决方案和调试方法。

常见原因及解决方案

1. 使用了会增加 UB 开销的接口参数

某些接口在特定参数配置下会自动添加额外的处理逻辑,导致 UB 空间使用增加:

tl.maximumtl.minimumtl.clamp 接口的 propagate_nan 参数

问题描述: 当设置 propagate_nan=tl.PropagateNAN.NONE 时,系统会自动添加 NaN 值检测和处理逻辑。

影响:

  • 显著增加 UB 空间使用

  • 可能导致性能下降

解决方案:

  • 如果输入数据不包含 NaN 值或不需要严格的 NaN 处理语义,考虑调整 propagate_nan 参数值

  • 在 UB 空间紧张的场景下,优先选择不会触发额外 NaN 处理的参数配置

2. 中间变量过多

问题: kernel 中定义了大量临时张量或中间计算结果

解决方案:

  • 减少不必要的中间变量

  • 复用已分配的缓冲区

  • 将大计算拆分为多个小 kernel

3. shape 过大

问题: 处理高维/大 shape 张量

解决方案:

  • 考虑将大 tensor 分块处理

  • 修改分块策略,减小每块的大小

调试建议

  1. 开启详细日志

    • 使用 TRITON_DEBUG=1 查看详细的编译信息

    • 定位具体哪个算子导致 UB 溢出

  2. 逐步排查

    • 通过注释掉部分代码,定位导致问题的具体操作

  3. 参考文档

    • 查看各接口文档中的"特殊限制说明"部分

    • 了解可能增加 UB 开销的参数配置

  4. 优化策略

    • 优先处理占用 UB 空间较大的算子

    • 考虑重新设计算法以减少中间变量

    • 考虑修改分块策略