已合并
[feat] topo.json忽略net_layer字段 #4452
x00958740创建于 8月6日
[feat] topo.json忽略net_layer字段 #4452
已合并
x00958740创建于 8月6日
x00958740
x00958740
8月6日

描述

本 PR 移除 topo.json.edge_list[].net_layer 对拓扑构建的影响,并完善统一物理拓扑下的逻辑分层、UB 协议消歧、等价拓扑实例去重和 Endpoint 分层查询。

修改后的原则如下:

  • 新版 topo.json 可以不再携带 net_layer。
  • 兼容旧版 topo.json:即使存在 net_layer,也完全忽略,不读取、不校验、不保存、不统计、不打印。
  • RankTable.json.level_list[].net_layer 保持不变,是 RankGraph 逻辑分层的唯一来源。
  • topo.json 只描述物理连通关系;RankTable 决定逻辑 layer、planeId 和网络实例归属。
  • 不增加新的环境变量,不修改 HCCL/TopoMatch 的公开接口签名,也不改变 EndpointDesc 的公开结构布局。

核心设计

1. 统一物理拓扑

  • EdgeInfo 不再保存运行时 netLayer。
  • TopoInfo 将原先按 layer 分组的物理边调整为统一物理边集合。
  • 仅 net_layer 不同、其余物理属性完全相同的旧 topo 边会合并,避免重复建图。
  • PhyTopo 由多张按 layer 保存的物理图调整为一张不带逻辑层语义的物理候选图。
  • 统一物理图仍保留未出现在 edge_list 中的孤立 Peer。
  • TopoInfo/EdgeInfo BinaryStream 保留旧布局兼容读写;旧快照恢复时合并重复物理边。

2. 按 RankTable 构建 RankGraph

  • RankGraphBuilder 构建每个逻辑 layer 时,仅使用 RankTable 当前 layer 声明的端口匹配 P2P/P2N 物理候选边。
  • Fabric 归属以 RankTable 的 planeId 为准;topoInstId 仅作为拓扑实例属性。
  • SocketManager、Host RDMA 端口探测、绕路服务和 64+1 更新流程同步适配统一物理图。
  • 对 GetPeer 返回值增加空指针保护,避免异常物理拓扑导致解引用。

3. EID 协议能力与物理边选择

仅对非 layer 0 的 CLOS P2N 场景执行 EID 协议查询:

  1. 根据 EID 获取 RDMA handle。
  2. 调用 HCCP 查询 DevBaseAttr.priorityInfo。
  3. 汇总所有优先级上的 CTP/RTP 能力。
  4. 选择唯一物理候选边,再向 RankGraph 暴露该 Endpoint 实际支持的逻辑协议。
EID/地址能力 物理边选择 RankGraph 暴露协议
仅支持 CTP 选择 UB_CTP 物理边 UB_CTP、UB_MEM
仅支持 RTP 选择 UB_TP 物理边 UB_TP
同时支持 CTP、RTP 仍只选择一条 UB_CTP 物理边 UB_CTP、UB_TP、UB_MEM
同一 planeId 查询结果不一致 拒绝构建 返回参数异常,避免生成含混 RankGraph
不支持 CTP/RTP,或获取 handle/属性失败 拒绝构建 明确报错,不静默选择错误物理边
非 EID 地址 不执行 HCCP 查询 继续按 RankTable 端口匹配

同时支持 CTP/RTP 时不会新增第二条物理边、Fabric 或 TopoInstance,仅在选中的 CTP 接口和逻辑边上扩展 UB_TP 能力,因此不会改变算法看到的节点数和物理连接数量。

4. 等价 TopoInstance 去重

统一物理图中可能存在除 topoInstId 外完全相同的 P2N 候选边。对非 layer 0 的 RankTable 网络:

  • 按源/目的节点、链路类型、协议、方向、topoType、hop 和两端接口判断物理边是否等价。
  • 等价边只构建一条逻辑边,并保留较小的 topoInstId。
  • layer 0 保持 topo 文件描述的原始拓扑实例语义,不执行该项去重。

该处理避免 layer 1/2 因重复候选边生成多个等价 TopoInstance,影响 NHR 等算法的拓扑判断。

5. Endpoint 跨 layer 隔离

原 Endpoint 映射只使用 CommAddr 和 CommProtocol 作为 key。当 layer 1/2 复用相同 EID 和协议时,后插入的接口会覆盖先插入的接口,导致 BW_COEFF、localDieId 等属性跨 layer 串用。

本 PR 将内部 Endpoint key 扩展为:

  • netLayer
  • topoInstId
  • CommAddr
  • CommProtocol

并完成以下兼容处理:

  • GetEndpointDesc/GetLinks 返回的描述符内部携带 netLayer 和 topoInstId 定位信息。
  • GetEndpointInfo 使用完整定位信息查询对应 layer/topoInstId 的接口。
  • HCCL 按字段复制 EndpointDesc 时,定位信息随 EndpointLoc 一并保留。
  • 旧描述符没有定位信息时,仅在候选接口唯一的情况下兼容匹配;存在跨层歧义时返回参数错误,避免静默选错。
  • 未修改公开接口签名和 EndpointDesc 结构大小。

行为说明

输入/场景 修改后行为
topo.json 不含 net_layer 正常解析并构建统一物理拓扑
旧 topo.json 含任意类型或取值的 net_layer 完全忽略该字段
仅 net_layer 不同、其余相同的 topo 边 合并为同一条物理边
RankTable 中的 net_layer 保留,作为 RankGraph 逻辑分层来源
P2P/P2N 候选边共存于统一物理图 按当前 RankTable layer 的端口筛选
EID 同时支持 CTP/RTP 一条 CTP 物理边,向算法暴露 CTP/TP/MEM 三协议
非 layer 0 存在仅 topoInstId 不同的等价 P2N 边 去重并保留较小 topoInstId
不同 layer 复用相同 EID/协议 Endpoint 属性按 layer/topoInstId 隔离,不再覆盖
旧 BinaryStream 快照 兼容读取并恢复

变更类型

关联 Issue

NA

测试

已新增或适配以下 UT/ST 场景:

  • 新旧 topo.json 解析,以及 net_layer 缺失、不同或越界时的忽略行为。
  • 重复物理边合并、统一物理图构建和孤立 Peer 保留。
  • RankGraph 多 layer 的 P2P/P2N 端口归属与隔离。
  • 按 planeId 创建 Fabric。
  • EID 仅 CTP、仅 RTP、同时支持 CTP/RTP、查询能力不一致和远端端口重叠场景。
  • CTP/RTP 共存时只保留一条物理边,同时暴露 CTP/TP/MEM 三协议。
  • 非 layer 0 等价 P2N 边去重,TopoInstance 数量保持为 1。
  • 相同 EID/协议跨 layer 时,GetEndpointInfo 分别返回正确的 BW_COEFF 和 localDieId。
  • HCCL 按字段复制 EndpointDesc 后仍可按 layer/topoInstId 查询。
  • 旧 EndpointDesc 在唯一匹配时兼容、歧义时明确失败。
  • SocketManager、Host RDMA、绕路和 64+1 相关路径回归。
  • EdgeInfo/TopoInfo BinaryStream 新旧格式兼容恢复。

已完成的静态验证:

  • git diff --check 通过。
  • 修改的 JSON 文件语法校验通过。
  • 标准实现与 legacy 镜像头文件一致性检查通过。
  • 修复 EndpointDescInit 返回 HcommResult 在 device 严格编译下无法隐式转换为 HcclResult 的问题。

编译、UT、ST 和 codecheck 最终状态以本 PR 最新流水线结果为准。

文档

本 PR 未提交额外设计文档;代码内已补充必要的简洁注释。

合入检查

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 x00958740 的贡献)
x00958740x00958740
8月6日 创建了 pull request,commit 3ecb0513
atomgit-bot
atomgit-bot
8月6日 评论:

变更摘要

此 PR 的核心目标是移除 topo.json 中 net_layer 字段的拓扑语义,将物理拓扑统一构建为单张图,逻辑分层完全交由 RankTable 中的 net_layer 和端口映射来决定。同时补充了旧格式 BinaryStream 兼容、P2P/P2N 端口筛选、绕路与 64+1 场景适配,并在端口重叠场景下依据 EID 能力区分 UB_CTP 与 UB_TP 物理边。

主要改动

  • PhyTopo 从多图层改为单图:AddTopoGraph 不再接受 netLayer 参数,GetTopoGraph 不再依据 netLayer 查询,内部存储从 std::unordered_map<u32, shared_ptr<Graph>> 变为单个 shared_ptr<Graph>。IsNetLayerExisted 方法被移除,PhyTopoBuilder::Build 新增 BuildPhyTopo 方法统一构建物理图。

  • EdgeInfo 不再解析 net_layer:EdgeInfo::Deserialize 移除对 net_layer 的解析和越界校验,成员 netLayer 被删除。旧 topo.json 携带的 net_layer 字段被静默忽略。BinaryStream 序列化/反序列化使用 LEGACY_BINARY_LAYER(0)作为兼容占位。

  • TopoInfo::edges 从分层映射改为扁平列表:类型从 std::map<u32, std::vector<EdgeInfo>> 变为 std::vector<EdgeInfo>。重复物理边不再抛异常而是合并去重。BinaryStream 兼容旧分组格式,读取时展开并去重,写入时统一写入一个兼容分组。

  • RankGraphBuilder 新增 EID 协议解析与端口筛选:新增 ResolveUbProtocolByEid 通过 HccpRaGetDevBaseAttr 查询 EID 的 CTP/RTP 能力,在物理边同时存在 UB_CTP 和 UB_TP 时按能力筛选。AddFabricInfo 使用 IsPeer2NetLinkMatched 按端口交集匹配物理边,GetPeer2NetPhyLinks 不再接受 netLayer 参数。移除 CheckNetLayerFromPhyTopo 校验。

  • 64+1 绕路与端口归属强化:DetourService 中绕路候选边增加 LinkType::PEER2PEER 类型过滤,端口地址查找改用新增的 TryGetLayer0Address 方法确保端口属于 RankTable layer 0。UpdaterFor64Plus1 新增 HasLayer0Port 和 HasLayer0Peer2PeerLink 辅助函数,GetPeer2PlaneEdges 改为依据端口数量和协议集合筛选备份面物理边。

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

代码审查

经过全面审查后,我现在给出最终总结。


审查总结

已审查全部 40 个变更文件。以下是审查结果:

各文件审查结论

源代码文件(17 个):

  1. src/base_comm/resources/southbound_adpt/hcomm_adapter_hccp.cc — 无问题(增强日志输出,仅新增 HccpRaGetDevBaseAttr 的调试信息)
  2. src/coll_communicator_mgr/rank_graph/phy_topo/phy_topo.cc — 无问题(unordered_map → 单 shared_ptr,API 签名简化一致)
  3. src/coll_communicator_mgr/rank_graph/phy_topo/phy_topo.h — 无问题(移除 netLayer 相关声明,移除 #include <unordered_map>)
  4. src/coll_communicator_mgr/rank_graph/phy_topo_builder/phy_topo_builder.cc — 无问题(新增 BuildPhyTopo 方法统一构建单图)
  5. src/coll_communicator_mgr/rank_graph/phy_topo_builder/phy_topo_builder.h — 无问题(新增 BuildPhyTopo 声明)
  6. src/coll_communicator_mgr/rank_graph/rank_graph/net_instance.cc — 无问题(新增 TryGetLayer0Address,边界检查正确)
  7. src/coll_communicator_mgr/rank_graph/rank_graph/net_instance.h — 无问题
  8. src/coll_communicator_mgr/rank_graph/rank_graph_builder/detour_service.cc — 无问题(新增空指针防护、P2P 类型过滤、layer0 端口校验)
  9. src/coll_communicator_mgr/rank_graph/rank_graph_builder/rank_graph_builder.cc — 1 个 P3 发现(UpdateTopoInstForMyRankOnly 中冗余构造 ConnInterface)
  10. src/coll_communicator_mgr/rank_graph/rank_graph_builder/rank_graph_builder.h — 无问题
  11. src/coll_communicator_mgr/rank_graph/rank_graph_builder/updater_for_64_plus_1.cc — 无问题(新增 HasLayer0Port/HasLayer0Peer2PeerLink,GetPeer2PlaneEdges 增强过滤)
  12. src/coll_communicator_mgr/rank_graph/rank_graph_builder/updater_for_64_plus_1.h — 无问题
  13. src/coll_communicator_mgr/rank_graph/topo_info/edge_info.cc — 无问题(移除 netLayer 解析,BinaryStream 兼容层正确)
  14. src/coll_communicator_mgr/rank_graph/topo_info/edge_info.h — 无问题(移除 netLayer 字段和 MAX_VALUE_LEVEL,新增 LEGACY_BINARY_LAYER)
  15. src/coll_communicator_mgr/rank_graph/topo_info/topo_info.cc — 无问题(map<u32, vector> → vector,BinaryStream 兼容,重复边合并)
  16. src/coll_communicator_mgr/rank_graph/topo_info/topo_info.h — 无问题(类型变更一致,移除 #include <map>)
  17. src/coll_communicator_mgr/rank_info_detect/rank_info_detect_client.cc — 无问题(IsHostRdmaLink/HasMatchingPort 逻辑正确)

Legacy 文件(6 个):

  1. src/legacy/ascend950/framework/resource_manager/socket/socket_manager.cc — 无问题
  2. src/legacy/ascend950/framework/topo/new_topo_builder/phy_topo/phy_topo.h — 无问题(与新版一致)
  3. src/legacy/ascend950/framework/topo/new_topo_builder/phy_topo_builder/phy_topo_builder.h — 无问题
  4. src/legacy/ascend950/framework/topo/new_topo_builder/rank_graph/net_instance.h — 无问题
  5. src/legacy/ascend950/framework/topo/new_topo_builder/topo_info/edge_info.h — 无问题
  6. src/legacy/ascend950/framework/topo/new_topo_builder/topo_info/topo_info.h — 无问题

测试文件(17 个):

  1. test/legacy/st/algorithm/testcase/.../1d_2p_mesh_topo/ranktable.json — 无问题(端口号适配)
  2. test/legacy/st/algorithm/testcase/.../2d_2+2p_mesh_topo/ranktable.json — 无问题(端口号适配)
  3. test/legacy/st/otherFiles/phy_topo/st_phy_topo.cc — 无问题
  4. test/legacy/st/otherFiles/phy_topo_builder/st_phy_topo_builder.cc — 无问题
  5. test/legacy/st/otherFiles/topo_info/st_edge_info.cc — 无问题
  6. test/legacy/st/otherFiles/topo_info/st_topo_info.cc — 无问题
  7. test/legacy/ut/framework/communicator/ranktable_stub_clos.h — 无问题(新增 plane_id 字段)
  8. test/legacy/ut/framework/resource_manager/socket/ut_socket_manager.cc — 无问题
  9. test/legacy/ut/framework/topo/ranktable/rank_table.h — 无问题(移除 net_layer 字段)
  10. test/ut/framework/next/coll_comms/rank_graphs/common/rank_graph_test_data_builder.h — 无问题
  11. test/ut/framework/next/coll_comms/rank_graphs/phy_topo/ut_phy_topo.cc — 无问题
  12. test/ut/framework/next/coll_comms/rank_graphs/phy_topo_builder/ut_phy_topo_builder.cc — 无问题
  13. test/ut/framework/next/coll_comms/rank_graphs/rank_graph_64_plus_1/ut_rank_graph_64_plus_1.cc — 无问题
  14. test/ut/framework/next/coll_comms/rank_graphs/rank_graph_builder/ut_rank_graph_builder.cc — 无问题
  15. test/ut/framework/next/coll_comms/rank_graphs/topo_info/ut_edge_info.cc — 无问题
  16. test/ut/framework/next/coll_comms/rank_graphs/topo_info/ut_topo_info.cc — 无问题
  17. test/ut/framework/next/coll_comms/rank_info_detect/ut_rank_info_detect_client.cc — 无问题

发现问题汇总

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

整体风险评估

低风险。 此次变更的核心逻辑——移除 topo.json 中 net_layer 的语义、将物理拓扑统一为单图、以 RankTable 的 net_layer 和端口映射驱动逻辑分层——在所有文件中的实现一致且正确。API 签名变更(AddTopoGraph/GetTopoGraph 去参化、edges 类型扁平化、netLayer 字段移除)均已同步到所有头文件、实现文件和测试文件,无遗留调用点。BinaryStream 的向前/向后兼容通过 LEGACY_BINARY_LAYER 占位字段和读取侧忽略机制正确实现。唯一的 P3 发现是 UpdateTopoInstForMyRankOnly 中构造了未使用的 ConnInterface 对象,属于性能优化建议,不影响正确性。

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

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月6日 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
8月6日 添加了label:cann-cla/yes
此处折叠了303条消息 查看更多
yanglianxiangyanglianxiang成员
8月21日 解决了最后一个问题
yanglianxiang
yanglianxiang成员
8月21日 评论:

/lgtm

likedislike
57_Viking
57_Viking成员
8月21日 评论:

/approve

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