【杂记】vLLM如何指定GPU单卡/多卡离线推理

写在前面

仅作个人学习与记录用。主要记录vLLM指定GPU单卡/多卡离线推理的方法。


vLLM官方文档中Environment Variables页面有对指定GPU方法的唯一描述:

bash 复制代码
# used to control the visible devices in the distributed setting
"CUDA_VISIBLE_DEVICES":
lambda: os.environ.get("CUDA_VISIBLE_DEVICES", None),

在vLLM离线推理(Offline Inference)时,可以通过设置tensor_parallel_size = 1/2/3...,来使用默认的单卡GPU或多卡GPU来推理。但是如果想在指定的单卡/多卡GPU中运行vLLM,那么应该如何以及在哪里设置CUDA_VISIBLE_DEVICES?

一般来说,使用下面三种方法就可以了:

shell指定:

bash 复制代码
CUDA_VISIBLE_DEVICES=3  python train.py

另一种shell指定(不推荐):

bash 复制代码
export CUDA_VISIBLE_DEVICES=3  
python train.py

代码内部指定:

python 复制代码
import os
os.environ["CUDA_VISIBLE_DEVICES"]="3"

但是在实际执行代码过程中,可能存在失效的情况。即无论怎么修改可见的GPU编号,最后程序都是按照顺序从第0块开始使用。问题出在哪里呢?

假设一共有四卡,先使用nvidia-smi -L查看可用GPU及序号:

bash 复制代码
GPU 0: GeForce RTX XXX (UUID: xxx)
GPU 1: GeForce RTX XXX (UUID: xxx)
GPU 2: GeForce RTX XXX (UUID: xxx)
GPU 3: NVIDIA XXX (UUID: xxx)

而在代码中测试,会得到:

python 复制代码
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
import torch
print(torch.cuda.get_device_name(0))  # 返回GPU名称,设备索引默认从0开始
print(torch.cuda.current_device())  # 返回现在使用的GPU索引

输出:
1
GeForce RTX XXX
0
python 复制代码
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import torch
print(torch.cuda.get_device_name(0))  # 返回GPU名称,设备索引默认从0开始
print(torch.cuda.current_device())  # 返回现在使用的GPU索引

输出:
NVIDIA XXX
0

这是因为nvidia-smi命令中的GPU序号与代码中的GPU序号是相反的,nvidia-smi的 GPU序号默认使用PCI_BUS_ID,而py文件代码默认GPU序号遵循FASTEST_FIRST。

那么可以修改上述指定方式如下:

shell指定:

bash 复制代码
CUDA_VISIBLE_DEVICES=3 export CUDA_DEVICE_ORDER="PCI_BUS_ID" python train.py

另一种shell指定(不推荐):

bash 复制代码
export CUDA_VISIBLE_DEVICES=3  
export CUDA_DEVICE_ORDER="PCI_BUS_ID"
python train.py

代码内部指定:

python 复制代码
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "3"

另外需要注意,如果你在离线推理时import了pytorch等包,最好将os.environ["CUDA_VISIBLE_DEVICES"] = "3"移到import torch等代码之前,紧随import os之后,即按照如下的方式:

python 复制代码
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="3"
import torch
......
相关推荐
Hi2024021722 分钟前
Vortex CUDA 生态适配:让 CUDA C、CUTLASS 与 Triton 在 RISC-V GPGPU 上运行
人工智能·risc-v·gpgpu
龙腾AI白云3 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票3 小时前
企业对接AI合同审查系统的工程实践
人工智能
上海广测检测科技有限公司4 小时前
欧盟NIS2指令对中国制造商的供应链合规传导:判定边界与Article 21十条措施解读
经验分享
admin and root4 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA4 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
XLYcmy4 小时前
AI 时代,MOM(制造运营管理系统)该如何演进? 下
ai·llm·agent·智能制造·数字孪生·mom·harness
璞致电子4 小时前
基于 P201Pro 的 QPSK 无线收发|接收端基础知识 (2):从混乱星座到 QPSK 点簇,Costas‑Loop 载波同步 GNU Radio 实测
经验分享
happylifetree4 小时前
Python09:核心语法-数据存储与运算-字面量
python
跨境小彭4 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营