Pull Request已成功合入, 合并人@CANN-robot
(感谢 chengyutao3 的贡献)变更摘要
本次 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.cc和execution_order.cc中分别将其加入受支持的graph_options和kFirstEPOptions,确保选项在首个执行点被处理。 -
抽离通用解析模板
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,确保符号化所需数据在编译期可用。


代码审查
我已完成对所有 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 问题详情
compiler/graph/optimize/symbolic/infer_symbolic_shape/symbolic_infer_util.cc:143— 多余的const_cast:functions与function_new均为const OpImplFunctionsV2 *,IsInputDataDependency是 const 方法,该const_cast完全无必要。直接写function_new = functions;即可。不影响功能,但增加代码阅读理解成本。
整体风险评估
低风险。本次变更新增编译选项 ge.inputHintValue 支持 host tensor 符号化推导,设计合理:真实 host data 优先级高于 hint value;模板抽取 ParseIndexedListOption 复用了解析逻辑且语义正确;IsValueDependentDataNode 同时覆盖了 IsInputDataDependency 和 op_infer_depends 两套机制;InputValueElementSource 为运行时回读提供了源码生成能力。仅存在一个不影响功能的代码风格问题(冗余 const_cast),无正确性/安全/可靠性/回归风险。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 4 |
💬 仅评论


The following label is not ready.
approved: Please wait for committers to review the code.


20260806评审通过


Pull Request
描述
新增编译期选项
ge.inputHintValue(格式如1:[5, 400]),用于在动态 shape 编译时没有真实输入数据的场景下,为"值相关"输入(如 Reshape 的 shape 输入)提供 hint 值,使符号化 shape 推导仍能正常进行。此前仅有ge.inputHintShape提供形状 hint,缺少值 hint 能力。主要变更内容:
选项定义与注册
ge_common_api_types.h:新增常量INPUT_HINT_VALUE = "ge.inputHintValue",并加入ir_builder_suppported_options。option_supportion_checker.cc:将ge.inputHintValue加入受支持的 graph_options。解析逻辑(option_utils.cc/h)
ParseHintInputShape中的内联解析代码抽取为通用模板ParseIndexedListOption(支持index:value分号分隔、index 去重与非负校验),供 shape 和 value 复用。ConstructValueListFromStr(解析[v0,v1,...]列表,值非负)与ParseHintInputValue(输出map<int64_t, vector<int64_t>>)。ParseHintInputShape中max_index的计算逻辑。符号化(symbolic_shape_symbolizer.cc/h)
SymbolizeInputValue:对每个 Data 节点,优先使用真实 host 数据(支持 DT_INT32/INT64/UINT32/UINT64)创建常量符号;无真实数据时回退到 hint value map。InputValueElementSource,生成运行时回读对应 graph 输入指定元素值的源码,保证真实执行时符号值能取到实际值。SYMBOLIZE_VALUE_TYPE_SUM路径增加判断:已符号化过 value 的输入不再重复处理。值相关输入识别(symbolic_infer_util.cc/h)
IsValueDependentDataNode:遍历 Data 输出的消费算子,通过IsInputDataDependency或op_infer_depends属性判断该输入是否依赖数据值(如 Reshape 的 shape 输入)。编译期取宿主数据(jit_executor.cc / execution_order.cc)
GetAllValueDependentData,将"值相关"Data 节点的 index 并入need_host_data_idx,确保编译期以 host tensor 形式提供符号化所需数据。INPUT_HINT_VALUE加入kFirstEPOptions,在首个执行点即处理。测试
symbolic_value_inference_unittest.cc,覆盖"hint value 推导成功"与"真实数据优先于 hint"两条路径。test_symbolize_value_and_infer.cc。jit_executor_unittest.cc/jit_share_graph.cc:将 Reshape 的 shape 输入 data 由 DT_INT32 调整为 DT_INT64,以适配真实 Reshape shape 输入类型。变更类型
请选择本次引入的变更类型:
关联的Issue
无
如何测试
描述测试此变更的步骤和前提条件:
symbolic_value_inference_unittest.cc:验证 hint value 场景下 Reshape 符号化推导成功,以及真实 host data 优先于 hint value。jit_executor_unittest.cc:验证含 Reshape 节点的图在 jit 执行路径下正常编译执行。test_symbolize_value_and_infer.cc中reshape_symbolize_infer_with_input_hint_value:仅配置 hint(1:[5, 400]),验证推导出的输出 shape hint 为 5/400。reshape_symbolize_infer_with_real_data:提供真实 data({100, 20}),验证以真实数据为准。ge.inputHintValue,但有真实 host 输入数据。ge.inputHintValue(如"1:[5, 400]"),无真实输入数据。核对清单
其他信息
在此添加任何其他关于本次 PR 的说明。
设计原则:真实 host data 的优先级高于 hint value,保证编译与真实执行时取到的符号值一致。