实验 10: 使用虚拟 GPU 进行拓扑感知调度
进阶时长: 约 45 分钟环境: macOS (OrbStack) · Linux (Ubuntu + kind) · 无需 GPU费用: 免费验证于: 2026-07-20作者: @maishivamhoo123
本实验将带你在单节点本地集群上使用 nvml-mock 和 HAMi 模拟一套非对称的 PCIe 拓扑。你将启用 HAMi 的拓扑感知调度器,注入自定义的连接性分数来孤立某一张 GPU,然后验证:多 GPU 请求会避开这张被孤立的 GPU,而单 GPU 请求则会选中它。无需物理 GPU —— 一切都在本地 Kubernetes 集群内完成。
你将得到什么
完成本实验后,你将获得:
- 一个使用 nvml-mock 模拟 8 张 A100 GPU 的本地集群(HAMi 将每张 GPU 切分为 10 份后共 80 个虚拟槽位)
- 从已验证的提交构建并安装 HAMi,启用拓扑感知调度(
gpuSchedulerPolicy=topology-aware) - 一个节点注解(
hami.io/node-nvidia-score),定义了一套自定义拓扑,其中 GPU7 与其余所有 GPU 的连接都很差 - 证明调度器在为单个 Pod 分配 2 张 GPU(多 GPU 请求)时会避开 GPU7,而在单 GPU 请求时会选中 GPU7 —— 这两种行为都来自同一个
topology-aware策略,无需额外开关 - 通过调度器自身日志洞察其拓扑决策过程
备注
本实验中的虚拟 GPU 拓扑分数是人为构造的 —— nvml-mock 默认上报对称的连接性,我们手动覆盖节点注解来人为制造一张"连接最差"的 GPU。本实验验证的是调度器针对已知拓扑的处理逻辑,而不是真实的 PCIe/NVLink 测量结果。
分数方向很重要。 在 HAMi 实际的调度代码中(pkg/device/nvidia/device.go),成对分数越高代表连接性越好(类似 NVLink),分数越低代表越差。多 GPU 请求会选择总分最高的组合(通过 computeBestCombination);单 GPU 请求会选择分数最低的设备(通过 computeWorstSingleCard)—— 这两条路径都由 Fit() 中同一个 needTopology 判断门控,完全由 gpuSchedulerPolicy=topology-aware 驱动。单 GPU 评分没有单独的开关;策略一旦设置,它默认就是开启的。为了让 GPU7 成为连接最差的设备,我们把它的分数设在 50 基准线以下,而不是以上。