已合并
【社区任务】Ascend for PyTorch测试用例解耦(1)交付件 #35
【社区任务】Ascend for PyTorch测试用例解耦(1)交付件 #35
已合并
村雨雨雨创建于 23 天前
共 7 个文件变更+625-0
@@ -0,0 +1,159 @@
1+##############################################################################
2+== A2 / Ascend910B3(torch 2.12.0+cpu + torch_npu 2.12.0) 平台日志汇总(2026-09-14)
3+== 内容:环境自检 / 版本校验 / 目标文件直跑 / 聚合入口 pytest / 聚合入口 unittest / 汇总
4+== 由该环境的原始日志文件逐段拼接而成,未改写任何一行输出
5+##############################################################################
6+ 
7+==============================================================================
8+== 来源:environment.log
9+==============================================================================
10+== collected_at ==
11+2026-09-14T21:38:47+00:00
12+ 
13+== host ==
14+9a7af1eb37dc
15+Linux 9a7af1eb37dc 5.10.0-216.0.0.115.oe2203sp4.aarch64 #1 SMP Thu Jun 27 15:22:10 CST 2024 aarch64 aarch64 aarch64 GNU/Linux
16+ 
17+== npu-smi ==
18++------------------------------------------------------------------------------------------------+
19+| npu-smi 25.2.0 Version: 25.2.0 |
20++---------------------------+---------------+----------------------------------------------------+
21+| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page)|
22+| Chip | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) |
23++===========================+===============+====================================================+
24+| 1 910B3 | OK | 93.3 55 0 / 0 |
25+| 0 | 0000:C2:00.0 | 0 0 / 0 3415 / 65536 |
26++===========================+===============+====================================================+
27++---------------------------+---------------+----------------------------------------------------+
28+| NPU Chip | Process id | Process name | Process memory(MB) |
29++===========================+===============+====================================================+
30+| No running processes found in NPU 1 |
31++===========================+===============+====================================================+
32+ 
33+== python ==
34+Python 3.12.13
35+/workspace/a2_task1_delivery/venv/bin/python
36+ 
37+== torch / torch_npu / hw classification ==
38+torch: 2.12.0+cpu /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch/__init__.py
39+torch_npu: 2.12.0 /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch_npu/__init__.py
40+npu available: True count: 1
41+privateuse1 backend: npu
42+HardwareClassification: ['GENERIC', 'ACCELERATOR', 'CPU', 'CUDA', 'MPS', 'XPU']
43+HardwareClassification.GENERIC = <HardwareClassification.GENERIC: 'generic'> value: generic
44+ 
45+== compat layer ==
46+sitecustomize.py sha256: 0c37e6afe4f9b773a6e1557e2c240d4590f9ccc1bec0a3b4fe06cd5cfe44b696
47+purpose: supply upstream HardwareClassification enum (introduced in torch 2.14.0)
48+ because torch_npu supports at most torch 2.12.0; repo and venv untouched
49+ 
50+==============================================================================
51+== 来源:checkin.log
52+==============================================================================
53+== checkout ==
54+/workspace/a2_task1_delivery/checkout
55+fatal: not a git repository (or any of the parent directories): .git
56+(non-git checkout)
57+ 
58+== target file ==
59+d8898760222c6b51fc3b0febd7fded230674e9822282c9ca2068363fdff97ef9 test/ao/sparsity/test_activation_sparsifier.py
60+git blob : f491d8c9ae70e4b799f277b0a7901c2b86f612b1
61+expected : f491d8c9ae70e4b799f277b0a7901c2b86f612b1 (= pytorch/pytorch main after merge 6996e37e76ee, PR #192479)
62+ 
63+== classification tag ==
64+13: HardwareClassification,
65+47: hw_classification = HardwareClassification.GENERIC
66+ 
67+== test methods ==
68+340: def test_activation_sparsifier(self):
69+count: 1
70+ 
71+==============================================================================
72+== 来源:file_test.log
73+==============================================================================
74+============================= test session starts ==============================
75+platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /workspace/a2_task1_delivery/venv/bin/python
76+cachedir: .pytest_cache
77+hypothesis profile 'default'
78+rootdir: /workspace/a2_task1_delivery/checkout
79+plugins: hypothesis-6.168.0
80+collecting ... collected 1 item
81+ 
82+test/ao/sparsity/test_activation_sparsifier.py::TestActivationSparsifier::test_activation_sparsifier PASSED [100%]
83+ 
84+=============================== warnings summary ===============================
85+../venv/lib/python3.12/site-packages/torch/jit/_script.py:365: 14 warnings
86+ /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch/jit/_script.py:365: DeprecationWarning: `torch.jit.script_method` is deprecated. Please switch to `torch.compile` or `torch.export`.
87+ warnings.warn(
88+ 
89+test/ao/sparsity/test_activation_sparsifier.py::TestActivationSparsifier::test_activation_sparsifier
90+ /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
91+ if self.device.type != 'cpu':
92+ 
93+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
94+======================= 1 passed, 15 warnings in 11.59s ========================
95+ 
96+==============================================================================
97+== 来源:suite_test_pytest.log
98+==============================================================================
99+============================= test session starts ==============================
100+platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /workspace/a2_task1_delivery/venv/bin/python
101+cachedir: .pytest_cache
102+hypothesis profile 'default'
103+rootdir: /workspace/a2_task1_delivery/checkout
104+plugins: hypothesis-6.168.0
105+collecting ... collected 93 items / 92 deselected / 1 selected
106+ 
107+test/test_ao_sparsity.py::TestActivationSparsifier::test_activation_sparsifier <- test/ao/sparsity/test_activation_sparsifier.py PASSED [100%]
108+ 
109+=============================== warnings summary ===============================
110+../venv/lib/python3.12/site-packages/torch/jit/_script.py:365: 14 warnings
111+ /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch/jit/_script.py:365: DeprecationWarning: `torch.jit.script_method` is deprecated. Please switch to `torch.compile` or `torch.export`.
112+ warnings.warn(
113+ 
114+test/test_ao_sparsity.py::TestActivationSparsifier::test_activation_sparsifier
115+ /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
116+ if self.device.type != 'cpu':
117+ 
118+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
119+================ 1 passed, 92 deselected, 15 warnings in 15.14s ================
120+ 
121+==============================================================================
122+== 来源:suite_test_unittest.log
123+==============================================================================
124+test_activation_sparsifier (ao.sparsity.test_activation_sparsifier.TestActivationSparsifier.test_activation_sparsifier)
125+Simulates the workflow of the activation sparsifier, starting from object creation ... /workspace/a2_task1_delivery/venv/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
126+ if self.device.type != 'cpu':
127+ok
128+ 
129+----------------------------------------------------------------------
130+Ran 1 test in 3.284s
131+ 
132+OK
133+ 
134+==============================================================================
135+== 来源:summary.txt
136+==============================================================================
137+结果汇总 [A2] 2026-09-14T21:39:41+00:00
138+checkout : /workspace/a2_task1_delivery/checkout
139+python : /workspace/a2_task1_delivery/venv/bin/python
140+target : test/ao/sparsity/test_activation_sparsifier.py (blob must equal f491d8c9ae70e4b799f277b0a7901c2b86f612b1)
141+1) pytest 目标用例直跑 : exit=0 1 passed, 15 warnings in 11.59s
142+2) pytest 聚合入口 : exit=0 1 passed, 92 deselected, 15 warnings in 15.14s
143+3) unittest 聚合入口 : exit=0 Ran 1 test in 3.284s OK_line=1
144+结论: ALL PASS [A2]
145+ 
146+==============================================================================
147+== 来源:summary.json
148+==============================================================================
149+{
150+ "label": "A2",
151+ "collected_at": "2026-09-14T21:39:41+00:00",
152+ "checkout": "/workspace/a2_task1_delivery/checkout",
153+ "python": "/workspace/a2_task1_delivery/venv/bin/python",
154+ "target": "test/ao/sparsity/test_activation_sparsifier.py",
155+ "expected_blob": "f491d8c9ae70e4b799f277b0a7901c2b86f612b1",
156+ "compat_layer": "PYTHONPATH sitecustomize.py supplying the upstream HardwareClassification enum (torch >= 2.14.0 API); repo and venv unmodified",
157+ "exit_codes": {"pytest_file": 0, "pytest_suite": 0, "unittest_suite": 0},
158+ "all_pass": true
159+}
@@ -0,0 +1,158 @@
1+##############################################################################
2+== A5 / 950PR(torch 2.12.0+cpu + torch_npu 2.12.0) 平台日志汇总(2026-09-14)
3+== 内容:环境自检 / 版本校验 / 目标文件直跑 / 聚合入口 pytest / 聚合入口 unittest / 汇总
4+== 由该环境的原始日志文件逐段拼接而成,未改写任何一行输出
5+##############################################################################
6+ 
7+==============================================================================
8+== 来源:environment.log
9+==============================================================================
10+== collected_at ==
11+2026-09-14T21:51:42+00:00
12+ 
13+== host ==
14+da01a9cb91f8
15+Linux da01a9cb91f8 6.6.0-132.0.0.111.oe2403sp3.x86_64 #1 SMP Mon Dec 29 23:07:38 CST 2025 x86_64 x86_64 x86_64 GNU/Linux
16+ 
17+== npu-smi ==
18++-------------------------------------------------------------------------------------------------+
19+| npu-smi 25.7.rc1.6 Version: 25.7.rc1.6 |
20++--------+------------------+---------------+-----------------------------------------------------+
21+| NPU ID | Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
22+| | | Bus-Id | NPU Util(%) Memory-Usage(MB) HBM-Usage(MB) |
23++========+==================+===============+=====================================================+
24+| 0 | Ascend950PR | OK | 214.1 67 0 / 0 |
25+| | | 0000:0D:00.0 | 0 0 / 0 5239 / 131072 |
26++========+==================+===============+=====================================================+
27++---------------------------+---------------+-----------------------------------------------------+
28+| NPU ID | Process id | Process name | Process memory(MB) |
29++===========================+===============+=====================================================+
30+| No running processes found in NPU 0 |
31++===========================+===============+=====================================================+
32+ 
33+== python ==
34+Python 3.12.13
35+/workspace/user_data/venvs/v212_x86/bin/python
36+ 
37+== torch / torch_npu / hw classification ==
38+torch: 2.12.0+cpu /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch/__init__.py
39+torch_npu: 2.12.0 /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch_npu/__init__.py
40+npu available: True count: 1
41+privateuse1 backend: npu
42+HardwareClassification: ['GENERIC', 'ACCELERATOR', 'CPU', 'CUDA', 'MPS', 'XPU']
43+HardwareClassification.GENERIC = <HardwareClassification.GENERIC: 'generic'> value: generic
44+ 
45+== compat layer ==
46+sitecustomize.py sha256: 0c37e6afe4f9b773a6e1557e2c240d4590f9ccc1bec0a3b4fe06cd5cfe44b696
47+purpose: supply upstream HardwareClassification enum (introduced in torch 2.14.0)
48+ because torch_npu supports at most torch 2.12.0; repo and venv untouched
49+ 
50+==============================================================================
51+== 来源:checkin.log
52+==============================================================================
53+== checkout ==
54+/workspace/task1_delivery/checkout
55+7d4b8d5f1331f9f3561609b8b3e330d3d5ea3e61 Mon Sep 14 21:51:30 2026 +0000 checkout: pin test/ao/sparsity + test_ao_sparsity.py to upstream main 6996e37
56+ 
57+== target file ==
58+d8898760222c6b51fc3b0febd7fded230674e9822282c9ca2068363fdff97ef9 test/ao/sparsity/test_activation_sparsifier.py
59+git blob : f491d8c9ae70e4b799f277b0a7901c2b86f612b1
60+expected : f491d8c9ae70e4b799f277b0a7901c2b86f612b1 (= pytorch/pytorch main after merge 6996e37e76ee, PR #192479)
61+ 
62+== classification tag ==
63+13: HardwareClassification,
64+47: hw_classification = HardwareClassification.GENERIC
65+ 
66+== test methods ==
67+340: def test_activation_sparsifier(self):
68+count: 1
69+ 
70+==============================================================================
71+== 来源:file_test.log
72+==============================================================================
73+============================= test session starts ==============================
74+platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /workspace/user_data/venvs/v212_x86/bin/python
75+cachedir: .pytest_cache
76+hypothesis profile 'default'
77+rootdir: /workspace/task1_delivery/checkout
78+plugins: hypothesis-6.168.0
79+collecting ... collected 1 item
80+ 
81+test/ao/sparsity/test_activation_sparsifier.py::TestActivationSparsifier::test_activation_sparsifier PASSED [100%]
82+ 
83+=============================== warnings summary ===============================
84+../../user_data/venvs/v212_x86/lib/python3.12/site-packages/torch/jit/_script.py:365: 14 warnings
85+ /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch/jit/_script.py:365: DeprecationWarning: `torch.jit.script_method` is deprecated. Please switch to `torch.compile` or `torch.export`.
86+ warnings.warn(
87+ 
88+test/ao/sparsity/test_activation_sparsifier.py::TestActivationSparsifier::test_activation_sparsifier
89+ /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
90+ if self.device.type != 'cpu':
91+ 
92+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
93+======================= 1 passed, 15 warnings in 27.43s ========================
94+ 
95+==============================================================================
96+== 来源:suite_test_pytest.log
97+==============================================================================
98+============================= test session starts ==============================
99+platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /workspace/user_data/venvs/v212_x86/bin/python
100+cachedir: .pytest_cache
101+hypothesis profile 'default'
102+rootdir: /workspace/task1_delivery/checkout
103+plugins: hypothesis-6.168.0
104+collecting ... collected 105 items / 104 deselected / 1 selected
105+ 
106+test/test_ao_sparsity.py::TestActivationSparsifier::test_activation_sparsifier <- test/ao/sparsity/test_activation_sparsifier.py PASSED [100%]
107+ 
108+=============================== warnings summary ===============================
109+../../user_data/venvs/v212_x86/lib/python3.12/site-packages/torch/jit/_script.py:365: 14 warnings
110+ /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch/jit/_script.py:365: DeprecationWarning: `torch.jit.script_method` is deprecated. Please switch to `torch.compile` or `torch.export`.
111+ warnings.warn(
112+ 
113+test/test_ao_sparsity.py::TestActivationSparsifier::test_activation_sparsifier
114+ /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
115+ if self.device.type != 'cpu':
116+ 
117+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
118+=============== 1 passed, 104 deselected, 15 warnings in 23.68s ================
119+ 
120+==============================================================================
121+== 来源:suite_test_unittest.log
122+==============================================================================
123+test_activation_sparsifier (ao.sparsity.test_activation_sparsifier.TestActivationSparsifier.test_activation_sparsifier)
124+Simulates the workflow of the activation sparsifier, starting from object creation ... /workspace/user_data/venvs/v212_x86/lib/python3.12/site-packages/torch_npu/utils/storage.py:55: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
125+ if self.device.type != 'cpu':
126+ok
127+ 
128+----------------------------------------------------------------------
129+Ran 1 test in 1.662s
130+ 
131+OK
132+ 
133+==============================================================================
134+== 来源:summary.txt
135+==============================================================================
136+结果汇总 [950PR] 2026-09-14T21:54:05+00:00
137+checkout : /workspace/task1_delivery/checkout
138+python : /workspace/user_data/venvs/v212_x86/bin/python
139+target : test/ao/sparsity/test_activation_sparsifier.py (blob must equal f491d8c9ae70e4b799f277b0a7901c2b86f612b1)
140+1) pytest 目标用例直跑 : exit=0 1 passed, 15 warnings in 27.43s
141+2) pytest 聚合入口 : exit=0 1 passed, 104 deselected, 15 warnings in 23.68s
142+3) unittest 聚合入口 : exit=0 Ran 1 test in 1.662s OK_line=1
143+结论: ALL PASS [950PR]
144+ 
145+==============================================================================
146+== 来源:summary.json
147+==============================================================================
148+{
149+ "label": "950PR",
150+ "collected_at": "2026-09-14T21:54:05+00:00",
151+ "checkout": "/workspace/task1_delivery/checkout",
152+ "python": "/workspace/user_data/venvs/v212_x86/bin/python",
153+ "target": "test/ao/sparsity/test_activation_sparsifier.py",
154+ "expected_blob": "f491d8c9ae70e4b799f277b0a7901c2b86f612b1",
155+ "compat_layer": "PYTHONPATH sitecustomize.py supplying the upstream HardwareClassification enum (torch >= 2.14.0 API); repo and venv unmodified",
156+ "exit_codes": {"pytest_file": 0, "pytest_suite": 0, "unittest_suite": 0},
157+ "all_pass": true
158+}
@@ -0,0 +1,308 @@
1+# `test/ao/sparsity/test_activation_sparsifier.py` 测试用例硬件解耦交付报告
2+ 
3+开发者:GitHub `CunYuawa` / GitCode `CunYuawa`。整理日期:2026-09-14;2026-09-17 按《PyTorch社区测试用例解耦开发指导书》(最后保存 2026-09-17)对齐目录命名、文件结构与章节模板。
4+ 
5+本报告对应 PyTorch 上游 PR [#192479](https://github.com/pytorch/pytorch/pull/192479),该变更已于 2026-09-14 05:49:13 UTC 合入上游 `main`(提交 [`6996e37e76ee`](https://github.com/pytorch/pytorch/commit/6996e37e76eef5c0b5dcf643e8298fb92a4c47ba))。最终合入版本按指导书**场景三「无需解耦改造,补充语义标签」**提交:仅为 `TestActivationSparsifier` 增加 `HardwareClassification.GENERIC` 类属性,**+3/−0**,未改动任何测试逻辑。
6+ 
7+> **950PR 侧已按最终合入版本完成复跑留证(2026-09-14)**,在真实昇腾 NPU 栈上三个入口全部 `exit=0`,见 4.3 / 4.4 节。
8+> **A2(910B3)侧已按最终合入版本完成复跑留证(2026-09-14)**,三入口 exit=0,另附 2.12.0+cpu + torch_npu 2.12.0(NPU available=True count: 1)环境自检,见 4.3 / 4.5 节。
9+ 
10+## 1. 背景
11+ 
12+- 任务来源:Ascend for PyTorch 社区任务「测试用例解耦(1)」,GitCode issue [Ascend/pytorch-ecosystem#1](https://gitcode.com/Ascend/pytorch-ecosystem/issues/1)。
13+- 目标文件:`test/ao/sparsity/test_activation_sparsifier.py`。
14+- 涉及模块:`torch.ao.pruning._experimental.activation_sparsifier`(激活稀疏化:激活统计聚合、mask 生成、模型前向行为校验)。
15+- 任务类型:用例硬件解耦(本用例结论为**无需代码改造**,仅补充硬件分类语义标签)。
16+- 问题描述:`TestActivationSparsifier` 为单用例测试类,既无 `cuda` 硬编码字符串与设备实例、无 CUDA 专属装饰器、无写死 CUDA 的算子与张量,也无 CUDA 专属判断分支;张量在 CPU 上创建,对执行设备无强绑定。按指导书判定属于「无需解耦改造」,缺的是可供上下游按硬件分类筛选的 `hw_classification` 标注,因此本任务以补充 `GENERIC` 分类标签收口。
17+ 
18+## 2. 方案
19+ 
20+方案概述:按上游 `docs/source/accelerator/testing.md` 的硬件分类规范,为该测试类补充类属性 `hw_classification = HardwareClassification.GENERIC`(并导入该枚举),使其在设备无关用例集合中可被正确归类与筛选;**不改变测试逻辑、不改变用例集合、不引入设备参数化**。
21+ 
22+| 仓库 | 文件 | 变更说明 |
23+| --- | --- | --- |
24+| `pytorch/pytorch` | `test/ao/sparsity/test_activation_sparsifier.py` | 导入 `HardwareClassification`,为 `TestActivationSparsifier` 增加类属性 `hw_classification = HardwareClassification.GENERIC`。 |
25+ 
26+上游合入差异为新增 3 行、删除 0 行:
27+ 
28+```diff
29+ from torch.testing._internal.common_utils import (
30++ HardwareClassification,
31+ raise_on_run_directly,
32+ skipIfTorchDynamo,
33+ TestCase,
34+@@ class TestActivationSparsifier(TestCase):
35++ hw_classification = HardwareClassification.GENERIC
36++
37+ def _check_constructor(self, activation_sparsifier, model, defaults, sparse_config):
38+```
39+ 
40+保留的测试方法(未新增、未删除、未重命名):
41+ 
42+1. `TestActivationSparsifier.test_activation_sparsifier`
43+ 
44+### 2.1 方案取舍说明(过程记录)
45+ 
46+早期方案(v2)尝试把该类按设备类型参数化,派生 `TestActivationSparsifierCPU` 与 `TestActivationSparsifierPRIVATEUSE1` 两个变体。该方案在 950PR 环境暴露 `RuntimeError: legacy constructor expects device type: cpu but device type: npu was passed`(`test/ao/sparsity/test_activation_sparsifier.py` 内 `hook()` 用 `torch.Tensor(...)` 旧式构造器承接 NPU 张量),且属于"改变社区用例结构"的重改造。经与上游评审对齐后**回退为最小改动**:仅补充 `GENERIC` 语义标签,保持社区原有执行逻辑与用例数量不变。最终合入的就是这一最小改动。
47+ 
48+## 3. PR
49+ 
50+### 3.1 社区接纳标准
51+ 
52+| 状态 | 判定依据 |
53+| --- | --- |
54+| 已合入(Merged) | PR 状态为 merged,commit 已进入 PyTorch 主分支 |
55+| 已批准(Approved) | 至少一位 PyTorch Maintainer 给出 Approved review,PR 等待合并 |
56+| 不满足以上任一条件 | 不视为被社区接纳 |
57+ 
58+### 3.2 社区 PR 清单
59+ 
60+| PR | 标题 | 状态 | 判定依据 |
61+| --- | --- | --- | --- |
62+| [pytorch/pytorch#192479](https://github.com/pytorch/pytorch/pull/192479) | [Testcase Refactoring] Annotate TestActivationSparsifier with HardwareClassification.GENERIC | 已合入 | 2026-09-14 05:49:13 UTC,合入提交 [`6996e37e76ee`](https://github.com/pytorch/pytorch/commit/6996e37e76eef5c0b5dcf643e8298fb92a4c47ba),提交信息内嵌 `(#192479)`,`main` 上目标文件 blob 与 PR 版本一致。 |
63+ 
64+- PR 作者:`CunYuawa`;创建 2026-08-07 08:18:15 UTC;单文件改动 +3/−0。
65+- 评审记录:华为 SE `xuyun44`、Maintainer `fffrog` 均已 Approve(见 PR 页面的 Reviewers 区)。
66+- 说明:GitHub REST 对已 squash 合入的 PR 返回 `state=closed`、`merged=false`;本报告以 `main` 上的提交记录与目标文件 blob 为准。
67+ 
68+#### 社区 CI(执行记录)
69+ 
70+读取 PR head(`b851c42b7e478f4a5496b21ed8e356d5ce10b84b`)的全部检查记录共 **320 项**:`success` 315、`skipped` 4、`neutral` 1,**无 failure、无未完成项**。逐项检查记录见 [PR Checks](https://github.com/pytorch/pytorch/pull/192479/checks) 与 [PyTorch HUD](https://hud.pytorch.org/pr/192479)。
71+ 
72+### 3.3 torch_npu 同步变更
73+ 
74+无需。最终变更仅为上游测试类新增硬件分类元数据,不引入新设备接口,不替换或删除 `torch_npu` 补丁。
75+ 
76+(本节另附一条与 torch_npu 相关的观察,供组织方参考:`torch_npu` 目前最高支持 torch 2.12.0,而
77+`HardwareClassification` 自 torch 2.14.0 才引入,**二者在同一环境无法共存**,2026-09-14 在 950PR 上实测:
78+ 
79+- torch 2.12.0+cpu + torch_npu 2.12.0:`from torch.testing._internal.common_utils import HardwareClassification`
80+ 直接 `ImportError`(核对上游源码:v2.12.0 / v2.12.1 / v2.13.0 均无该枚举,v2.14.0 / main 有);
81+- torch 2.14.0+cpu 环境强行 `pip install torch_npu==2.12.0 --no-deps` 后,`import torch` 报
82+ `RuntimeError: Failed to load the backend extension: torch_npu.`(C++ ABI 不匹配;探测后已卸载,环境恢复为纯上游 torch 2.14.0+cpu)。
83+ 
84+这不影响本任务交付(本任务需要的只是测试类元数据),但会影响后续所有“打分类标签”类任务
85+的昇腾侧取证方式,建议统一说明。)
86+ 
87+## 4. 验证结果
88+ 
89+本章为 A2(Ascend910B3)与 A5(950PR)两套硬件的最终结果,验证对象均为上游合入后的 `main` 版本。
90+ 
91+### 4.1 运行结果汇总
92+ 
93+| 硬件平台 | 涉及用例数 | 通过 | 失败 | 跳过 | 结论 |
94+| --- | --- | --- | --- | --- | --- |
95+| A2(Ascend910B3,openEuler 22.03 SP4 aarch64) | 1 | 1 | 0 | 0 | 通过 |
96+| A5(950PR,openEuler 24.03 SP3 x86_64) | 1 | 1 | 0 | 0 | 通过 |
97+ 
98+- 验证对象为上游 `main` 合入版本(目标文件 git blob `f491d8c9ae70e4b799f277b0a7901c2b86f612b1`),
99+ 两个平台均实测通过,三个入口(目标文件直跑 / 聚合入口 pytest / 聚合入口 unittest)`exit=0`。
100+ 
101+### 4.2 验证环境
102+ 
103+| 环境项 | A2 / Ascend910B3 | A5 / 950PR |
104+| --- | --- | --- |
105+| 硬件 | Ascend910B3(`npu-smi 25.2.0`,Health OK) | Ascend950PR(`npu-smi 25.7.rc1.6`,Health OK,HBM 131072 MB) |
106+| 主机 / OS | 容器 `9a7af1eb37dc`,openEuler 22.03 SP4,aarch64 | 容器 `da01a9cb91f8`,openEuler 24.03 SP3,x86_64 |
107+| Python | 3.12.13 | 3.12.13 |
108+| PyTorch | 2.12.0+cpu | 2.12.0+cpu |
109+| torch_npu | 2.12.0(`torch.npu.is_available() == True`,count=1,privateuse1=npu) | 2.12.0(同上) |
110+| CANN | 未随环境日志采集(可执行 `cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg` 补充) | 同左 |
111+ 
112+运行命令见 4.4 / 4.5 节;原始日志见 `log/A2-test_activation_sparsifier.log`、
113+`log/A5-test_activation_sparsifier.log`(各自含环境自检、版本校验、三个入口与汇总的完整输出)。
114+ 
115+### 4.3 平台验证明细(A2 / A5)
116+ 
117+| 平台 | 环境 | 验证项 | 结果 | 日志 |
118+| --- | --- | --- | --- | --- |
119+| A5(Ascend950PR,openEuler 24.03 SP3 x86_64) | torch 2.12.0+cpu + torch_npu 2.12.0(NPU available=True,count=1,privateuse1=npu) | 目标文件 `pytest -vv -ra` | **`1 passed`(27.43 s),exit=0** | `log/A5-test_activation_sparsifier.log` |
120+| A5 | 同上 | 聚合入口 `pytest test/test_ao_sparsity.py -k activation_sparsifier` | **`1 passed, 104 deselected`,exit=0** | `log/A5-test_activation_sparsifier.log` |
121+| A5 | 同上 | 聚合入口 `python test/test_ao_sparsity.py -k activation_sparsifier -v` | **`Ran 1 test in 1.662s` … `OK`,exit=0** | `log/A5-test_activation_sparsifier.log` |
122+| A5 | 同上 | 环境自检 | Ascend950PR Health OK;torch_npu 2.12.0;NPU available=True | `log/A5-test_activation_sparsifier.log` |
123+| A5 | 同上 | 目标文件版本校验 | git blob `f491d8c9ae70e4b799f277b0a7901c2b86f612b1` = 上游 `main` 合入后同值 | `log/A5-test_activation_sparsifier.log` |
124+| A2(Ascend910B3,openEuler 22.03 SP4 aarch64) | 最终合入版本复跑:torch 2.12.0+cpu + torch_npu 2.12.0(NPU available=True count: 1,privateuse1=npu) | 环境自检 + 目标文件版本校验(blob f491d8c9ae70) | Ascend910B3 Health OK(npu-smi 25.2.0);1 个用例方法;blob 与上游 `6996e37e76ee` 一致 | `log/A2-test_activation_sparsifier.log` |
125+| A2 | 同上 | 目标文件 `pytest -vv -ra` | **`1 passed, 15 warnings in 11.59s`,exit=0** | `log/A2-test_activation_sparsifier.log` |
126+| A2 | 同上 | 聚合入口 `pytest test/test_ao_sparsity.py -k activation_sparsifier` | **`1 passed, 92 deselected, 15 warnings in 15.14s`,exit=0** | `log/A2-test_activation_sparsifier.log` |
127+| A2 | 同上 | 聚合入口 `python test/test_ao_sparsity.py -k activation_sparsifier -v` | **`Ran 1 test in 3.284s` … `OK`,exit=0** | `log/A2-test_activation_sparsifier.log` |
128+ 
129+**结论**:A2(Ascend910B3)与 A5(950PR)两个平台的全部验证项均通过。
130+本用例归类为 `GENERIC`(CPU-only),NPU 环境可识别不等于其执行 NPU 算子内核;平台日志用于证明用例在
131+昇腾环境下可被正确收集与执行。
132+ 
133+### 4.4 950PR 复跑环境与命令(2026-09-14)
134+ 
135+| 环境项 | 内容 |
136+| --- | --- |
137+| 硬件 | Ascend 950PR(`npu-smi 25.7.rc1.6`,Health OK,HBM 131072 MB) |
138+| 主机 | 容器 `da01a9cb91f8`,openEuler 24.03 SP3,x86_64 |
139+| Python | 3.12.13,venv `/workspace/user_data/venvs/v212_x86` |
140+| torch / torch_npu | **2.12.0+cpu / 2.12.0**(`torch.npu.is_available() == True`,count=1) |
141+| 兼容层 | 需要:临时补齐缺失枚举,内容见 4.9 节 |
142+| 检出 | `/workspace/task1_delivery/checkout`:`test/test_ao_sparsity.py` 与 `test/ao/sparsity/*` 共 12 个文件,逐文件 git blob 已与上游 `6996e37e76ee` 对齐 |
143+ 
144+```bash
145+# 0) 环境自检
146+npu-smi info | head -20
147+python -c "import torch, torch_npu; print(torch.__version__, torch_npu.__version__, torch.npu.is_available(), torch.npu.device_count())"
148+python -c "from torch.testing._internal.common_utils import HardwareClassification as H; print([m.name for m in H])"
149+ 
150+# 1) 目标文件版本校验:git blob 必须等于 f491d8c9ae70e4b799f277b0a7901c2b86f612b1
151+git hash-object test/ao/sparsity/test_activation_sparsifier.py
152+grep -n "hw_classification" test/ao/sparsity/test_activation_sparsifier.py
153+ 
154+# 2) 目标文件直跑
155+python -m pytest test/ao/sparsity/test_activation_sparsifier.py -vv -ra
156+ 
157+# 3) 聚合入口(上游 CI 同款)
158+python -m pytest test/test_ao_sparsity.py -k activation_sparsifier -vv -ra
159+python test/test_ao_sparsity.py -k activation_sparsifier -v
160+```
161+ 
162+上述命令当时封装为一个顺序脚本(未随交付件提交)按「环境自检 → 版本校验 → 三个入口 → 汇总」执行,
163+输出到 `/workspace/task1_delivery/log/<平台>_<时间戳>/`,含 `environment.log`、`checkin.log`、`file_test.log`、
164+`suite_test_pytest.log`、`suite_test_unittest.log`、`summary.txt`、`summary.json`。
165+ 
166+执行记录:
167+ 
168+| 平台 | 执行方式 | 证据目录 |
169+| --- | --- | --- |
170+| A5 | 挂兼容层执行本节命令(`PYTHONPATH=/workspace/task1_delivery/compat`,`PYTHON=/workspace/user_data/venvs/v212_x86/bin/python`) | `log/A5-test_activation_sparsifier.log` |
171+ 
172+### 4.5 A2(910B3)侧复跑命令(已完成,2026-09-14)
173+ 
174+A2 侧与 A5(950PR)的唯一差别是运行库:A2 现成环境已是 torch 2.12.0+cpu + torch_npu 2.12.0,
175+因此**同样需要**在 `PYTHONPATH` 上挂兼容层(内容见 4.9 节,原因见 4.7 节)。命令:
176+ 
177+```bash
178+# 0) 环境自检
179+npu-smi info | head -20
180+python -c "import torch, torch_npu; print(torch.__version__, torch_npu.__version__, torch.npu.is_available(), torch.npu.device_count())"
181+ 
182+# 1) 目标文件版本校验(blob 必须等于 f491d8c9ae70e4b799f277b0a7901c2b86f612b1)
183+git hash-object test/ao/sparsity/test_activation_sparsifier.py
184+ 
185+# 2) 执行 4.4 节的三个入口,统一前缀:
186+PYTHONPATH=<兼容层目录> PYTHON=<该环境 python>
187+```
188+ 
189+实际执行(隧道端口 2223,容器 `9a7af1eb37dc`):
190+ 
191+```bash
192+PYTHONPATH=/workspace/a2_task1_delivery/compat \
193+PYTHON=/workspace/a2_task1_delivery/venv/bin/python \
194+ # 随后按 4.4 节第 2、3 条命令逐个执行(目标文件直跑 / 聚合 pytest / 聚合 unittest)
195+```
196+ 
197+结果:见 `log/A2-test_activation_sparsifier.log`(环境自检、版本校验、三个入口与汇总),三个入口 exit 均为 0,汇总记录 `all_pass=true`;截图归档为 `screenshots/A2-environment.png`、`screenshots/A2-test_activation_sparsifier.png`。
198+ 
199+A2 的容器与登录方式见《华为双环境链接》手册(隧道端口 2223)。
200+ 
201+### 4.6 历史平台记录(仅过程追溯,不构成最终版本证据;该阶段日志未随交付件提交)
202+ 
203+2026-08-12 针对**早期设备参数化版本(v2)**的验证已经完成,供过程追溯:
204+ 
205+| 平台 | 验证内容 | 结果 |
206+| --- | --- | --- |
207+| A2(910B3) | 环境探测 | torch 2.12.0+cpu / torch_npu 2.12.0 / NPU available=True / count=1 |
208+| A2(910B3) | 基线(未改造) | `Ran 1 test ... OK` |
209+| A2(910B3) | 改造后(CPU + PRIVATEUSE1 变体) | `Ran 2 tests ... OK`(5.1s→17.7s) |
210+| 950PR | 改造后(CPU + PRIVATEUSE1 变体) | 首次 `FAILED (errors=1)`:`legacy constructor expects device type: cpu but device type: npu was passed`;修正后 `Ran 2 tests ... OK` |
211+| 本机 CPU(aarch64) | 基线 / v2 改造后 | `Ran 1 test ... OK` / `Ran 1 test ... OK` |
212+ 
213+此外,2026-09-14 首次复跑时曾用 torch 2.7.1 + 只读 shim 产出过一版记录(`1 passed`),
214+该记录已被 4.3 节的正式复跑记录取代(运行库更新为 torch 2.12.0 + torch_npu 2.12.0,兼容层收敛为"仅补缺失枚举")。
215+ 
216+该记录同时说明:**设备参数化路线在 950PR 上会失败**,这是最终改用"仅打标签"方案的直接依据;对应失败现象已在 2.1 节说明。
217+ 
218+### 4.7 说明
219+ 
220+- 本报告所用兼容层只做一件事:向 `torch.testing._internal.common_utils` 补上缺失的 `HardwareClassification`
221+ 枚举(取值逐字取自上游 v2.14.0)。**未修改**被检出的 PyTorch 仓库、**未修改** venv 内任何文件、**未改动**目标用例代码。
222+- 验证分别在 950PR(x86_64)与 A2(910B3,aarch64)两台机器上完成。
223+ 
224+### 4.8 失败分析
225+ 
226+无。两个平台的三个入口均无失败、无错误、无跳过用例,故不填写失败用例表。
227+(早期未被采纳的 v2 设备参数化版本在 950PR 上出现过
228+`RuntimeError: legacy constructor expects device type: cpu but device type: npu was passed`,
229+属过程记录,见 2.1 / 4.6 节,不影响最终合入版本。)
230+ 
231+### 4.9 附:昇腾侧复跑所需的最小兼容层(内联)
232+ 
233+`HardwareClassification` 自 torch 2.14.0 才提供,而 torch_npu 当前最高支持 torch 2.12.0(见 3.3 节),
234+因此在**真实昇腾 NPU 栈**上验证时,用 `PYTHONPATH` 注入下面这个 `sitecustomize.py` 补齐缺失枚举
235+(取值逐字取自上游 v2.14.0)。它**不修改**被检出的 PyTorch 仓库、**不修改** venv 内任何文件、
236+**不改动**目标用例代码。
237+ 
238+```python
239+import builtins
240+from enum import Enum
241+ 
242+ 
243+class HardwareClassification(Enum):
244+ GENERIC = "generic"
245+ ACCELERATOR = "accelerator"
246+ CPU = "cpu"
247+ CUDA = "cuda"
248+ MPS = "mps"
249+ XPU = "xpu"
250+ 
251+ 
252+_orig_import = builtins.__import__
253+ 
254+ 
255+def _patched_import(name, *args, **kwargs):
256+ mod = _orig_import(name, *args, **kwargs)
257+ if name == "torch.testing._internal.common_utils" and not hasattr(
258+ mod, "HardwareClassification"
259+ ):
260+ mod.HardwareClassification = HardwareClassification
261+ return mod
262+ 
263+ 
264+builtins.__import__ = _patched_import
265+```
266+ 
267+用法:把上面的代码保存为 `<任意目录>/sitecustomize.py`,然后按 4.4 / 4.5 节命令执行,
268+并在命令前加 `PYTHONPATH=<该目录>`。
269+ 
270+## 5. 源码一致性记录
271+ 
272+对改动前后完整文件执行 Python AST 比对(机器检查,结果如下):
273+ 
274+| 检查项 | 结果 |
275+| --- | --- |
276+| 测试方法数 | 1 → 1(一致) |
277+| 剔除 `hw_classification` 赋值与 `HardwareClassification` 导入后 AST 是否一致 | 一致(`True`) |
278+| 分类标签 | `None` → `HardwareClassification.GENERIC` |
279+| 文件 blob | `9279ab41065916fbdf50793fc912e7bc57345015` → `f491d8c9ae70e4b799f277b0a7901c2b86f612b1` |
280+| 合并后 `main` 文件 blob | `f491d8c9ae70e4b799f277b0a7901c2b86f612b1`(与合入版本一致) |
281+ 
282+## 6. 交付物清单
283+ 
284+| 路径 | 说明 |
285+| --- | --- |
286+| `test_activation_sparsifier解耦交付报告.md` | 本交付报告(过程证据已归纳进正文:2 / 3.2 / 3.3 / 4.9 / 5 节) |
287+| `log/A2-test_activation_sparsifier.log` | A2(Ascend910B3)平台日志:环境自检 + 版本校验 + 三个入口 + 汇总 |
288+| `log/A5-test_activation_sparsifier.log` | A5(950PR)平台日志:环境自检 + 版本校验 + 三个入口 + 汇总 |
289+| `screenshots/A2-environment.png`、`screenshots/A2-test_activation_sparsifier.png` | A2 环境自检图 / 目标用例通过图 |
290+| `screenshots/A5-environment.png`、`screenshots/A5-test_activation_sparsifier.png` | A5 环境自检图 / 目标用例通过图 |
291+ 
292+> **目录结构说明**:按指导书的固定结构提交,仅含「交付报告 + `log/` + `screenshots/`」。
293+> 上游 CI 逐项结果、AST 一致性检查、合入补丁与前后快照、复跑脚本等过程材料已归纳到本报告正文,
294+> 不再单独随包提交;完整逐项 CI 记录可在上游 PR 页面查阅。
295+>
296+> **截图来源说明**:昇腾环境为纯 SSH 容器、无图形会话,本目录 PNG 依据**真实运行日志**逐行渲染生成
297+> (终端等价渲染,未改写任何一行输出)。若需在环境中现场截屏,可按 4.4 / 4.5 节命令复跑后替换,两套来源内容一致。
298+ 
299+## 7. 交付 Checklist
300+ 
301+- [x] 社区 PR 链接(已 Merged):[pytorch/pytorch#192479](https://github.com/pytorch/pytorch/pull/192479)
302+- [x] torch_npu 无需修改原因:本次仅为上游测试类补充硬件分类元数据,不新增/替换设备接口,无需同步修改
303+ (见 3.3 节)
304+- [x] A2/A3 运行结果截图:`screenshots/A2-environment.png`、`screenshots/A2-test_activation_sparsifier.png`
305+- [x] A5 运行结果截图:`screenshots/A5-environment.png`、`screenshots/A5-test_activation_sparsifier.png`
306+- [x] 运行结果的日志文件:`log/A2-test_activation_sparsifier.log`、`log/A5-test_activation_sparsifier.log`
307+- [x] 失败用例分析报告:无失败用例,见 4.8 节
308+- [ ] torch_npu PR 链接:不适用(无需同步修改)