已关闭
[Bug-Report|缺陷反馈]: TopK/Sort Tiling 存在 int64->uint32 隐式收窄,超大维度可能溢出导致调度错误 #1514
CodeSail创建于  5月11日关闭于  6月22日
CodeSail
5月11日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

一、问题描述

TopK/Sort 算子Tiling调度核心逻辑中,输入维度是int64_t的,但中间计算变量是uint32_t,混用可能产生问题,存在高频隐式收窄转换,属于大模型部署场景隐蔽问题:
在维度累乘、分块数、核数、workspace 大小等关键调度值使用 uint32_t 存储;
超大Batch和超长序列场景下,当计算结果超过uint32最大值,会产生溢出截断;

二、涉及文件与代码位置

文件位置:math\top_k_v2\op_host\arch35\top_k_v2_tiling_arch35.cpp

  1. TopK 中 unsortedDimNum 定义与累乘
    top_k_v2_tiling_arch35.cpp 行号:1197-1200

uint32_t unsortedDimNum = 1; for (uint32_t i = 0; i < (inputDimNum - 1); i++) { unsortedDimNum *= inputShape.GetDim(i); }
行号:185-187
uint32_t lastDimTileNum = (static_cast<uint32_t>(lastAxisNum) + tileData - 1) / tileData; uint32_t lastDimTileNumTimes = (lastDimTileNum + maxCoreNum - 1) / maxCoreNum; uint64_t initUb = indexDtypeSize * topkV2DataInfo::BIN_NUM * (lastDimTileNumTimes + 1) +...
行号:499-500
uint32_t lastDimTileNum = (lastAxisNum + tileData - 1) / tileData; uint32_t inputTopkSize = kValue * lastDimTileNum;
行号:516-519
uint32_t lastDimTileNum = (lastAxisNum + nowTileSize - 1) / nowTileSize; uint32_t tileNum = lastAxisNum / lastDimTileNum; uint32_t tailTileNum = lastAxisNum % lastDimTileNum; tileNum = tailTileNum == 0 ? tileNum : tileNum + 1;
2. Sort 中 sortAxisNum 参与 uint32_t 运算
sort_tiling_arch35.cpp 行号:285-289
uint32_t xUbSize = sortTileInfo.sortAxisNum * sortTileInfo.dtypeSize; xUbSize = CeilDivMul<uint32_t>(int64_t(xUbSize), int64_t(sortTileInfo.blockUbSize)); uint32_t y2UbSize = sortTileInfo.sortAxisNum * static_cast<uint32_t>(sizeof(int32_t)); y2UbSize = CeilDivMul<uint32_t>(int64_t(y2UbSize), int64_t(sortTileInfo.blockUbSize)); uint32_t halfNum = y2UbSize / static_cast<uint32_t>(sizeof(int32_t));

三、建议修改方式

  1. 维度长度、轴数量、累乘中间量,建议使用 uint64_t或int64_t;
  2. 全局偏移、总元素数、总块数,这些建议使用 64 位类型;
  3. 最终写入硬件字段前,做一下范围校验,并收窄到安全范围;
  4. 禁止隐式类型转换:建议不要int64_t和uint32_t相互的转换无校验直接赋值。
    个人在开发中也遇到过类似的问题,类型转换属于比较隐蔽,且不易排查的,尽可能避免超大维度溢出导致调度错误,检查转换情况是否符合预期。可能产生数值溢出、类型安全、算法调度错误。

四、排查意义

避免数值溢出、内存越界、算子崩溃、NaN/Inf 等隐蔽问题。
这个math库属于基本库且常用,检查是否符合大模型算子类型安全规范,提升这个math库整体稳定性。

likedislike
BruceLP
BruceLP成员
5月12日 评论:

您好,感谢关注、使用和提出建议。后续将对Topk/Sort算子中数据类型隐式收窄问题进行整改,验证成熟后,将会合入上库和发布,敬请期待。

likedislike
黄晓彬成员
5月28日 评论:

sort算子已修复

likedislike
CANN-robotCANN-robot成员
6月22日 关闭了 issue
CANN-robotCANN-robot成员
6月22日 添加了label:resolved