已合并
【PR】: Host tensor value symbolize #4443
chengyutao3创建于 1 天前
【PR】: Host tensor value symbolize #4443
已合并
chengyutao3创建于 1 天前
chengyutao3
chengyutao3成员
1 天前
# Pull Request ## 描述 本次提交为 host tensor(host 侧输入张量)新增**值符号化(value symbolization)**能力,使依赖输入 tensor 具体数值(如 Reshape 的 shape 输入)进行符号推导的场景不再需要把输入搬到 device,从而提升 JIT 执行与符号推导的准确性和性能。 核心变更包括: 1. **新增 graph 级 option `ge.inputHintValue`**:支持通过 `input_index:[v0,v1,...]` 的形式为指定输入指定符号化提示值(与已有 `ge.inputHintShape` 对齐),并在 `option_supportion_checker` 中将该 option 登记为受支持项。 2. **值符号化实现**(`symbolic_shape_symbolizer.cc`): - 新增 `SymbolizeInputValue`,优先使用真实 host 数据(支持 INT32/INT64/UINT32/UINT64,元素数上限 200)生成逐元素符号;无真实数据时回退到 `ge.inputHintValue` 配置值。 - 新增 `InputValueElementSource`,生成可在运行时读取 `GetGraphInputTensor(idx)` 对应元素数值的 source 串。 3. **值依赖输入识别**(`symbolic_infer_util.cc`):新增 `IsValueDependentDataNode` / `GetValueDependentInputIdxs`,通过算子的 `IsInputDataDependency` 与 `op_infer_depends` 判定哪些图输入是"值依赖"的,结果缓存到图 attr 中。 4. **JIT 执行路径适配**(`jit_executor.cc`): - `CopyHostInputsToDevice` 支持 `keep_on_host_idxs`,值依赖的 host 输入不再拷贝到 device。 - `BuildCompileInputs` 对已在 host 的输入跳过重复拷贝。 - `MarkHostTensorOnDataNodes` 改为直接基于 ComputeGraph 处理。 5. **option 解析重构**(`option_utils.cc/h`):将 `ge.inputHintShape` 的解析逻辑抽象为通用模板 `ParseIndexedListOption`,并复用其实现新增 `ParseHintInputValue`。 6. **测试补充与适配**:新增 UT `symbolic_value_inference_unittest.cc`、ST `test_symbolize_value_and_infer.cc` 的 hint value/真实数据用例;JIT 相关用例将 shape 输入由 INT32 调整为 INT64 并置为 host placement;user_graph_manager 用例按"值符号化后 reshape 不再切分执行点"的预期更新。 ## 变更类型 请选择本次引入的变更类型: - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue ## 如何测试 描述测试此变更的步骤和前提条件: 1. 运行符号值推导相关用例:`tests/ge/ut/ge/graph/optimize/symbolic/symbolic_value_inference_unittest.cc`(`compile_path_reshape_with_hint_value`、`execute_path_reshape_with_real_data`)。 2. 运行 autofuse ST:`tests/ge/st/testcase/autofuse/test_symbolize_value_and_infer.cc`(`reshape_symbolize_infer_with_input_hint_value`、`reshape_symbolize_infer_with_real_data`)。 3. 运行 JIT 执行相关用例:`jit_executor_unittest.cc`、`user_graph_manager_unittest.cc`(验证值符号化后图不再切分、host 输入不被重复拷贝)。 4. 构造含 Reshape 且 shape 输入为 host tensor 的模型,配置 `ge.inputHintValue`(如 `1:[5, 400]`),确认符号化推导结果符合预期,且无 device 拷贝开销。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [ ] 我在标题中使用了合适的类型标签(如:`feat:`, `fix:`) - [ ] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 值符号化优先级:真实 host data > `ge.inputHintValue` 配置值;当已存在符号化 value 时跳过。 - 阈值 `kMaxSymbolizeValueElemNum = 200` 与 `symbolic_shape_inference.cc` 中的 `kMaxSymbolicValueSize` 保持一致,仅对 shape/索引类小 tensor 进行值符号化。 - 值依赖输入识别结果以图 attr `_ge_value_dependent_idxs` 缓存,避免重复计算。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 chengyutao3 的贡献)
chengyutao3chengyutao3成员
1 天前 添加了label:enhancement
chengyutao3chengyutao3成员
1 天前 创建了 pull request,commit efc7121a
atomgit-bot
atomgit-bot
1 天前 评论:

变更摘要

本次 PR 为 host 侧输入张量新增「值符号化(value symbolization)」能力:当输入 tensor 的具体数值参与符号推导(如 Reshape 的 shape 输入)时,不再需要把输入搬到 device,而是优先从真实 host 数据生成逐元素符号,无真实数据时回退到新增的 graph 级 option ge.inputHintValue 配置值,从而提升 JIT 执行与符号推导的准确性和性能。

主要改动

  • 新增 ge.inputHintValue option 与解析逻辑重构: 在 option_utils.cc 中将 ge.inputHintShape 的解析逻辑抽象为通用模板 ParseIndexedListOption,并基于其新增 ParseHintInputValue,支持 input_index:[v0,v1,...] 形式;同时在 option_supportion_checker.cc 中登记该 option 为受支持项,并在 execution_order.cc 中将其加入首个执行点(first EP)的选项集合。

  • 值符号化实现(symbolic_shape_symbolizer.cc: 新增 SymbolizeInputValue,优先使用真实 host 数据(支持 INT32/INT64/UINT32/UINT64,元素数上限 kMaxSymbolizeValueElemNum = 200)生成逐元素符号,无真实数据时回退到 hint value;新增 InputValueElementSource,生成运行时读取 GetGraphInputTensor(idx) 对应元素数值的 source 串。

  • 值依赖输入识别(symbolic_infer_util.cc: 新增 IsValueDependentDataNodeGetValueDependentInputIdxs,通过下游算子的 IsInputDataDependencyop_infer_depends 判定图输入是否"值依赖",并将结果缓存到图 attr _ge_value_dependent_idxs 避免重复计算。

  • JIT 执行路径适配(jit_executor.cc: CopyHostInputsToDevice 新增 keep_on_host_idxs 参数,值依赖的 host 输入不再拷贝到 device;BuildCompileInputs 对已位于 host 的输入跳过重复拷贝;MarkHostTensorOnDataNodes 改为直接基于 ComputeGraph 处理。

  • 测试补充与适配: 新增 UT symbolic_value_inference_unittest.cccompile_path_reshape_with_hint_valueexecute_path_reshape_with_real_data)及 ST test_symbolize_value_and_infer.cc 的 hint value/真实数据用例;JIT 相关用例将 shape 输入由 INT32 调整为 INT64 并置为 host placement,user_graph_manager_unittest.cc 按"值符号化后 reshape 不再切分执行点、host 输入不被重复拷贝"的预期更新。

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

代码审查

Closing Summary

本次审查覆盖全部 14 个变更文件,共报告 6 个问题(P0×3、P2×1、P3×2)。

按文件逐一说明:

  • api/session/jit_execution/exe_points/execution_order.cc — 将 INPUT_HINT_VALUE 加入 kFirstEPOptions,与 INPUT_HINT_SHAPE 处理一致,无问题。
  • api/session/jit_execution/jit_executor.cc3 个 P0 语法错误(第 46 行缺函数体 {;第 168 行 GE_ASSERT_SUCCESS(...) 缺闭合 );;第 175 行 continu 截断,应为 continue;),均经 read_file/grep 双重确认,会导致编译失败;另有 P2CopyHostInputsToDevice 重建 host 保留 tensor 时未拷贝 Placement,可能使 host 输入被误判为 device(置信度 0.4)。
  • base/common/option_supportion_checker/option_supportion_checker.cc — 新增 "ge.inputHintValue" 支持项,与已有 "ge.inputHintShape" 一致,无问题。
  • compiler/api/aclgrph/option_utils.ccParseIndexedListOption 模板化重构与原 ParseHintInputShape 行为一致(顺带修复了旧代码日志缺参问题),ParseHintInputValue/ConstructValueListFromStr 逻辑正确,无问题。
  • compiler/api/aclgrph/option_utils.h — 新增声明,无问题。
  • compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.ccIsValueDependentDataNode 与既有 symbolic_shape_inference.cc 的判定逻辑一致(含 space registry 覆盖),图 attr 缓存无并发风险,无问题。
  • compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.h — 新增声明,无问题。
  • compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_shape_symbolizer.ccP3×2:第 214 行 GELOGI 格式串与实参不匹配(%zu 消费 char*,size 被丢弃);hint value 回退路径缺少元素数/类型校验,可能生成越界读或非法 GetData<>() 源码(低置信度)。
  • compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_shape_symbolizer.h — 新增 InputValueElementSource 声明,无问题。
  • tests/ge/st/testcase/autofuse/test_symbolize_value_and_infer.cc — 新增用例与实现一致,无问题。
  • tests/ge/ut/ge/graph/optimize/symbolic/symbolic_value_inference_unittest.cc(新增)— 用例结构合理,无问题。
  • tests/ge/ut/ge/jit_execution/jit_executor_unittest.cc — shape 输入改 INT64 + host placement,与数据一致,无问题。
  • tests/ge/ut/ge/jit_execution/jit_share_graph.cc — 新增 SetDataNodeDtype 辅助函数,无问题。
  • tests/ge/ut/ge/jit_execution/user_graph_manager_unittest.cc — 按“值符号化后不切分”更新预期,逻辑自洽,无问题。

总体风险判断: 本 PR 的 jit_executor.cc 存在 3 处会导致编译失败的语法错误(P0),在修复前该文件所在的 jit_execution 库无法构建,属于阻断性缺陷;此外 host tensor 保留路径的 placement 处理存在中低置信度的正确性隐患,符号化日志与 hint 校验存在两个低危问题。整体变更需先修复 P0 编译错误后方可合入。

类型 数量
🔴 阻塞 3
🟡 建议 0

⛔ 需要修改

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

/check-pr

likedislike
CANN-robot
CANN-robot成员
1 天前 评论:

The following label is not ready.

approved: Please wait for committers to review the code.

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

/approve

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