type
status
date
slug
summary
tags
category
icon
password
URL
在跑vllm ,tp≥2的时候碰到进程hang住的问题,大概率是死锁了,去搜了一下文档,是NCCL的问题,记录一下:
问题复现:
 
IO 虚拟化(如 VT-d 或 IOMMU)可能会干扰 GPU Direct,因为它会将所有 PCI 点对点通信重定向到 CPU 的根复杂结构(root complex)。 所以可能导致死锁。

1. PCI Point-to-Point

  • 指的是 PCIe 总线上的设备之间直接通信,比如:
    • GPU ↔ NIC(网卡)
    • GPU ↔ GPU(用于 GPUDirect P2P)
  • “点对点” 是指设备之间直接传输数据,不经过 CPU 或内存系统(即不是 CPU 中转)。

2. CPU Root Complex(根复杂结构)

  • CPU 的一部分,负责 连接和管理 PCIe 设备
  • 它是 PCIe 总线的起点,相当于总线的“主控端口”。
  • 所有 PCIe 设备默认都挂在 root complex 下,但点对点传输并不一定非要通过它。

3. IOMMU / VT-d

  • IOMMU(Input-Output Memory Management Unit),英特尔叫 VT-d。
  • 它的功能是:
    • 让设备访问内存时做地址映射(用于虚拟化环境、安全隔离)
    • 重定向或拦截设备间通信,以便 CPU 能“控制和检查”这些通信。
 
下面命令查看ACS有没有打开
禁用了就没有死锁的问题了。
禁用
 
GPU Direct 通信有几种方式,
GPU-to-GPU communication
GPU-to-NIC communication
PCI Access Control Services (ACS)
 
GPU p2p,
GPU-A → GPU-B
GPU-A device memory → GPU-B device memory
 
 
不用GPU p2p,
GPU-A → Host Memory → GPU-B
GPU-A device memory → CPU (host memory) → GPU-B device memory
 
 
backup