一张16GB的消费级显卡能同时干多少活?有人用RTX 5080做了个实验:不改装任何推理引擎,不写Python或Rust,只用150行shell脚本加现成的路由网关,就让三个小语言模型共享同一张卡对外服务。
这个数字是实测的,不是估算。所有结果来自可复现的代码仓库,每个配置都标注了具体参数,没干净测到的数据会特别说明。
核心发现
三个结论很直接:
第一,0.5B参数的模型在CUDA图开启、并发48的情况下,吞吐量能到12800 token/秒。
第二,把内存从全部分配砍到只给三分之一,吞吐量几乎没变化——12766对12838 token/秒。
第三,前缀缓存在prefill重的场景下让吞吐量翻倍;但缓存感知路由在某种情况下比简单轮询慢了20%。
为什么16GB能塞下多个模型
量化后的小模型体积很夸张。1B级别的模型大概0.5到2GB,16GB显存放三四个绰绰有余。真正的难题不是能不能放下,而是怎么优雅地摆放和调度。
这里的关键认知是:路由器只管路由,不管放置。
NVIDIA Dynamo、vLLM自带的路由、Shepherd Model Gateway这些成熟方案,都能提供OpenAI兼容的端点,也能做缓存感知和负载均衡的路由。但它们有个前提——后端的工作节点已经启动好了。它们不会帮你启动进程,也不会帮你切分GPU内存。
所以"多模型单卡"其实只需要解决放置问题:启动N个模型服务,每个限制好内存上限确保能共存,然后注册到网关。这活儿一个shell脚本就能搞定:
客户端 → SMG(复用的二进制) → N个vLLM工作进程跑在同一张卡上
↑ 一个15行左右的bash启动器负责放置和注册
整个服务链路没有Python,没有Rust,只有shell和复用的二进制文件。唯一的Python是用来离线渲染图表的,不在服务路径里。
实验跑了三个对话模型:Qwen2.5-0.5B-Instruct、Qwen2.5-1.5B-Instruct、SmolLM2-360M-Instruct,共存在同一个网关后面,按模型名路由。
5080上踩过的三个坑
第一个是flashinfer的JIT编译依赖。它需要ninja和nvcc在PATH里。如果从干净的venv路径直接启动vLLM工作进程,会在内核编译时报FileNotFoundError: 'ninja'。必须先激活venv,再把CUDA toolkit加到PATH。
第二个是并发启动的竞态问题。vLLM启动时会按总内存测量--gpu-memory-utilization,两个同时启动就会抢资源,结果一个报"No available memory for the cache blocks"。得串行启动,每个健康检查通过后再起下一个。
第三个是CUDA图的内存开销。三个模型同时开CUDA图,16GB会OOM。想共存三个模型,要么关掉图优化(加--enforce-eager),要么减少模型数量。
发现一:内存分配不是瓶颈
这是控制变量测的。同一个0.5B模型,一次给满GPU内存,一次只给30%,其他条件全一样(并发48,CUDA图开启):
12766 vs 12838 token/秒——误差范围内。这个并发度下KV缓存还不是瓶颈,所以压缩它给邻居腾地方,性能没损失。
热门跟贴