VLLM启动时NCCL遇到显卡P2P通信问题

背景

使用Xinference(VLLM)启动Qwen1.5-110b-awq模型,需要把模型加载到多块显卡上。

系统配置

1
2
3
4
5
6
7
8
OS: Ubuntu 24.04 LTS x86_64 
Kernel: 6.8.0-31-generic 
Shell: bash 5.2.21 
CPU: AMD Ryzen Threadripper 7960X 
GPU: NVIDIA RTX 6000 Ada Generation 
GPU: NVIDIA RTX 6000 Ada Generation 
GPU: NVIDIA RTX 6000 Ada Generation 
Memory: 26786MiB / 257222MiB 

症状

开机之后,第一次启动多卡的模型可以正常启动,但是模型退出之后,要再次启动,就会卡住。显卡利用率100%,不占用显存,CPU线程占满核心。但是只占用单卡的模型不受影响。

按照 https://docs.vllm.ai/en/stable/getting_started/debugging.html 打开vllm日志,最后的日志卡在NCCL的Init COMPLETE。使用vllm debugging指南的test.py,情况相同。

不打卡调试日志,运行输出卡在:

1
(VllmWorkerProcess pid=2602361) INFO 07-12 19:04:18 pynccl.py:63] vLLM is using nccl==2.20.5

打卡调试日志,进一步看到:

1
2
nvidia5:3312182:3312204 [0] NCCL INFO comm 0x5654d4843400 rank 0 nranks 2 cudaDev 0 nvmlDev 2 busId 41000 commId 0x737ce38e08817c77 - Init COMPLETE
nvidia5:3312183:3312205 [1] NCCL INFO comm 0x561a161881d0 rank 1 nranks 2 cudaDev 1 nvmlDev 3 busId 61000 commId 0x737ce38e08817c77 - Init COMPLETE

尝试

相关issue:

使用NCCL_P2P_DISABLE=1 选项,禁用显卡的P2P通信。模型能够成功加载,但是推理的时候还是会报错。这时候可以确定,就是显卡间的通信问题。在ada lovelace系列显卡中,游戏卡被禁用了P2P,但是工作站卡是支持P2P的,于是不打算走禁用P2P路子继续调下去,找找看P2P出了什么问题。

解决

最后再NCCL文档的Troubleshooting里找到了答案:https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/troubleshooting.html#pci-access-control-services-acs

IO virtualization (also known as VT-d or IOMMU) can interfere with GPU Direct by redirecting all PCI point-to-point traffic to the CPU root complex, causing a significant performance reduction or even a hang. You can check whether ACS is enabled on PCI bridges by running:

1
sudo lspci -vvv | grep ACSCtl

重启,进入BIOS,关闭IOMMUPCI ACS。再次启动,就恢复正常了。

Built with Hugo
主题 StackJimmy 设计