Prhub

#40015 [ROCm] Implement GPU-to-NUMA-node detection

原始 PR 作者 pschlan-amd 合并时间 2026-04-23 23:08 文件变更 2 提交数 12 评论 10 代码增减 +31 / -3

执行摘要

ROCm 平台 GPU-to-NUMA 自动检测

实现自动 NUMA 拓扑检测,使用已存在的 amdsmi 依赖,避免用户手动指定 NUMA 节点。PR body 提到“Implement automatic NUMA topology detection on ROCm platforms via the amdsmi library”。

建议阅读代码实现,注意其与现有平台后端的一致性。对于 ROCm 平台用户,此 PR 可用;但建议后续增加单元测试和完善异常处理。

讨论亮点

gemini-code-assist[bot] 指出 get_all_device_numa_nodes 方法缺少 @with_amdsmi_context 装饰器,可能导致库未初始化。同时建议将 amdsmi_get_processor_handles 调用移出循环,避免重复调用。

另一评论指出错误处理逻辑错误:amdsmi_topo_get_numa_node_number 在失败时抛出 AmdSmiException 而非返回 None,导致 if numa_node is None: 成为死代码,且通用异常捕获无法定位具体 GPU。

作者 pschlan-amd 回应:该装饰器模式与平台文件中其他方法一致,且若 amdsmi 初始化失败,引擎也会在其他地方崩溃。

实现拆解

  1. 新增 amdsmi 函数导入:在 vllm/platforms/rocm.py 的 try-except 块中增加 amdsmi_topo_get_numa_node_number 的导入。
  2. 实现 get_all_device_numa_nodes 类方法:带有 @classmethod@with_amdsmi_context 装饰器,通过 amdsmi_get_processor_handles() 获取处理器句柄,遍历所有可见 GPU,调用 amdsmi_topo_get_numa_node_number 获取 NUMA 节点,异常时返回 None 并记录警告。
  3. 更新文档:在 docs/configuration/optimization.md 中将自动 GPU-to-NUMA 检测支持平台从仅 CUDA/NVML 修改为包括 ROCm。
文件 模块 状态 重要度
vllm/platforms/rocm.py 平台适配 modified 6.93
docs/configuration/optimization.md 文档 modified 2.19

关键符号

get_all_device_numa_nodes

关键源码片段

vllm/platforms/rocm.py core-logic

核心实现文件,新增 `get_all_device_numa_nodes` 方法完成 NUMA 检测。

# vllm/platforms/rocm.py
@classmethod
@with_amdsmi_context
def get_all_device_numa_nodes(cls) -> list[int] | None:
    """Get NUMA nodes for all visible GPU devices."""
    try:
        handles = amdsmi_get_processor_handles()
        numa_nodes = []
        for device_id in range(cls.device_count()):
            physical_device_id = cls.device_id_to_physical_device_id(device_id)
            try:
                # 通过 amdsmi 查询每个 GPU 的 NUMA 节点
                numa_node = amdsmi_topo_get_numa_node_number(
                    handles[physical_device_id]
                )
            except AmdSmiException as e:
                # 若单个 GPU 查询失败,记录警告并禁用自动绑定
                logger.warning(
                    "Could not detect NUMA node for GPU %d, "
                    "disabling automatic NUMA binding: %s",
                    device_id, e,
                )
                return None
            numa_nodes.append(numa_node)
        return numa_nodes
    except Exception as e:
        logger.warning("Failed to get NUMA nodes for GPUs: %s", e)
        return None

评论区精华

缺失 @with_amdsmi_context 装饰器 正确性

gemini-code-assist[bot] 指出新方法缺少装饰器,可能导致 amdsmi 库未初始化而运行时错误。

结论:作者后在最终版本中添加了装饰器。 · 已解决

amdsmi_topo_get_numa_node_number 异常处理错误 正确性

gemini-code-assist[bot] 指出该函数在失败时抛出异常而非返回 None,导致死代码且通用异常掩盖具体 GPU 错误。

结论:作者未回应此问题,最终代码仍使用 try-except 捕获 AmdSmiException(改为正确方式),但未完全解决。 · unresolved

装饰器在 amdsmi 缺失时可能导致崩溃 正确性

gemini-code-assist[bot] 警告若 amdsmi 导入失败,装饰器引发异常不被内部 try-except 捕获,可能导致引擎启动崩溃。

结论:作者解释该模式与平台其他方法一致,且如果 amdsmi 失败引擎也难以继续。 · 已解决

风险与影响

  1. 依赖风险:若 amdsmi 库未安装或初始化失败,@with_amdsmi_context 装饰器可能在方法体执行前抛出异常,而调用方 numa_utils.py 未包裹 try-except,可能导致引擎启动崩溃。
  2. 错误处理不完善:当前异常捕获逻辑中,单 GPU 检测失败时直接返回 None 并终止后续检测,无法提供清晰的分设备错误信息。
  3. 缺少测试覆盖:本次变更未新增测试文件,无法验证 NUMA 检测逻辑的正确性及异常路径。

对 ROCm 平台用户:在使用 --numa-bind 时,无需手动指定 NUMA 节点,提升易用性。对其他平台无影响。改动量小(+31/-3),风险可控。

依赖 amdsmi 库 缺少测试覆盖 错误处理不完善

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论