已关闭
[ShapeEnv] ignore_fresh_unbacked_symbols 在 v2.7.1 / v2.9.0 / v2.10.0 / v2.11.0 / v2.12.0 / master 上 NPU 适配无需修改说明 #2046
小辉懂编程创建于 5月21日关闭于 8月6日
5月21日 关联了pull request:[Rename] Add TORCH_ prefix for HCCL_ASYNC_ERROR_HANDLING and HCCL_DESYNC_DEBUG env vars
5月21日 关联了pull request:[Rename] Add TORCH_ prefix for HCCL_ASYNC_ERROR_HANDLING and HCCL_DESYNC_DEBUG env vars
此处折叠了10条事件消息 查看更多
5月23日 修改了issue 的描述
小辉懂编程
5月23日 评论:
5月23日 评论:
compile


小辉懂编程
5月23日 评论:
5月23日 评论:
compile


5月24日 关联了pull request:docs: 更新 torch.fx.experimental.symbolic_shapes ShapeEnv API 文档
小辉懂编程
5月25日 评论:
5月25日 评论:
compile


6月2日 关联了pull request:docs: add ShapeEnv API support records to torch-fx.md across 5 version directories
6月2日 关联了pull request:docs: add ShapeEnv API support records to torch-fx.md across 5 version directories
7月8日 关联了看板:MindStudio ISSUE管理
7月28日 添加了label:bot-triaged
TorchNPU-Bot
7月28日 评论:
7月28日 评论:
检测到当前 issue 已关联 PR !36446,自动添加标签:bot-triaged


8月6日 添加了label:resolved
任务 issue
https://gitcode.com/Ascend/pytorch/issues/1626
一、API 功能
API
torch.fx.experimental.symbolic_shapes.ShapeEnv.ignore_fresh_unbacked_symbols功能
ShapeEnv.ignore_fresh_unbacked_symbols是 PyTorch symbolic shapes 机制中ShapeEnv提供的上下文管理接口,用于临时控制 fresh unbacked symbols 的记录行为。该 API 主要用于
FakeTensor、动态 shape、higher order operator schema 推导等场景,在上下文进入和退出时维护ShapeEnv内部pending_fresh_unbacked_symbols状态,保证 symbolic shape 状态管理逻辑正确。核心特性
二、测试用例完备性(多版本)
PyTorch 官方源码中已存在该 API 的测试覆盖,按版本汇总如下:
test/functorch/test_control_flow.py:9130test_cond_gen_schema_symbool_inputs直接使用该上下文管理器test/functorch/test_control_flow.py:9565test/functorch/test_control_flow.py:9495test/test_dynamic_shapes.py:3580test/functorch/test_control_flow.py:10069test/test_dynamic_shapes.py:3722v2.9.0 ~ v2.12.0 官方用例核心逻辑
from torch._subclasses.fake_tensor import FakeTensorMode from torch.fx.experimental.symbolic_shapes import ShapeEnv fake_mode = FakeTensorMode(shape_env=ShapeEnv()) with fake_mode, fake_mode.shape_env.ignore_fresh_unbacked_symbols(): sym_bool = torch.randn(3, 4).nonzero().size(0) == 0 schema = torch.ops.higher_order.cond.gen_schema( sym_bool, lambda x: x.sin(), lambda x: x.cos(), (torch.randn(3, 4),), )该用例验证:
FakeTensorMode下可正常创建ShapeEnv;ignore_fresh_unbacked_symbols上下文可正常进入和退出;SymBool可被higher_order.cond.gen_schema正确识别;因此,该官方用例已经完整覆盖了该 API 的核心行为。
v2.7.1 补充说明
v2.7.1 PyTorch 官方源码中该 API 已存在,但暂无独立官方测试用例。Torch-NPU v2.7.1 自写测试 PR 中包含
test_shape_env_ignore_fresh_unbacked_symbols自写用例覆盖该 API 的基本行为,无需新增 upstream patch。三、API 适配
3.1 API 适配
ShapeEnv.ignore_fresh_unbacked_symbols属于纯框架层 symbolic shape 上下文管理逻辑,与 NPU 后端计算硬件完全解耦。该 API 不涉及:
因此无需对 API 做任何代码层面的修改。
3.2 测试用例适配
官方测试用例无需做任何代码修改,无需新增 NPU 特有逻辑,也无需新增
test_upstreampatch。原因如下:
FakeTensorMode、SymBool和cond.gen_schema的框架层逻辑;ignore_fresh_unbacked_symbols只影响ShapeEnv内部 symbolic state 管理;因此,该 API 属于"PyTorch 有官方用例,NPU 适配不需要做任何修改"的情况。
四、验证结果
验证文件路径(按版本)
test/functorch/test_control_flow.py::test_cond_gen_schema_symbool_inputstest/functorch/test_control_flow.py::test_cond_gen_schema_symbool_inputstest/functorch/test_control_flow.py::test_cond_gen_schema_symbool_inputs、test/test_dynamic_shapes.py相关用例test/test_dynamic_shapes.py、test/functorch/test_control_flow.py相关用例验证执行(v2.9.0 示例)
cd /workspace/user_data/pytorch_official_v2.9.0 python test/functorch/test_control_flow.py -k test_cond_gen_schema_symbool_inputs python test/functorch/test_control_flow.py TestControlFlow.test_cond_gen_schema_symbool_inputs执行结果
结果说明
当前
/workspace/user_data/pytorch_official_v2.X.Y为 PyTorch 官方源码检索目录,并非已完成编译或安装的 PyTorch 运行环境,缺少构建过程中生成的torch.version文件,因此无法直接在该源码目录执行官方测试。该错误发生在
import torch阶段,尚未进入test_cond_gen_schema_symbool_inputs用例逻辑,不属于 API 功能错误,也不属于 NPU 适配问题。本 issue 基于 PyTorch 多版本官方源码用例检索和 API 语义分析,确认该 API 官方已有用例且无需 NPU 侧代码适配。后续以社区审核和 CI 验证结果为准。
五、验证日志说明
如果执行过程中出现 schema、
FakeTensor、symbolic shape 相关日志,但最终测试结果为OK,则属于测试过程中的预期行为,不代表 NPU 适配问题。该测试重点不是验证 NPU 数值计算,而是验证:
ShapeEnv.ignore_fresh_unbacked_symbols上下文管理逻辑;SymBool构造;higher_order.cond.gen_schema对SymBool输入的识别能力。六、验证结论
torch.fx.experimental.symbolic_shapes.ShapeEnv.ignore_fresh_unbacked_symbols在 PyTorch v2.9.0 / v2.10.0 / v2.11.0 / v2.12.0 / master 中均已有官方上游测试覆盖;v2.7.1 中该 API 已存在但官方无独立测试,由 Torch-NPU 自写测试覆盖。该 API 属于设备无关的 symbolic shape 上下文管理接口,官方用例主要验证
FakeTensorMode下SymBool构造与higher_order.cond.gen_schemaschema 推导逻辑,不涉及 NPU 后端特有行为。因此,Torch-NPU 各版本 API 补齐阶段对该 API 无需新增
test_upstreampatch,无需修改 API 实现,仅在本 issue 中统一说明 NPU 适配无需修改。七、关联 PR
按导师"一个版本一个 PR"要求,已将各版本的自写测试 PR 与 upstream patch PR 合并为单 PR。当前活跃 PR 列表如下:
v2.7.1v2.9.0v2.10.0v2.11.0v2.12.0masterPR 内容统一说明:
test/fx/test_symbolic_shapes.py已按 Torch-NPU 测试规范重构:unittest/torch_npu导入与@unittest.skipUnless装饰器;torch.accelerator.current_accelerator()推导device_type,张量统一通过.to(device_type)切到 NPU;self.assert*,无print/try/except;is_accessor_node、is_concrete_int、is_concrete_float、is_concrete_bool、is_symbolic、ShapeEnv.get_pruned_guards、ShapeEnv.ignore_fresh_unbacked_symbols、ShapeEnv.is_unbacked_symint。test_upstream/test/test_proxy_tensor.py.patch)在各 release 版本的官方 PyTorch 源码上 dry-run 通过,覆盖ShapeEnv.produce_guards/ShapeEnv.get_nontrivial_guards。旧 PR(已关闭,仅作历史追溯):