Pull Request已成功合入, 合并人@ascend-robot
(感谢 zjucn 的贡献)Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| test | ✅ 李伟, sunyu-xuan (2/2) | ✅ 李伟 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
zjucn, thanks for your pull request. All authors of the commits have signed the CLA. 👍


当前仓库存在以下 保护分支 :
| Protected Branch | Version | Release |
|---|---|---|
| master | ||
| v2.7.1 | ||
| v2.9.0 | ||
| v2.10.0 | ||
| v2.11.0 |
评论 /sync <branch1> <branch2> ... 可将当前 PR 修改同步到其它分支(创建同步 PR):
a) 如果当前 PR 是 Open 状态,同步操作将延迟到 PR 被合并时执行
b) 如果当前 PR 已经 Merged,将立即执行同步操作
注意:
- /sync 命令可以指定同步到多个分支,仅最后一个 /sync 命令生效
- 如果创建的同步 PR 不正确,可通过向同步 PR 的源分支提交轻量级 PR 完善,或使用 /close 命令关闭


Ascend docs pipeline is running...


✅ 跳过 docs ci 检查,没有需要检查的文档文件


compile


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | 🕚 | >>> |
| Build_ARM | 🕚 | >>> | |
| Build_LibTorch_x86 | 🕚 | >>> | |
| Build_LibTorch_ARM | 🕚 | >>> | |
| Build_X86_torchair | 🕚 | >>> | |
| Build_ARM_torchair | 🕚 | >>> | |
| patch_test | 🕚 | >>> | |
| 恶意代码检查 | Antipoison | 🕚 | >>> |
| 编码安全与规范检查 | CodeCheck | ✅ | >>> |
| check_error | 🕚 | >>> | |
| CodeCheck_lintrunner | 🕚 | >>> | |
| 开源片段检查 | SCA | 🕚 | >>> |
| 开发者测试 | UT_X86_Part_01 | 🕚 | >>> |
| UT_X86_Part_02 | 🕚 | >>> | |
| UT_ARM_A3_Part_01 | 🕚 | >>> | |
| UT_ARM_A3_Part_02 | 🕚 | >>> | |
| UT_DIST_X86_Part_01 | 🕚 | >>> | |
| UT_DIST_X86_Part_02 | 🕚 | >>> | |
| UT_DIST_X86_Part_03 | 🕚 | >>> | |
| UT_DIST_X86_Part_04 | 🕚 | >>> | |
| UT_inductor_Part_01 | 🕚 | >>> | |
| UT_inductor_Part_02 | 🕚 | >>> | |
| UT_inductor_Part_03 | 🕚 | >>> | |
| UT_inductor_Part_04 | 🕚 | >>> | |
| UT_ARM_A2_Part_01 | 🕚 | >>> | |
| UT_ARM_A2_Part_02 | 🕚 | >>> | |
| UT_ARM_A2_Part_03 | 🕚 | >>> | |
| 流水线 | PR-pipeline_pytorch | 🕚 | >>> |


Ascend docs pipeline is running...


✅ 跳过 docs ci 检查,没有需要检查的文档文件


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | ✅ | >>> |
| Build_ARM | ✅ | >>> | |
| Build_LibTorch_x86 | ✅ | >>> | |
| Build_LibTorch_ARM | ✅ | >>> | |
| Build_X86_torchair | 🛑 | >>> | |
| Build_ARM_torchair | 🛑 | >>> | |
| patch_test | 🛑 | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | CodeCheck | ✅ | >>> |
| check_error | ✅ | >>> | |
| CodeCheck_lintrunner | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_X86_Part_01 | 🛑 | >>> |
| UT_X86_Part_02 | 🛑 | >>> | |
| UT_ARM_A3_Part_01 | 🛑 | >>> | |
| UT_ARM_A3_Part_02 | 🛑 | >>> | |
| UT_DIST_X86_Part_01 | ✅ | >>> | |
| UT_DIST_X86_Part_02 | ✅ | >>> | |
| UT_DIST_X86_Part_03 | ✅ | >>> | |
| UT_DIST_X86_Part_04 | ✅ | >>> | |
| UT_inductor_Part_01 | 🛑 | >>> | |
| UT_inductor_Part_02 | 🛑 | >>> | |
| UT_inductor_Part_03 | 🛑 | >>> | |
| UT_inductor_Part_04 | 🛑 | >>> | |
| UT_ARM_A2_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_03 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |


Ascend docs pipeline is running...


✅ 跳过 docs ci 检查,没有需要检查的文档文件


compile


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | 🕚 | >>> |
| Build_ARM | 🕚 | >>> | |
| Build_LibTorch_x86 | 🕚 | >>> | |
| Build_LibTorch_ARM | 🕚 | >>> | |
| Build_X86_torchair | 🕚 | >>> | |
| Build_ARM_torchair | 🕚 | >>> | |
| patch_test | 🕚 | >>> | |
| 恶意代码检查 | Antipoison | 🕚 | >>> |
| 编码安全与规范检查 | CodeCheck | 🕚 | >>> |
| check_error | 🕚 | >>> | |
| CodeCheck_lintrunner | 🕚 | >>> | |
| 开源片段检查 | SCA | 🕚 | >>> |
| 开发者测试 | UT_X86_Part_01 | 🕚 | >>> |
| UT_X86_Part_02 | 🕚 | >>> | |
| UT_ARM_A3_Part_01 | 🕚 | >>> | |
| UT_ARM_A3_Part_02 | 🕚 | >>> | |
| UT_DIST_X86_Part_01 | 🕚 | >>> | |
| UT_DIST_X86_Part_02 | 🕚 | >>> | |
| UT_DIST_X86_Part_03 | 🕚 | >>> | |
| UT_DIST_X86_Part_04 | 🕚 | >>> | |
| UT_inductor_Part_01 | 🕚 | >>> | |
| UT_inductor_Part_02 | 🕚 | >>> | |
| UT_inductor_Part_03 | 🕚 | >>> | |
| UT_inductor_Part_04 | 🕚 | >>> | |
| UT_ARM_A2_Part_01 | 🕚 | >>> | |
| UT_ARM_A2_Part_02 | 🕚 | >>> | |
| UT_ARM_A2_Part_03 | 🕚 | >>> | |
| 流水线 | PR-pipeline_pytorch | 🕚 | >>> |


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | ✅ | >>> |
| Build_ARM | ✅ | >>> | |
| Build_LibTorch_x86 | ✅ | >>> | |
| Build_LibTorch_ARM | ✅ | >>> | |
| Build_X86_torchair | 🛑 | >>> | |
| Build_ARM_torchair | 🛑 | >>> | |
| patch_test | 🛑 | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | CodeCheck | ✅ | >>> |
| check_error | ✅ | >>> | |
| CodeCheck_lintrunner | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_X86_Part_01 | 🛑 | >>> |
| UT_X86_Part_02 | 🛑 | >>> | |
| UT_ARM_A3_Part_01 | 🛑 | >>> | |
| UT_ARM_A3_Part_02 | 🛑 | >>> | |
| UT_DIST_X86_Part_01 | ✅ | >>> | |
| UT_DIST_X86_Part_02 | ✅ | >>> | |
| UT_DIST_X86_Part_03 | ✅ | >>> | |
| UT_DIST_X86_Part_04 | ✅ | >>> | |
| UT_inductor_Part_01 | 🛑 | >>> | |
| UT_inductor_Part_02 | 🛑 | >>> | |
| UT_inductor_Part_03 | 🛑 | >>> | |
| UT_inductor_Part_04 | 🛑 | >>> | |
| UT_ARM_A2_Part_01 | ✅ | >>> | |
| UT_ARM_A2_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_03 | ✅ | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |


/lgtm


Review Guide
This pull-request passes review.
Committers who wrote a comment of /approve are: 李伟.
Reviewers who wrote a comment of /lgtm are: 李伟, sunyu-xuan.


【合入来源】
本 PR 覆盖以下 API:
torch.distributed.checkpoint.LoadPlantorch.distributed.checkpoint.LoadPlannertorch.distributed.checkpoint.LoadPlanner.set_up_plannertorch.distributed.checkpoint.LoadPlanner.create_local_plantorch.distributed.checkpoint.LoadPlanner.create_global_plantorch.distributed.checkpoint.LoadPlanner.finish_plantorch.distributed.checkpoint.LoadPlanner.load_bytestorch.distributed.checkpoint.LoadPlanner.resolve_tensortorch.distributed.checkpoint.LoadPlanner.commit_tensor说明:
torch.distributed.checkpoint.LoadPlanner.resolve_bytes是基类协议扩展点,默认实现为NotImplementedError。当前 filesystem load 路径不依赖该方法,本 PR 聚焦验证实际加载路径中使用的DefaultLoadPlanner.load_bytes,不对resolve_bytes新增专项测试。【修改方案】
一、解决方案
针对 issue 中提出的
LoadPlan/LoadPlannerAPI 专项测试缺失问题,本 PR 新增test_loadplan_api.py,以“API 级计划行为验证 + NPU state_dict 加载路径验证”的方式补齐相关测试。本 PR 做如下修改:
test_loadplan_api.py,覆盖LoadPlan/LoadPlanner的计划生成、计划传递、bytes 加载、tensor 定位和 tensor 提交行为。state_dict,验证 planner 在 NPU tensor、NPU tensor view、非连续 NPU tensor 场景下的行为。FileSystemWriter/FileSystemReader的no_dist=True路径,验证真实 checkpoint 读写流程可以加载 tensor 和 bytes 到 NPUstate_dict。PlanDataLoadPlanner验证planner_data/storage_data在 local plan、global plan、finish plan 间的传递。MaterializeOnCpuLoadPlanner验证resolve_tensor返回 CPU 临时 tensor 后,commit_tensor可将数据回写到 NPU 目标 tensor。新增测试文件:
二、用例完备性说明
本次新增 12 个测试用例,覆盖
LoadPlan/LoadPlanner加载生命周期、错误边界、NPU 写入路径和跨版本兼容点。1.
test_default_load_planner_local_global_finish_plan覆盖 API:
LoadPlanLoadPlanner.set_up_plannerLoadPlanner.create_local_planLoadPlanner.create_global_planLoadPlanner.finish_plan验证内容:
LoadItemType.TENSOR类型ReadItem。LoadItemType.BYTE_IO类型ReadItem。ReadItem的dest_offsets、storage_offsets和lengths正确。DefaultLoadPlanner.create_global_plan默认透传 local plan。DefaultLoadPlanner.finish_plan默认透传 global plan。该用例证明默认 planner 可以基于 NPU 目标
state_dict生成正确LoadPlan,并保持默认 global / finish plan 语义。2.
test_default_load_planner_creates_multiple_tensor_read_items覆盖 API:
LoadPlanLoadPlanner.create_local_plan验证内容:
ReadItem。ReadItem的dest_index、storage_index、storage_offsets和lengths正确。该用例覆盖 PyTorch 2.11.0 及 master 中
create_read_items_for_chunk_list算法改写后的公共行为一致性。3.
test_default_load_planner_strict_and_partial_load覆盖 API:
LoadPlanner.set_up_plannerLoadPlanner.create_local_plan验证内容:
allow_partial_load=False时,目标state_dict中存在 checkpoint 缺失 key 会抛出Missing key in checkpoint。allow_partial_load=True时,planner 只为 checkpoint 中存在的 key 生成读取计划。该用例证明
set_up_planner记录的目标state_dict会参与 strict / partial load 检查。4.
test_default_load_planner_size_mismatch覆盖 API:
LoadPlanner.set_up_plannerLoadPlanner.create_local_plan验证内容:
Size mismatch。该用例证明目标 NPU tensor 的 shape 会参与 metadata shape 校验。
5.
test_resolve_tensor_returns_npu_narrow_view覆盖 API:
LoadPlanner.resolve_tensorLoadPlanner.commit_tensor验证内容:
resolve_tensor根据dest_offsets和lengths返回 NPU narrow view。commit_tensor不影响 view 写回结果。该用例证明默认 planner 可以为 NPU tensor 返回可写入 view。
6.
test_resolve_tensor_handles_non_contiguous_npu_target覆盖 API:
LoadPlanner.resolve_tensorLoadPlanner.commit_tensor验证内容:
resolve_tensor返回的 view 仍位于 NPU。该用例证明默认 planner 对非连续 NPU tensor 目标仍能正确定位写入位置。
7.
test_load_bytes_updates_flattened_original_state_dict覆盖 API:
LoadPlanner.load_bytes验证内容:
DefaultLoadPlanner默认开启flatten_state_dict。ReadItem使用 flatten FQN。load_bytes反序列化结果后写回原始嵌套state_dict。该用例证明 flatten 场景下 bytes 对象可以正确写回原始嵌套结构。
8.
test_load_bytes_updates_unflattened_state_dict覆盖 API:
LoadPlanner.load_bytes验证内容:
DefaultLoadPlanner(flatten_state_dict=False, flatten_sharded_tensors=False)关闭 flatten 行为。state_dict。该用例证明 unflatten 场景下 bytes 对象可以直接写回目标 key。
9.
test_load_state_dict_accepts_custom_plan_data覆盖 API:
LoadPlan.storage_dataLoadPlan.planner_dataLoadPlanner.create_local_planLoadPlanner.create_global_planLoadPlanner.finish_plan验证内容:
planner_data。storage_data并改写planner_data。finish_plan能接收到 global plan 写入的数据。load_state_dict流程能完成 NPU tensor 加载。该用例证明自定义 plan 数据可以经过真实 DCP load 生命周期传递。
10.
test_filesystem_metadata_version_when_supported覆盖 API:
FileSystemReader.read_metadataMetadata.version兼容路径验证内容:
metadata.version字段时,校验其等于官方CURRENT_DCP_VERSION。该用例覆盖 PyTorch 2.9.0 及之后版本新增 metadata version 字段的兼容行为。
11.
test_custom_commit_tensor_materializes_cpu_tensor_to_npu覆盖 API:
LoadPlanner.resolve_tensorLoadPlanner.commit_tensor验证内容:
resolve_tensor返回 CPU 临时 tensor。StorageReader将 checkpoint 数据写入 CPU 临时 tensor。commit_tensor将 CPU 临时 tensor copy 回 NPU 目标 tensor。该用例证明自定义
commit_tensor可以支持临时 tensor materialize 后再写回 NPU 的扩展路径。12.
test_filesystem_load_tensor_and_bytes_to_npu_state_dict覆盖 API:
LoadPlanner.load_bytesLoadPlanner.resolve_tensorLoadPlanner.commit_tensorFileSystemReaderFileSystemWriter验证内容:
FileSystemWriter保存包含 NPU tensor 和 bytes 对象的state_dict。FileSystemReader和DefaultLoadPlanner加载到 NPU 目标state_dict。该用例证明默认 filesystem checkpoint 读写路径可以加载 tensor 和 bytes 到 NPU
state_dict。覆盖关系总结
test_default_load_planner_local_global_finish_plantest_default_load_planner_creates_multiple_tensor_read_itemstest_default_load_planner_strict_and_partial_loadtest_default_load_planner_size_mismatchtest_resolve_tensor_returns_npu_narrow_viewtest_resolve_tensor_handles_non_contiguous_npu_targettest_load_bytes_updates_flattened_original_state_dicttest_load_bytes_updates_unflattened_state_dicttest_load_state_dict_accepts_custom_plan_datatest_filesystem_metadata_version_when_supportedtest_custom_commit_tensor_materializes_cpu_tensor_to_nputest_filesystem_load_tensor_and_bytes_to_npu_state_dict上述用例覆盖了 issue 中列出的全部 API,并将纯 Python 计划行为、NPU tensor 定位写入行为和真实 filesystem 加载路径分开验证,便于定位问题。
三、NPU 适配说明
本次不修改 torch-npu 生产代码,仅新增测试用例。
适配验证策略:
torch.zeros().to(device_type)、torch.arange().to(device_type)等方式构造真实 NPUstate_dict。FileSystemWriter/FileSystemReader的no_dist=True单进程路径,避免引入多进程 / HCCL 依赖,保持 API 测试稳定。DefaultLoadPlanner.resolve_tensor返回的 NPU view 进行直接写入验证。ReadItem进行直接计划校验,覆盖 resharding 读计划行为。version字段进行兼容验证。MaterializeOnCpuLoadPlanner覆盖 CPU 临时 tensor 经commit_tensor回写 NPU 的扩展路径。state_dict验证FileSystemReader/FileSystemWriter与默认 planner 的组合加载路径。经检查,PyTorch 2.7.1、2.9.0、2.10.0、2.11.0 和 master 中
LoadPlan/LoadPlanner加载侧公共 API 的方法签名保持稳定。版本间主要差异如下:torch.distributed.checkpoint.Metadata新增version字段,FileSystemWriter会写入CURRENT_DCP_VERSION。assert改为显式AssertionError,不影响正常加载路径。planner_helpers.create_read_items_for_chunk_list的多 chunk 匹配算法改为 sweep-line 实现,公共行为应保持一致。为什么不需要修改 API:
LoadPlan/LoadPlanner是 DCP load 阶段的通用计划与数据定位抽象,不绑定具体设备后端。state_dict位于 NPU 时仍能正确生成计划、定位 tensor/view、加载 bytes,并通过自定义 planner 完成 commit 回写。【资料变更】
【接口变更】
【功能验证】
在 2.7.1、2.9.0、2.10.0、2.11.0、2.12.0以及 master 版本上执行新增测试,均通过。
执行命令:
结果示例:
【CheckList】