已合并
[binary]【PR】: 新增option ge.inputHintValue 支持host tensor 符号化推导 #4251
chengyutao3创建于 8月4日
[binary]【PR】: 新增option ge.inputHintValue 支持host tensor 符号化推导 #4251
已合并
chengyutao3创建于 8月4日
已删除 :develop合入到cann/gedevelop
chengyutao3
chengyutao3成员
8月4日

Pull Request

描述

新增编译期选项 ge.inputHintValue(格式如 1:[5, 400]),用于在动态 shape 编译时没有真实输入数据的场景下,为"值相关"输入(如 Reshape 的 shape 输入)提供 hint 值,使符号化 shape 推导仍能正常进行。此前仅有 ge.inputHintShape 提供形状 hint,缺少值 hint 能力。

主要变更内容:

  1. 选项定义与注册

    • ge_common_api_types.h:新增常量 INPUT_HINT_VALUE = "ge.inputHintValue",并加入 ir_builder_suppported_options
    • option_supportion_checker.cc:将 ge.inputHintValue 加入受支持的 graph_options。
  2. 解析逻辑(option_utils.cc/h)

    • ParseHintInputShape 中的内联解析代码抽取为通用模板 ParseIndexedListOption(支持 index:value 分号分隔、index 去重与非负校验),供 shape 和 value 复用。
    • 新增 ConstructValueListFromStr(解析 [v0,v1,...] 列表,值非负)与 ParseHintInputValue(输出 map<int64_t, vector<int64_t>>)。
    • 顺带修正原 ParseHintInputShapemax_index 的计算逻辑。
  3. 符号化(symbolic_shape_symbolizer.cc/h)

    • 新增 SymbolizeInputValue:对每个 Data 节点,优先使用真实 host 数据(支持 DT_INT32/INT64/UINT32/UINT64)创建常量符号;无真实数据时回退到 hint value map。
    • 新增 InputValueElementSource,生成运行时回读对应 graph 输入指定元素值的源码,保证真实执行时符号值能取到实际值。
    • SYMBOLIZE_VALUE_TYPE_SUM 路径增加判断:已符号化过 value 的输入不再重复处理。
  4. 值相关输入识别(symbolic_infer_util.cc/h)

    • 新增 IsValueDependentDataNode:遍历 Data 输出的消费算子,通过 IsInputDataDependencyop_infer_depends 属性判断该输入是否依赖数据值(如 Reshape 的 shape 输入)。
  5. 编译期取宿主数据(jit_executor.cc / execution_order.cc)

    • 新增 GetAllValueDependentData,将"值相关"Data 节点的 index 并入 need_host_data_idx,确保编译期以 host tensor 形式提供符号化所需数据。
    • INPUT_HINT_VALUE 加入 kFirstEPOptions,在首个执行点即处理。
  6. 测试

    • 新增 UT symbolic_value_inference_unittest.cc,覆盖"hint value 推导成功"与"真实数据优先于 hint"两条路径。
    • 新增 ST 用例 test_symbolize_value_and_infer.cc
    • jit_executor_unittest.cc / jit_share_graph.cc:将 Reshape 的 shape 输入 data 由 DT_INT32 调整为 DT_INT64,以适配真实 Reshape shape 输入类型。

变更类型

请选择本次引入的变更类型:

关联的Issue

如何测试

描述测试此变更的步骤和前提条件:

  1. 编译并运行新增单测:
    • symbolic_value_inference_unittest.cc:验证 hint value 场景下 Reshape 符号化推导成功,以及真实 host data 优先于 hint value。
    • jit_executor_unittest.cc:验证含 Reshape 节点的图在 jit 执行路径下正常编译执行。
  2. 编译并运行新增 ST 用例:
    • test_symbolize_value_and_infer.ccreshape_symbolize_infer_with_input_hint_value:仅配置 hint(1:[5, 400]),验证推导出的输出 shape hint 为 5/400。
    • reshape_symbolize_infer_with_real_data:提供真实 data({100, 20}),验证以真实数据为准。
  3. 手工验证:对含 Reshape(shape 输入为 host 数据)的动态 shape 图分别执行以下配置,确认编译均成功且结果正确:
    • 不设置 ge.inputHintValue,但有真实 host 输入数据。
    • 设置 ge.inputHintValue(如 "1:[5, 400]"),无真实输入数据。

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

设计原则:真实 host data 的优先级高于 hint value,保证编译与真实执行时取到的符号值一致。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 chengyutao3 的贡献)
chengyutao3chengyutao3成员
8月4日 添加了label:enhancement
chengyutao3chengyutao3成员
8月4日 创建了 pull request,commit 7fddf8b4
atomgit-bot
atomgit-bot
8月4日 评论:

变更摘要

本次 PR 新增编译期选项 ge.inputHintValue(格式如 1:[5, 400]),在动态 shape 编译且没有真实输入数据的场景下,为"值相关"输入(如 Reshape 的 shape 输入)提供 hint 值,使符号化 shape 推导仍能正常进行。该选项是对已有 ge.inputHintShape 的补充,填补了值 hint 能力的空白。核心设计原则是:真实 host 数据的优先级高于 hint value,保证编译与执行时的符号值一致。

主要改动

  • 新增选项 ge.inputHintValue 的定义与注册:在 ge_common_api_types.h 中新增常量 INPUT_HINT_VALUE = "ge.inputHintValue" 并加入 ir_builder_suppported_options;在 option_supportion_checker.ccexecution_order.cc 中分别将其加入受支持的 graph_optionskFirstEPOptions,确保选项在首个执行点被处理。

  • 抽离通用解析模板 ParseIndexedListOption 并实现 hint value 解析:将原 ParseHintInputShape 中的 index:value 分号分隔解析逻辑抽取为模板函数,新增 ConstructValueListFromStr 解析 [v0,v1,...] 数值列表,以及 ParseHintInputValue 输出 map<int64_t, vector<int64_t>> 结果;同时修正了原 shape 解析中 max_index 的计算逻辑。

  • 新增符号化值推导 SymbolizeInputValue:在 symbolic_shape_symbolizer.cc 中对每个 Data 节点优先使用真实 host 数据(支持 DT_INT32/INT64/UINT32/UINT64)创建常量符号;无真实数据时回退到 hint value map,并通过新增的 InputValueElementSource 生成运行时回读代码,保证实际执行时能取到真实值。

  • 新增值相关输入识别 IsValueDependentDataNode:在 symbolic_infer_util.cc 中遍历 Data 输出的消费算子,通过 IsInputDataDependency 接口或 op_infer_depends 属性判断该输入是否依赖数据值(如 Reshape 的 shape 输入)。

  • 编译期确保值相关 Data 节点以 host tensor 提供:在 jit_executor.cc 中新增 GetAllValueDependentData,将值相关 Data 节点的 index 并入 need_host_data_idx,确保符号化所需数据在编译期可用。

likedislike
不准确?
atomgit-bot
atomgit-bot
8月4日 评论:

代码审查

我已完成对所有 14 个变更文件的逐一审查。以下是结论:


审查结果汇总

发现的问题

优先级 数量
P0 0
P1 0
P2 0
P3 1

逐文件审查结果

文件 结果
api/session/jit_execution/exe_points/execution_order.cc 无问题 — 仅将 INPUT_HINT_VALUE 加入 kFirstEPOptions,逻辑正确
api/session/jit_execution/jit_executor.cc 无问题 — GetAllValueDependentData 函数设计合理,GetInt 失败时 data_index 保持 -1 被安全跳过
base/common/option_supportion_checker/option_supportion_checker.cc 无问题 — 仅将 "ge.inputHintValue" 加入 graph_options 白名单
compiler/api/aclgrph/option_utils.cc 无问题 — ConstructValueListFromStr / ParseIndexedListOption 模板 / ParseHintInputShape 重构 / ParseHintInputValue 均正确
compiler/api/aclgrph/option_utils.h 无问题 — 仅新增 ParseHintInputValue 声明及 #include <map>
compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.cc 1 个 P3 — 第143行 const_cast 完全冗余(见下)
compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.h 无问题 — 仅新增 IsValueDependentDataNode 声明
compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_shape_symbolizer.cc 无问题 — SymbolizeInputValue 逻辑正确,真实数据优先于 hint,SYMBOLIZE_VALUE_TYPE_SUM 新增 GetSymbolicValue()==nullptr 防护正确
compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_shape_symbolizer.h 无问题 — InputValueElementSource 类定义正确
inc/graph_metadef/external/ge_common/ge_common_api_types.h 无问题 — INPUT_HINT_VALUE 常量定义及在 ir_builder_suppported_options 中注册正确
tests/ge/st/testcase/autofuse/test_symbolize_value_and_infer.cc 无问题 — 两个测试用例覆盖 hint 路径与真实数据路径
tests/ge/ut/ge/graph/optimize/symbolic/symbolic_value_inference_unittest.cc 无问题 — 新增 UT 覆盖两条路径,逻辑与 ST 一致
tests/ge/ut/ge/jit_execution/jit_executor_unittest.cc 无问题 — Reshape shape 输入 DT_INT32→DT_INT64 修正了类型不一致
tests/ge/ut/ge/jit_execution/jit_share_graph.cc 无问题 — SetDataNodeDtype 辅助函数及调用均正确

P3 问题详情

  1. compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.cc:143 — 多余的 const_castfunctionsfunction_new 均为 const OpImplFunctionsV2 *IsInputDataDependency 是 const 方法,该 const_cast 完全无必要。直接写 function_new = functions; 即可。不影响功能,但增加代码阅读理解成本。

整体风险评估

低风险。本次变更新增编译选项 ge.inputHintValue 支持 host tensor 符号化推导,设计合理:真实 host data 优先级高于 hint value;模板抽取 ParseIndexedListOption 复用了解析逻辑且语义正确;IsValueDependentDataNode 同时覆盖了 IsInputDataDependencyop_infer_depends 两套机制;InputValueElementSource 为运行时回读提供了源码生成能力。仅存在一个不影响功能的代码风格问题(冗余 const_cast),无正确性/安全/可靠性/回归风险。

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

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月4日 添加了label:cann-cla/yes
此处折叠了402条消息 查看更多
CANN-robot
CANN-robot成员
8月12日 评论:

The following label is not ready.

approved: Please wait for committers to review the code.

likedislike
chengyutao3
chengyutao3成员
8月12日 评论:

20260806评审通过

likedislike
王涛成员
8月12日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
8月12日 添加了label:approved
CANN-robotCANN-robot成员
8月12日 合入了pull request