快递分拨中心的老周以前从不看园区图纸。他觉得所有分拣台都一样,包裹从哪台到哪台只是多走几步的问题。直到双十一那天,他把两个需要频繁互传数据的“特快小组”放在了不同楼层,所有包裹都在慢吞吞的货梯前排队,他才意识到:通道和通道不一样,设备和设备之间的距离也不一样。GPU 集群也一样。每块 GPU 之间通过 PCIe、NVLink、NVSwitch 等方式连接,带宽差出几十倍。所谓“拓扑感知”,就是让调度系统先看图纸再派活——知道哪些 GPU 物理相邻、哪些链路更快,从而把通信量大的任务放在“邻座”,把慢链路留给低频通信。这篇文章跟随老周从“不看图纸”到“活用图纸”,把 GPU 拓扑感知的原理、算法和落地策略一次讲透。
对 AI 从业者而言,掌握 GPU 拓扑感知是让分布式训练从“能跑”迈向“高效跑”的关键技能,直接决定集群吞吐与成本。
可视化演示
三步展示GPU拓扑感知:拓扑层级结构(4 GPU + NVLink全互联 + PCIe + NUMA跨CPU QPI)、互联带宽对比(NVLink 600GB/s vs NVSwitch 2400GB/s vs PCIe4 64GB/s vs QPI 40GB/s)、3D并行放置策略(TP→NVSwitch/PP→NVLink/DP→跨节点网络)。
本节配有交互动效(进入视口后自动加载,约 3KB)。
GPU拓扑层级结构 NVLink:GPU间直连,600GB/s全双工 PCIe:GPU到CPU标准接口,64GB/s QPI:跨CPU插槽互联,40GB/s topology = NVLink > PCIe > QPI (bandwidth) 层次化拓扑决定通信效率。
拓扑感知概述
双十一前的快递园区,老周把 8 个分拣台分成两组搞“联合分拣”,结果一组在 1 楼,一组在 3 楼,每批包裹都要坐货梯来回,效率反而比单干更差。他第一次翻开园区图纸,才发现工位之间的“距离”从来就不平等:有的隔一条走廊,有的隔整整两层楼。GPU 集群里那个“图纸”,就是设备拓扑。
GPU 拓扑感知(GPU Topology-Aware)回答三个问题:GPU 装在哪台服务器、GPU 之间通过什么链路相连、链路快还是慢。调度系统原本只关心“哪块卡空闲”,拓扑感知则多问一句:“哪块卡离它最近、最快”。它把物理连接信息翻译成调度决策,避免把高频通信的进程放到相隔甚远的 GPU 上。
在单机小模型时代,一两张卡就能跑完,拓扑无关紧要。到了大模型时代,参数动辄千亿级,模型被切分到多张 GPU,梯度同步和激活交换都依赖卡间通信。若 rank 被放到跨 PCIe 或跨节点的 GPU 上,通信时间占比会从 10% 飙升到 60% 以上。因此,拓扑感知成为算力集群与调度中的必备能力。
老周看完图纸恍然大悟,把“先看楼层再派活”写进了晨会流程。拓扑感知的第一课,就是承认:设备之间的距离,从来不是平等的。
- 传输数据量 D一次通信要搬运的字节数,例如梯度张量的大小。$D$ 越大,搬运时间越长。
- 链路带宽 B单位时间能传输的数据量,NVLink 的 $B$ 远大于 PCIe,快链路能把 $\frac{D}{B}$ 这项压得很低。
- 通信延迟 L建立连接和发送小包所需的固定开销,消息越小时越主导。
- 通信总时间搬运时间加固定延迟,拓扑感知的目标就是同时减小 $B$ 带来的分母和 $L$ 带来的固定成本。
硬件连接层次
园区的通道分几种:普通货梯、高速传送带、中央自动分拣枢纽,还有连接园区的货运专线。老周以前以为“都叫通道,能运货就行”,后来才知道它们速度相差一个数量级。GPU 互联也是同样的分层结构。
第一层是 PCIe 总线,通用、兼容性好,但带宽有限且同一 PCIe 交换机下的多张卡经常共享总带宽,就像园区货梯一次只能进几个人。第二层是 NVLink,NVIDIA 为 GPU 设计的高速点对点互连,带宽可达 PCIe 的数倍甚至数十倍,相当于专属高速传送带。第三层是 NVSwitch,它把多个 NVLink 的端口集中成交换矩阵,让机内 4 卡、8 卡组成“全互联”域,相当于中央分拣枢纽。服务器之间则靠 InfiniBand 或高速以太网互连,相当于园区间的货运专线。
从拓扑角度看,一个 GPU 集群可以被拆成多层:GPU→NVSwitch(组内)、→CPU/PCIe(跨域)、→网卡(跨节点)。通信到底走哪层,决定了延迟和带宽的上下限。硬件设计越强的机型(如 DGX/HGX 平台),越需要调度软件充分利用 NVLink/NVSwitch,否则巨大硬件带宽被白白浪费。
老周算完账,再也不敢让“贵重包裹”走货梯。设计集群时,先数清楚有几条 NVLink、有没有 NVSwitch,就像先数清楚园区的传送带和枢纽数量。
- 链路条数 N_lanesGPU 与 GPU 之间的 NVLink 通道数,如 6 条或 12 条。链路越多,并行通路越多。
- 单通道速率 R_rate每条 NVLink 链路的单向速率,三代约 25 GB/s,四代约 50 GB/s。速率越高,单条通道越快。
- 单向乘 2NVLink 全双工,收发方向同时进行,所以双向总带宽要乘以 2。
- 总带宽含义这个乘积就是两张卡之间的理论双向带宽,是把“传送带”升级成“多车道高速公路”的依据。
拓扑发现机制
图纸从哪来?老周在物业那里领到一份园区系统图,上面标着每台分拣台归属哪个楼层、哪条传送带。GPU 集群也有类似“物业系统”——硬件和软件会用工具把拓扑关系明明白白列出来。
最常用的命令是 nvidia-smi topo -m,它会输出一张矩阵表,标明 GPU 之间是 PIX(同一 PCIe 交换机下)、PHB(同一 PCIe 桥)、NV(NVLink 直连)还是 SYS(跨越 CPU/节点)。CUDA 也提供 cudaDeviceGetP2PAttribute 接口,让程序直接查询两张卡是否支持点对点传输、原子操作等能力。NVIDIA 的 DCGM 和系统监控组件则负责把这些信息在集群范围汇总。
调度器获得拓扑数据的方式通常是“分层上报”:每台节点的 agent 读取本地拓扑,打成结构化标签(如 nvidia.com/gpu.topology=NV3),再上报给中心调度器。调度器把所有节点信息拼成一张全局拓扑图,之后每次分配 GPU 都在这张图上做决策。没有这一步,后续所有“感知”都是空中楼阁。
老周把园区系统图复印了三份,贴在自己工位、值班室和大厅入口。拓扑发现的意义也一样:地图人人可见,调度才能“按图索骥”。
- 同域权重 1同一 NVLink/NVSwitch 域内的代价最小,$w_{ij}=1$。
- 跨 PCIe 权重 k通过 PCIe 交换机的通信代价为 $w_{ij}=k$,其中 $k>1$。
- 跨节点权重 m跨服务器通信还要经过网卡和网络,$w_{ij}=m>k$。
- 权重的作用把不可直接比较的链路类型变成统一数值,供调度算法计算总代价。
通信开销影响
同样是 1 万件包裹,从同一楼层的 2 号台送到 3 号台,传送带几分钟搞定;从 3 号台送到另一个楼层的 4 号台,要排队等货梯,半小时都不一定够。包裹没变,变的只是通道。
GPU 通信也如此。NVLink 上传输梯度可能只要 20 微秒,跨节点走网络可能要几百微秒甚至毫秒级;带宽方面,PCIe 4.0 x16 约 32 GB/s,NVLink 3.0 六链路约 300 GB/s,相差近 10 倍。更关键的是通信模式:AllReduce 这类集合通信要求所有参与 GPU“同进同出”,整体速度被最慢的一条链路卡住,就像一组分拣台必须等最慢的货梯把所有包裹送完才能开工。
因此,设计并行策略时不能只看单卡算力,还要看通信模式对拓扑的影响。Tensor Parallel 需要每层都做 AllReduce,高频高带宽;Data Parallel 梯度同步也是 AllReduce;MoE 的 All-to-All 则把流量撒向全网。不同模式的“通信半径”不同,拓扑感知的收益也就不同。
老周后来定了一条规矩:每周复盘时列出“哪些跨楼层包裹其实可以换到同楼层处理”。GPU 团队也一样——定期检查集合通信,把通信热点拉回快链路。
- 路径 path数据从 GPU A 到 GPU B 经过的所有链路集合,路径中的每一跳都算一次。
- 每跳数据量 D_l这条链路上实际传输的字节数,可能因为多次复制而大于原始数据。
- 每跳带宽 B_l该链路带宽,$B_l$ 越小,这一跳的开销越大。
- 延迟累加 L_l所有跳的固定延迟相加,最终决定小消息的往返时间。
- 总通信时间把路径上每跳的时间累加,就是端到端通信代价,这正是调度的优化对象。
调度优化算法
老周要选 4 个分拣台组成“特快小组”,他让徒弟把所有组合都列出来,逐个计算“组内两两距离之和”,选总距离最小的那组。GPU 调度里的核心算法,本质上也是这个思路。
首先把集群抽象成图:顶点是 GPU,边是链路,边的权重就是拓扑发现中的 $w_{ij}$。然后计算两两 GPU 之间的最短路径代价,可以用 Dijkstra(单源最短路)或 Floyd-Warshall(全源最短路)得到距离矩阵。最后在候选 GPU 集合上计算亲和度,比如组内所有 pairwise 距离之和,越小越好;GPU 数量大时无法暴力枚举,就需要贪心、层次聚类或最大权重匹配等近似算法。
工业界常用的策略是“分层放置”:先把通信量最大的进程对放进同一 NVLink 域,再把次大的放进同一节点,最后才考虑跨节点。这种分层的贪心策略简单、可扩展,而且能很好地匹配实际硬件的层级结构。它把“全局最优”拆成“每层最优”,在千卡集群上也能快速求解。
老周的“总距离最小”小组上线后,包裹流转时间缩短了一半。算法听起来复杂,本质就是替任务找到一群“最不绕路”的邻居。
- 候选集 G_p从所有 GPU 集合 $V$ 中挑出 N 张 GPU 组成一个候选组,$|G_p|=N$。
- 组内两两代价 w_uv$w_{uv}$ 是第 u 张与第 v 张 GPU 之间的最短路径代价。
- 总代价求和把组内所有两两组合的 $w_{uv}$ 相加,就是该分组方案的通信代价。
- 最小化目标在全部候选组中取最小总代价,$\min$ 保证选出“最亲密的 N 个邻居”。
性能评估指标
方案好差不能靠感觉。老周在方案上线前后分别统计了“包裹平均在途时间”和“货梯排队长度”。GPU 集群也一样,需要一组指标来判断拓扑感知到底有没有用。
最直接的是通信耗时占比:训练一个 step 的总时间中,通信花掉多少比例。占比从 40% 降到 15%,说明拓扑调度生效。其次是聚合吞吐(aggregate bandwidth),衡量所有链路同时传输时的总带宽利用率。再往上看,训练吞吐(samples/s)和加速比才真正反映业务收益:增加 GPU 后训练速度提升了多少倍。
在多卡扩展时还要看扩展效率:理想情况下 8 卡是单卡的 8 倍,但通信开销让实际加速比低于理论值。若拓扑不佳,8 卡可能只有 5 倍加速;拓扑感知后能回到 7 倍以上。所以评估指标既要有“链路层”的带宽/延迟,也要有“任务层”的吞吐/加速比,两级结合才完整。
老周把“平均在途时间”做成看板挂在墙上,每天更新。指标的意义不是汇报,而是让优化有方向:哪里慢了,就往哪里调拓扑。
- 单卡时间 T_1使用 1 张 GPU 训练一个 step 的时间,作为基线。
- p 卡时间 T_p使用 p 张 GPU 训练同一任务的时间,$T_p$ 越小越好。
- 加速比 S_p$S_p = T_1 / T_p$,代表扩展到 p 张卡后速度提升的倍数。
- 扩展效率 E_p$E_p = S_p / p$,衡量每张卡贡献的“有效率”;通信开销越大,$E_p$ 越低。
实践优化策略
知道原理还不够,老周把方法固化成了一套标准作业流程:先查图纸,再分组,再排班,最后复查。拓扑感知的工程落地,也需要类似的一套组合拳。
第一招是调度器集成。在 Slurm 中可以用 GPU 亲和性插件约束卡的位置;在 Kubernetes 生态中,NVIDIA device plugin 会为 GPU 打上拓扑标签,配合 Volcano 等调度器实现拓扑感知分配。第二招是数据本地性,把预训练数据集和 checkpoints 放在 GPU 所在节点的本地 NVMe 上,避免读数据也走远端网络。第三招是通信计算重叠:用 CUDA Stream 把梯度通信和反向计算重叠,让通信时间“藏”在计算时间里。
第四招是进程绑定。启动训练脚本时,通过 CUDA_VISIBLE_DEVICES 指定目标 GPU,绑核(taskset)到对应 NUMA 节点,避免内存访问跨 NUMA 造成额外延迟。这些策略单独用都有点效果,组合起来才能把拓扑感知的收益榨干。
老周把 SOP 贴满园区,徒弟们再也不用拍脑袋派活。工程化的本质,就是把一次改进变成可持续执行的制度。
- 通信强度 c_ij进程 i 和进程 j 之间的通信数据量或频率,由并行策略决定。
- 链路代价 w_ij两张 GPU 之间的拓扑代价,来自前文权重映射。
- 乘积求和把所有进程对的通信强度乘以拓扑代价再求和,就是该分配方案的总代价。
- 调度目标最小化 Score,等价于“把通信越频繁的进程,放得越近”。
案例与挑战
双十一当天,老周的特快小组处理量翻了三倍,但园区也出现了新问题:临时增派的跨楼层小组又开始塞车,货梯甚至过热停机。真实集群也总是在“收益”和“新瓶颈”之间摇摆。
最典型的案例是大模型预训练。千卡集群上训练千亿参数模型,AllReduce 流量巨大;若不做拓扑感知,跨节点通信占比居高不下,训练吞吐可能只有理论值的 30%。采用拓扑感知后,先在同一 NVLink 域内做 Tensor Parallel,再把 Data Parallel 组挂到不同节点,吞吐能提升 40%-80%。另一个挑战是异构集群:A100 和 H100 混用时,NVLink 带宽不同,拓扑图要按型号加权,不能一视同仁。
故障恢复也考验拓扑:某台机器宕机后,调度器迁移任务,但迁移后的 GPU 可能从“同域”变成“跨域”,通信性能骤降。因此故障迁移不仅要找到空闲 GPU,还要重新计算拓扑距离。未来的趋势是 NVLink 带宽继续翻倍、PCIe Gen5 普及、以及可组合式算力(composable infrastructure),让“相邻关系”变得更加动态,拓扑感知会从“加分项”变成“必选项”。
老周在双十一总结会上说:“地图不是万能的,但没有地图万万不能。”GPU 拓扑感知同样如此——它不能消除所有通信,却能保证每一条通信都走在最合适的路上。
- 未感知耗时 T_blind没有拓扑信息参与调度时,任务的总耗时。
- 已感知耗时 T_aware使用拓扑感知调度后的任务总耗时,通常 $T_{\text{aware}} < T_{\text{blind}}$。
- 差值除以基线用两者的差除以基线,得到拓扑感知带来的相对收益。
- 收益解读$U_{\text{topo}}$ 越大,说明拓扑感知越有价值;对应到老周那里,就是“效率提升的百分比”。
AI 应用场景
大模型预训练中的并行策略放置
阶段:模型训练 / 算力调度
解决的问题:千亿参数模型被切分到多张 GPU 后,Tensor Parallel 的 AllReduce 每层都发生。如果两张需要高频通信的 GPU 被分在不同 PCIe 域或不同节点,训练吞吐会断崖式下降。拓扑感知告诉调度器“哪几张卡构成一个 NVLink 域”,把 Tensor Parallel 的 rank 放进同一域,梯度同步延迟显著降低。
具体案例:某团队训练 175B 参数 GPT 模型,使用 4 台 DGX A100。未做拓扑感知时,8 卡 Tensor Parallel 跨机布局,AllReduce 耗时约 12 ms/step;调整为同机 4 卡 NVSwitch 域 + 跨机 Data Parallel 后,通信耗时降到 3 ms/step,整体训练迭代时间缩短 35%。
云原生集群的 GPU 拓扑感知调度
阶段:资源调度 / 集群管理
解决的问题:Kubernetes 上多个训练任务共享 GPU,默认调度器只按“空闲 GPU 数”分配,容易把同一任务的进程拆到拓扑相隔很远的卡上。通过 device plugin 暴露拓扑标签,再用 Volcano 或自定义调度器按拓扑代价打分,任务扎堆慢链路的问题得到解决。
具体案例:某云厂商内部 ML 平台对 128 卡 A100 集群开启拓扑感知调度后,单任务平均通信时间下降 28%,集群整体利用率提升 17%。
推理服务中的 MoE 专家并行优化
阶段:模型推理 / 在线服务
解决的问题:MoE 模型每次 token 都要把请求路由给多个专家,专家分散在不同 GPU 上会形成 All-to-All 风暴。拓扑感知将专家尽量放在同一个 NVSwitch 域内,减少跨节点往返。
具体案例:某推荐系统使用 MoE 大模型做在线推理,批量推理时 token 的 All-to-All 通信占比从 34% 降到 18%,P99 延迟降低 42%。
Python 演示
from itertools import combinationsimport heapq class TopologyAwareScheduler: """GPU拓扑感知调度器:用最短路径代价选择通信开销最小的GPU组合""" def __init__(self, gpu_links): # gpu_links: {(gpu_a, gpu_b): bandwidth_in_GBps} self.links_map = gpu_links self.gpu_items = sorted({g for pair in gpu_links for g in pair}) self.adj_map = {g: [] for g in self.gpu_items} for (a, b), bw in gpu_links.items(): cost = 1.0 / bw # 带宽越大代价越小 self.adj_map[a].append((b, cost)) self.adj_map[b].append((a, cost)) def distance_from(self, src): """返回src到所有GPU的最短路径代价""" dist_map = {g: float('inf') for g in self.gpu_items} dist_map[src] = 0.0 pq = [(0.0, src)] while pq: d, u = heapq.heappop(pq) if d > dist_map[u]: continue for v, w in self.adj_map[u]: nd = d + w if nd < dist_map[v]: dist_map[v] = nd heapq.heappush(pq, (nd, v)) return dist_map def group_cost(self, group): """计算一组GPU内部两两最短路径代价之和""" total = 0.0 for g in group: dist_map = self.distance_from(g) for other in group: if other != g: total += dist_map[other] return total / 2.0 def select_best(self, need_count): """枚举所有GPU组合,选出组内通信代价最小的一组""" best_group = None best_cost = float('inf') for cand in combinations(self.gpu_items, need_count): cost = self.group_cost(cand) if cost < best_cost: best_cost = cost best_group = cand return best_group, best_cost def main(): # 8张GPU: 0~3在同机走NVLink(600GB/s), 4~7在同机走NVLink(600GB/s) # 3和4之间是跨节点的PCIe链路(32GB/s),专门用来模拟"慢速邻居" gpu_links = {} for i in range(3): gpu_links[(i, i + 1)] = 600.0 for i in range(5, 8): gpu_links[(i - 1, i)] = 600.0 gpu_links[(3, 4)] = 32.0 scheduler = TopologyAwareScheduler(gpu_links) group, cost = scheduler.select_best(4) print("推荐GPU组合:", group) print("组内平均通信开销:", round(cost, 4)) if __name__ == '__main__': main()
cost = 1.0 / bw带宽越大代价越小,把带宽数值统一成可加性代价。dist_map = {g: float('inf') for g in self.gpu_items}初始化所有 GPU 距离为“无穷大”,等价于地图上未到达的站点。for v, w in self.adj_map[u]:从当前 GPU 向外扩展邻居,一步一跳地“绘制最短路线”。total += dist_map[other]把组内所有两两 GPU 的最短路径代价累加,得到“特快小组”的绕路成本。for cand in combinations(self.gpu_items, need_count):枚举所有候选 GPU 组合,老周的“所有组合都列出来”在代码里就这一行。gpu_links[(3, 4)] = 32.0设置唯一的跨节点 PCIe 链路,带宽只有 NVLink 的约 1/19,特意让最优解偏向同机分组。
常见误区
误区我一直以为 GPU 集群里的卡都是一样的,随便挑 4 张卡就能组队训练,反正它们之间都能通信。
正解GPU 之间的通信路径差异巨大。同一 NVLink 域内的两张卡带宽可达数百 GB/s,跨 PCIe 交换机可能只有几十 GB/s,跨节点更是要经过网卡和交换机。把高频通信放到慢链路上,训练速度会成倍下降。就像老周把“特快小组”放到了不同楼层,货梯成了瓶颈。
为何常见:日常使用单机单卡或小型实验时,通信开销不明显;只有规模变大后,链路差异才暴露出来。
误区拓扑优化就是看带宽数字,带宽大的链路肯定快,所以小消息通信也不用担心。
正解小数据量通信(如控制信号、高频小梯度)主要受延迟影响,而不是带宽。NVLink 的优势不仅在带宽,更在低延迟。评估拓扑优劣时,要同时看单跳延迟和聚合带宽,否则会误判“看起来带宽够,实际却很慢”的场景。
为何常见:厂商宣传材料总是强调峰值带宽,延迟指标不容易被直观感知。
误区既然 NVLink 这么快,那拓扑感知调度就应该把所有通信都塞到 NVLink 上,PCIe 链路干脆不用。
正解拓扑感知的目标是“把高频高带宽的通信放到快链路上”,而不是完全禁用慢链路。PCIe 仍然适合低频控制流、小消息和备用路径;集群容量有限时,合理的跨域通信比“宁可空着也要等快链路”更高效。
为何常见:因为 NVLink 性能数字太突出,学习者容易把“优化”理解成“非黑即白”。
误区只要分配的是同一台服务器上的 4 张 GPU,它们之间就应该一样快,不用再看什么拓扑。
正解同一节点内还有更细的拓扑差异:有的卡直连 NVSwitch,有的卡挂在不同 PCIe switch 上,甚至跨 NUMA。多卡机型里常见“4 卡同域、另 4 卡跨域”的布局,调度粒度必须细到 NVLink domain,而不能只到节点。
为何常见:Kubernetes 等系统默认把“节点”当作最小调度单位,人们便误以为节点内部是均质的。
面试题
Q1. 关于 GPU 拓扑感知,以下说法正确的是?
- A.所有 GPU 之间互联速度完全相同
- B.调度时应优先把任务放在物理相邻 GPU 上← 正确答案
- C.拓扑感知只影响单卡推理速度
- D.链路带宽对分布式训练没有影响
答案:B。拓扑感知的核心就是“先看物理相邻关系再分配任务”,让通信密集的进程走更快的链路。A、C、D 都否定了链路差异和通信影响,与实际情况不符。
Q2. nvidia-smi topo -m 中的 “NV” 表示什么?
- A.普通 PCIe 链路
- B.无连接不可通信
- C.NVLink 直连← 正确答案
- D.以太网连接
答案:C。NV 代表两张 GPU 之间有 NVLink 直连,是最高速的一类拓扑关系。PIX/PHB/SYS 分别代表不同级别的 PCIe 关联,NV 与它们不同。
Q3. 以下哪些方式可以获取 GPU 拓扑信息?
- A.nvidia-smi 拓扑矩阵← 正确答案
- B.CUDA 查询 P2P 属性← 正确答案
- C.编解码器硬件加速
- D.nvidia-smi nvlink 状态← 正确答案
答案:ABD。拓扑矩阵和 NVLink 状态命令直接输出 GPU 间连接类型,CUDA 的 P2P 属性接口能查询点对点能力。编解码器加速是媒体处理功能,与卡间拓扑无关。
Q4. 以下哪类链路带宽通常最高?
- A.PCIe 4.0 x16
- B.NVLink 3.0 六链路← 正确答案
- C.千兆以太网
- D.SATA SSD
答案:B。NVLink 专为 GPU 间通信设计,3.0 六链路双向总带宽约 300 GB/s,远超 PCIe 4.0 x16 的约 32 GB/s。千兆以太网和 SATA 带宽更低,不在同一数量级。
Q5. All-to-All 通信模式对拓扑最敏感的主要原因是什么?
- A.只涉及两个 GPU
- B.全部 GPU 互相交换数据← 正确答案
- C.通信与拓扑完全无关
- D.只需一条链路完成
答案:B。All-to-All 要求每个 GPU 都和集合内其他 GPU 交换数据,整体性能被“最差链路”拖累。若若干对 GPU 之间的拓扑代价很高,全网通信就会变慢,因此对拓扑非常敏感。
Q6. 拓扑感知调度常见的优化目标包括哪些?
- A.高频进程对放 NVLink 域内← 正确答案
- B.尽量减少跨节点通信次数← 正确答案
- C.忽略链路只排空闲 GPU
- D.按亲和度代价最小化分配← 正确答案
答案:ABD。A、B、D 都是拓扑感知的典型目标:把高频通信放近处、减少跨节点、最小化代价。C 忽略链路,等于放弃拓扑信息,属于错误选项。
Q7. 小数据量通信时,以下哪个因素更容易成为主要开销?
- A.链路带宽大小
- B.通信延迟高低← 正确答案
- C.显存容量大小
- D.电源功耗高低
答案:B。小消息搬运时间很短,固定延迟(如握手、路由、驱动开销)占比更高。这就像包裹很小的时候,排队等货梯的时间远大于搬运本身的时间。
Q8. 以下哪项不是拓扑感知调度的预期收益?
- A.降低平均通信耗时
- B.提升集群整体吞吐
- C.消除所有通信延迟← 正确答案
- D.减少慢速链路占用
答案:C。拓扑感知能降低通信耗时、提升吞吐、把流量从慢链路移开,但无法“消除所有通信延迟”。只要数据需要跨 GPU 传输,延迟就客观存在,优化目标是让它们走在更快的路上。
Q9. 调度器拿到拓扑信息后,最合理的做法是什么?
- A.直接忽略拓扑并随机派发
- B.构建代价图并传给放置算法← 正确答案
- C.只按 GPU 空闲数排序分配
- D.把任务平均分到所有节点
答案:B。拓扑信息的价值在于被算法使用。调度器应把拓扑关系建成代价图,供放置算法优化。A、C、D 都丢弃了拓扑信息,不能体现感知能力。
Q10. 多节点集群中,若某任务每步只和邻居 GPU 交换数据,拓扑感知的主要收益是什么?
- A.把邻居约束在同域缩短延迟← 正确答案
- B.提升单卡 GPU 的主频
- C.减少显存分配的开销
- D.让网络跳数变得更多
答案:A。“只和邻居交换”意味着通信图是局部的,拓扑感知可以把这组邻居放进同一 NVLink/NVSwitch 域,缩短每跳延迟。主频、显存与拓扑无关,增加跳数则与优化目标相反。