已合并
【feat】: atc support onnx int4 #4420
kantao1创建于 2 天前
【feat】: atc support onnx int4 #4420
已合并
kantao1创建于 2 天前
kantao1成员
2 天前
# Pull Request ## 描述 ### 需求背景 ATC 支持 ONNX INT4 的图转 OM。GE 下游(compiler/runtime/OM 序列化)已支持 DT_INT4,但 ONNX parser 层缺少 INT4 类型映射,导致含 INT4 的 ONNX 模型无法解析。 ## 变更类型 请选择本次引入的变更类型: - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue ## 如何测试 描述测试此变更的步骤和前提条件: - UT(5 个用例):类型映射、raw_data 路径、int32_data 对齐场景、padding 截断、数据不足防越界 - ST(1 个用例):端到端解析含 INT4 Constant 的 ONNX 模型,验证类型映射和数据正确性 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:`feat:`, `fix:`) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 kantao1 的贡献)
Kkantao1成员
2 天前 添加了label:enhancement
Kkantao1成员
2 天前 创建了 pull request,commit 4021d224
atomgit-bot
atomgit-bot
2 天前 评论:

变更摘要

本 PR 旨在让 ATC 的 ONNX parser 层支持 INT4 类型,从而能够解析含 INT4 的 ONNX 模型并完成图转 OM。主要改动包括在 ge_onnx.protoonnx_util.h 中新增 INT4 枚举值、在 onnx_util.cc 中建立 OnnxDataType::INT4ge::DataType::DT_INT4 的类型映射,并在 OnnxConstantParser 中实现 INT4 常量数据的打包字节拷贝逻辑(兼容 raw_dataint32_data 两种存储方式),同时修复了 OnnxFileConstantParser 中对未定义数据类型的判断条件。此外补充了 UT 与 ST 测试用例,覆盖类型映射、数据对齐、padding 截断及越界保护等场景。

主要改动

  • 新增 INT4 类型定义: 在 graph_metadef/proto/onnx/ge_onnx.protoTensorProto.DataType 枚举中新增 INT4 = 22,并注明 4-bit 有符号整数、每字节打包 2 个值、低位在前;同时在 parser/parser/onnx/onnx_util.hOnnxDataType 枚举中新增 INT4 = 22

  • 新增 INT4 类型映射: 在 onnx_util.cconnx_data_type_map 中增加 {OnnxDataType::INT4, ge::DataType::DT_INT4},使 ONNX 的 INT4 能映射到 GE 的 DT_INT4

  • OnnxConstantParser 支持 INT4 常量数据: 在 onnx_constant_parser.cc 中为 INT4 增加基于 int32_data_size() 的数据量统计,并在 ParseConvertDataElements 中新增 INT4 分支,通过 ge::GetSizeInBytes 计算精确的打包字节数,按 min(byte_size, available)int32_data 直接拷贝,避免 padding 槽位带来的多余数据及越界读取。

  • 修正未定义数据类型的判断逻辑: 在 onnx_file_constant_parser.ccParseDataType 中,将 type >= ge::DataType::DT_UNDEFINED 改为 type == ge::DataType::DT_UNDEFINED,避免将合法的 DT_INT4 等类型误判为未定义。

  • 补充测试用例: 新增 UT 与 ST 用例及 onnx_int4_gen.py 生成脚本,覆盖 ParseConvertDataType_Int4raw_data 路径、int32_data 对齐、奇数个数截断、数据不足防越界,以及端到端解析含 INT4 Constant 的 ONNX 模型并校验 DT_INT4 类型与打包字节内容。

likedislike
atomgit-bot
atomgit-bot
2 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
2 天前 添加了label:cann-cla/yes
此处折叠了49条消息 查看更多
CANN-robotCANN-robot成员
1 天前 添加了label:lgtm
yangyongqiang
yangyongqiang成员
1 天前 评论:

/lgtm

likedislike
张德鹏成员
1 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
1 天前 添加了label:approved
CANN-robotCANN-robot成员
1 天前 合入了pull request