已关闭
[Bug-Report|缺陷反馈]: 拒绝 CIoU 混合输入 dtype #1053
KaranocaVe创建于 16 天前关闭于 11 天前
16 天前 关联了pull request:[修复] 拒绝 CIoU 混合输入 dtype
16 天前 修改了issue 的描述
16 天前 issue类型由 任务 改变为 缺陷
KaranocaVe
16 天前 评论:
16 天前 评论:
/assign


16 天前 将 KaranocaVe 设为负责人
liu-wei
16 天前 评论:
16 天前 评论:
您好,感谢反馈!
问题分析
我们基于当前 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 的评审进展为准。
我们会持续跟进。


13 天前 修改了issue 的描述
[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