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% 的显存(如果它们都在同一张卡上),但这通常只适合非常小的模型。对于大模型,物理隔离(一卡一模型) 是王道。

Logo

免费领 100 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐