Prhub

#43270 [Misc][NUMA] Auto-bind to PCT priority cores on DGX B300 + widen EngineCore across shard NUMA nodes

原始 PR 作者 vadiklyutiy 合并时间 2026-05-29 10:07 文件变更 3 提交数 7 评论 23 代码增减 +622 / -33

执行摘要

Auto-bind PCT & widen EngineCore NUMA

在 NUMA 架构的多 GPU 系统中,vLLM 使用 --numa-bind 将 worker 绑定到 GPU 所在 NUMA 节点以优化内存局部性。但存在两个问题:

  1. EngineCore(所有 worker 的父进程)之前只绑定第一个 GPU 的 NUMA 节点,导致其他 NUMA 节点的 worker 无法绑定到本节点 CPU(numactl --physcpubind 要求目标 CPU 在父进程的 cpus_allowed 内)。
  2. 在 DGX B300(Xeon 6776P)上存在 Priority Core Turbo 特性,部分核心频率更高(~4.6 GHz vs ~2.3 GHz),但 Linux 内核尚未暴露 PCT 成员信息,vLLM 无法自动利用这些高性能核心。
    PR 旨在以零配置方式解决这两个问题,提升 NUMA 绑定场景下的性能和可靠性。

值得精读。PR 展示了零配置性能优化的工程思路,特别是在内核接口不完整时如何设计可降级的启发式方法。代码质量高,注释丰富,测试周密。特别是 EngineCore 绑定问题的根因分析和修复方法,对理解 NUMA 绑定机制很有帮助。

讨论亮点
  1. PCT 硬编码可扩展性 (design, importance 8)
    - Harry-Chen 指出:“IIUC, the HP cores can be adjusted dynamically. So hardcoding numbers will not work.” 并建议扩展到 6962P、6774P 等更多 SKU。
    - vadiklyutiy 回应:“Agree with that. But I don't have access to 6962P and 6774P… Linux kernel unfortunately doesn't expose PCT info clearly (at least without root).” 最终采用了 SKU 字典并警告失败关闭,后续在跟踪 issue 中计划用通用方法替代。

  2. EngineCore 绑定策略 (correctness, importance 9)
    - gemini-code-assist 指出:“if other workers… assigned to different CPUs (especially on different NUMA nodes), their numactl calls will fail…” 要求 EngineCore 避免特定 CPU 固定。
    - Harry-Chen 最初询问“I do not quite get the idea of treating an engine core process specially”,之后阅读 PR 描述后表示理解。最后设计为 EngineCore 不再使用 --physcpubind 绑定到第一个 worker 的 CPU,而是使用 --cpunodebind 覆盖所有相关 NUMA 节点。

  3. 返回类型选择 (style, importance 4)
    - Harry-Chen 建议 _maybe_get_pct_cpu_binding 返回 list[int] 更自然。vadiklyutiy 修改。

  4. process_kind 防御性检查 (correctness, importance 5)
    - Harry-Chen 要求当 process_kind 既非 Worker 也非 EngineCore 时抛错或告警。vadiklyutiy 添加了异常。

实现拆解

  1. 重构 _get_numactl_args 拆分 worker 与 EngineCore 逻辑
    - 原函数被拆分为 _get_numactl_worker_args_get_enginecore_numa_nodes + 组件,明确区分两种进程的绑定策略。
    - configure_subprocess 根据 process_kind 选择不同路径;当 process_kind 不是 WorkerEngineCore 时,抛出错误避免意外绑定。

  2. EngineCore 绑定范围扩展
    - 新增 _get_enginecore_numa_nodes:根据 parallel_config 和 DP local rank,计算当前 shard 涉及的所有唯一的 NUMA 节点。
    - 在 _get_numactl_enginecore_args 中生成 --cpunodebind=<nodes> --membind=<nodes>(或 --physcpubind=<cpus> --membind=<nodes>),覆盖整个 shard 的 NUMA 节点集,确保每个 worker 的绑定列表是 EngineCore 的子集。
    - 对于 Ray / external_launcher 等分布式后端,扩展为所有本地 NUMA 节点,保持类似约束。

  3. PCT 自动检测与绑定
    - 定义 _PctSku NamedTuple 和 _PCT_CAPABLE_SKUS 字典,硬编码已知 PCT 兼容 SKU(6776P、6774P、6962P)的 highest_perfpriority_stride
    - 延迟加载函数 _pct_sku_config(带 cache)读取 /proc/cpuinfo/sys/devices/system/cpu/cpu0/acpi_cppc/highest_perf,判断当前 CPU 是否匹配任意已知 SKU。
    - _maybe_get_pct_cpu_binding 根据 SKU 的 stride,在每个 NUMA 节点内过滤出候选 PCT 核心(cpu_id % stride in (0, 1)),返回它们跨请求节点的并集。
    - 此结果在 _get_cpu_binding 中回退:如果用户显式指定 --numa-bind-cpus 则使用用户值,否则尝试 PCT 自动检测失败则回退到 --cpunodebind

  4. 配置文档更新
    - 在 vllm/config/parallel.pynuma_bind 字段注释中说明 PCT 自动绑定行为。

  5. 测试覆盖
    - 在 tests/utils_/test_numa_utils.py 中增加 PCT 测试组,mock /proc/cpuinfoacpi_cppc,验证每个已知 SKU 的检测、核心过滤和失败关闭路径。
    - 使用 _disable_pct_by_default 自动夹具确保测试环境不因宿主机真实 PCT 而误触发。

文件 模块 状态 重要度
vllm/utils/numa_utils.py NUMA 工具 modified 8.84
tests/utils_/test_numa_utils.py 测试 modified 7.52
vllm/config/parallel.py 配置模块 modified 5.07

关键符号

_maybe_get_pct_cpu_binding _get_enginecore_numa_nodes _get_numactl_worker_args _pct_sku_config _get_cpu_binding

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

PCT SKU 硬编码的局限性 设计

Harry-Chen 指出只检测 6776P 不够,应支持更多 PCT 型号,且核心频率可动态调整,硬编码值不可靠。vadiklyutiy 回应因缺少硬件和内核接口限制,先以失败关闭方式加入已知 SKU,并创建跟踪 issue 以便后续改用通用方法。

结论:接受当前方案,但要求扩展 SKU 表到 6776P/6774P/6962P,并明确注释这是过渡方案。 · 已解决

EngineCore 绑定策略讨论 正确性

gemini-code-assist 指出若 EngineCore 绑定到第一个 worker 的 CPU,其他 NUMA 节点的 worker 会因 cpus_allowed 不足而失败。Harry-Chen 先不理解为何需要特殊处理,阅读 PR 描述后确认问题。最终重构为 EngineCore 绑定到整个 shard 的 NUMA 节点集,不指定具体 CPU。

结论:采用 EngineCore 跨 NUMA 节点绑定的方案,避免子进程绑定失败。 · 已解决

风险与影响

  1. 特定平台依赖:PCT 检测仅对硬编码的 Xeon 6776P/6774P/6962P 生效;如果 Intel 未来发布新 SKU,检测因模型名不匹配会静默降级到 --cpunodebind,不会错误绑定,但失去 PCT 优化。需按跟踪 issue 计划改用通用方法。
  2. 内核差异/sys/devices/system/cpu/cpu0/acpi_cppc/highest_perf 仅在特定内核版本和配置下存在;某些系统可能缺失此文件导致 OSError,代码已处理为失败关闭。
  3. EngineCore 扩展:跨 NUMA 节点绑定可能使 EngineCore 的内存分配在远程节点上,略微增加延迟,但实际测试显示 TTFT 和 TPOT 大幅改善,权衡正向。
  4. 测试 Mock 风险:大量的 mock 可能掩盖真实系统上的行为差异,建议在 DGX B300 上持续运行集成测试。

影响范围:仅当启用 --numa-bind 时生效,对单 GPU 或非 NUMA 系统无影响。主要受益平台为 DGX B300 等具有 PCT 的双插槽服务器。
性能影响:在 DGX B300 上测试,吞吐提升 64.4%,TTFT 降低 40%,TPOT 降低 46.2%(TP=8, EP, FlashInfer, Qwen3.5-397B)。
维护影响:新增约 300 行 NUMA 工具代码和 340 行测试,逻辑集中且文档清晰,但硬编码 SKU 表需跟踪 Issue #43775 的后续统一方案。

特定平台依赖 硬编码 SKU 表需维护 仅 --numa-bind 生效 可能的内核版本差异

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论