vllm同时开多个模型
对于双卡 4090D请使用Docker 容器化部署或多进程脚本。容器 A(端口 8000):绑定,跑模型 A。容器 B(端口 8001):绑定,跑模型 B。这是最干净、最不容易报错的方式。使用 vLLM 的LoRA 功能。3、如果显存不够分怎么办?利用 vLLM 的参数。例如,你可以强制两个模型都只使用 50% 的显存(如果它们都在同一张卡上),但这通常只适合非常小的模型。对于大模型,物理隔离(一
vLLM 本身的设计是“一个进程服务一个模型”,要实现“同时开多个模型”,通常有两种主流做法。针对双卡 RTX 4090D (24GB x 2) 的硬件配置,有以下具体建议:
方法一:启动多个独立的 vLLM 实例(最推荐,最稳定)
这是生产环境中最常用的方法。原理很简单:就像你同时打开两个不同的软件一样,你启动两个 vLLM 进程,分别监听不同的端口,并指定它们使用不同的显卡(或切分同一张显卡的显存)。
1. 为什么推荐?
隔离性好:模型 A 崩溃了不会影响模型 B。
配置灵活:你可以给模型 A 分配 1 张卡,给模型 B 分配 1 张卡;或者让它们共享显存。
兼容性好:不需要复杂的配置,完全符合 vLLM 的原生逻辑。
2. 在你的双卡 4090D 上如何操作?
假设你想同时跑 Qwen-32B(大模型)和 Qwen-7B(小模型)。
步骤 1:启动大模型(占用双卡)
让大模型使用张量并行(TP=2),横跨两张显卡。
CUDA_VISIBLE_DEVICES=0,1 vllm serve Qwen-32B-Instruct \
--tensor-parallel-size 2 \
--port 8000 \
--gpu-memory-utilization 0.85
步骤 2:启动小模型(强制指定只用其中一张卡,或者只用CPU?不,这很难)
注意:如果大模型已经占满了两张卡,小模型就没地方跑了。
修正方案(显存切分):
如果你必须同时跑,你需要限制大模型的显存占用,或者让它们“挤”在一起。
但在双卡 4090 上,最稳妥的策略是“一卡一模型”:
命令示例(一卡一模型):
# 终端 1:在显卡 0 上启动模型 A
CUDA_VISIBLE_DEVICES=0 vllm serve Qwen-7B-Instruct --port 8000 --gpu-memory-utilization 0.9
# 终端 2:在显卡 1 上启动模型 B
CUDA_VISIBLE_DEVICES=1 vllm serve Llama-3-8B-Instruct --port 8001 --gpu-memory-utilization 0.9
显卡 0:跑 Qwen-32B-Int4 (需量化) 或 Llama-3-8B。
显卡 1:跑 Qwen-7B 或其他小模型。
方法二:使用 LoRA 适配器(高级玩法)
如果你指的“多个模型”是同一个基座模型的不同微调版本(例如:都是 Qwen-7B,一个是“写作版”,一个是“代码版”),vLLM 支持 LoRA 动态切换。
原理:只加载一个基座模型(占用显存),然后动态加载不同的 LoRA 权重(占用极小显存)。
优点:显存占用极低,切换速度极快(毫秒级)。
限制:基座必须相同。你不能在一个进程中同时加载 Qwen 和 Llama。
方法三:单进程多模型(不推荐/实验性)
虽然极少数脚本或旧版本尝试过在一个 Python 脚本里初始化多个 LLM 对象,但这在 vLLM 中是不推荐的:
显存管理困难:vLLM 启动时会预分配显存(KV Cache),多个实例在同一个进程中抢显存极易导致 OOM(爆显存)。
阻塞风险:一个模型在推理时可能会阻塞另一个模型的初始化。
总结
对于双卡 4090D:
1、如果你想同时服务两个完全不同的模型(如 Qwen 和 Llama):
请使用 Docker 容器化部署 或 多进程脚本。
- 容器 A(端口 8000):绑定
--gpus '"device=0"',跑模型 A。 - 容器 B(端口 8001):绑定
--gpus '"device=1"',跑模型 B。
这是最干净、最不容易报错的方式。
2、如果你想做 AB 测试(同一个模型的不同版本):
使用 vLLM 的 LoRA 功能。
3、如果显存不够分怎么办?
利用 vLLM 的 --gpu-memory-utilization 参数。例如,你可以强制两个模型都只使用 50% 的显存(如果它们都在同一张卡上),但这通常只适合非常小的模型。对于大模型,物理隔离(一卡一模型) 是王道。
更多推荐


所有评论(0)