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

news/2024/11/25 0:55:14/

写在前面

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


LLM.html" title=vLLM>vLLM官方文档中Environment Variables页面有对指定GPU方法的唯一描述:

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

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

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

shell指定:

CUDA_VISIBLE_DEVICES=3  python train.py

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

export CUDA_VISIBLE_DEVICES=3  
python train.py

代码内部指定:

python">import os
os.environ["CUDA_VISIBLE_DEVICES"]="3"

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

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

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指定:

CUDA_VISIBLE_DEVICES=3 export CUDA_DEVICE_ORDER="PCI_BUS_ID" python train.py

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

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
......

http://www.ppmy.cn/news/1549677.html

相关文章

微软在Ignite 2024发布Copilot+新功能

🦉 AI新闻 🚀 微软在Ignite 2024发布Copilot新功能 摘要:微软在Ignite 2024大会上宣布,Microsoft 365 Copilot将利用Copilot PC中的NPU本地运行AI模型,减少网络依赖。此功能将提升用户在Outlook和Word中的AI写作辅助…

Dockerfile复制目录进入镜像里

使用 ADD 复制目录进入镜像里 FROM ubuntu:22.04WORKDIR /rootRUN mkdir -p ./custom_nodes/ComfyUI-FluxTrainerADD ComfyUI-FluxTrainer ./custom_nodes/ComfyUI-FluxTrainerComfyUI-FluxTrainer 是一个目录,需要先 mkdir 创建这个目录,然后ADD 复制进…

php常用伪协议整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理php常见的伪协议 php伪协议介绍 直观点,就是php可以识别的协议。 类似于我们访问网站的http协议,我们用浏览器访问我们自己本地文件的file协议等。 php可以识别这些协议&#xf…

C语言——break、continue、goto

目录 一、break 二、continue 1、在while循环中 2、在for循环中 三、go to 一、break 作用是终止循环&#xff0c;在循环内遇到break直接就跳出循环。 注&#xff1a; 一个break语句只能跳出一层循环。 代码演示&#xff1a; #include<stdio.h>void test01() {for (…

Elasticsearch 分词器

一、分词器的作用 分词器&#xff08;Analyzer&#xff09;是Elasticsearch中用于文本分析与处理的组件。它的主要作用是将用户输入的一段文本&#xff0c;按照一定逻辑分析成多个词语。这个过程也叫做文本分析或文本切分。 二、分词器的构成 分词器由三部分组成&#xff1a…

【计算机网络】解决bind error

服务器有时可以立即重启&#xff0c;有时候无法立即重启 — bind error 首先要知道&#xff1a;四次挥手动作完成之后&#xff0c;主动断开连接的一方要维持一段时间的TIME_WAIT bind error原因&#xff1a;因为是服务器主动断开的&#xff0c;所以服务器要去维持TIME_WAIT状…

【element-tiptap】Tiptap编辑器核心概念----内容、扩展与词汇

前言&#xff1a;本篇文章继续来讲Tiptap编辑器的核心概念&#xff0c;主要是内容、扩展、词汇相关的概念 &#xff08;一&#xff09;内容 文档内容被存储在编辑器实例的 state 属性中。所有的修改都会以事务 transaction 的形式应用于 state。state 详细介绍了当前的内容、…

java编程开发基础,正则表达式的使用案例Demo

java编程开发基础,正则表达式的使用案例Demo!实际开发中&#xff0c;经常遇到一些字符串&#xff0c;信息的裁剪和提取操作&#xff0c;正则表达式是经常使用的&#xff0c;下面的案例&#xff0c;可以帮助大家快速的了解和熟悉&#xff0c;正则表达式的使用技巧。 package com…