Closed
[Bug-Report|缺陷反馈]: 拒绝 CIoU 混合输入 dtype #1053
KaranocaVeAdd on Sep 23Closed at Sep 28
Sep 23 Associated pull request
Sep 23 Modify description of issue
Sep 23 changed custom category from 任务 to 缺陷
KaranocaVe
Sep 23 Comments:
Sep 23 Comments:
/assign


Sep 23 Assign KaranocaVe as responsible person
liu-wei
Sep 23 Comments:
Sep 23 Comments:
您好,感谢反馈!
问题分析
我们基于当前 master(ed2be3ce)核查了该问题,确认属实:experimental 目录下 CIoU 的 InferDataType 与 tiling 均只读取 input 0 的 dtype,kernel entry 以 DTYPE_BBOXES 单一模板实例化并把两个输入都按 GlobalTensor<T> 读取。bboxes=FLOAT32、gtboxes=FLOAT16 的混合 dtype 输入可通过前置校验,kernel 按 FLOAT32 读取 FLOAT16 的 gtboxes buffer,以 [4,8] 为例会读取 128 字节而实际 buffer 仅 64 字节,造成越界读取。
处理方向
您提交的修复 PR #1773 已覆盖该问题:拒绝 bboxes 与 gtboxes 的混合输入 dtype。当前该 PR 处于开放评审状态,后续处理以该 PR 的评审进展为准。
我们会持续跟进。


Sep 26 Modify description of issue
KaranocaVe
16 days ago Comments:
16 days ago Comments:
@liu-wei @sunhao_hw 您好,这个 Issue 对应的修复已经合入:https://gitcode.com/cann/ops-cv/merge_requests/1840
开发者计划反馈,Issue 需要有 Accepted 标签才能计入积分,仅关闭或标记 resolved 还不够。目前这条 Issue 尚未标记 Accepted,麻烦您结合问题和已合入的修复复核一下;确认符合受理条件后,帮忙补上 Accepted 标签。
感谢您的支持!


[Bug-Report|缺陷反馈]: 拒绝 CIoU 混合输入 dtype
问题
CIoU kernel 使用
bboxes的 dtype 实例化模板,并用该类型读取两个输入。输入注册分别允许bboxes和gtboxes使用 FLOAT16 或 FLOAT32,但原 dtype 推导只依据 input 0。当两个输入 shape 都为
[4,8],且bboxes=FLOAT32、gtboxes=FLOAT16时,调用会通过前置检查,随后按 FLOAT32 读取 FLOAT16 的
gtboxes。该输入实际占 64 字节,读取范围为 128 字节,超出输入缓冲区。重现
调用 CIoU,传入 shape 为
[4,8]的 FLOAT32bboxes和 FLOAT16gtboxes。预期与实际
预期在 dispatch 前拒绝 mixed dtype,或明确转换后再执行。实际是前置检查放行,并按 input 0 类型读取 input 1。
影响与规避
该输入组合可能造成设备端越界读、错误结果或 kernel 执行失败。修复前应确保两个输入 dtype 一致。
Validation
Validation
缺陷证据
Host 模型以 shape
[4,8]对比同 dtype 与 mixed dtype:同 dtype 输入读取范围与缓冲区大小一致;FLOAT32/FLOAT16mixed 输入的gtboxes缓冲区为 64 字节,而 kernel 按 FLOAT32 读取 128 字节,确认存在越界读取条件。该模型验证了 Host dispatch 和字节范围,不代表真实设备运行结果。
修复与回归覆盖
dtype 一致性检查保留在
InferDataTypeCIoU,在设置输出 dtype 前比较两个输入;按维护者建议移除tiling 中重复的检查。Host UT 覆盖 FLOAT16/FLOAT16、FLOAT32/FLOAT32 成功,以及
FLOAT32/FLOAT16、FLOAT16/FLOAT32 失败。
验证状态
关联 PR: https://gitcode.com/cann/ops-cv/merge_requests/1773