最近被一个27B级别的模型部署需求搞得头大,正好手头同时拿到了几块不同价位、不同架构的卡,干脆做了一次四卡横评。测试对象是Qwen3.8-27B,参数量27B,属于“大不小、小不大”的尴尬档位——消费级24G卡跑满血FP16吃不下,量化后又有点浪费算力。参与测试的卡分别是RTX 3090 24G、魔改RTX 4090 48G、最新的RTX 5090 32G,以及数据中心老将Tesla V100 32G。这篇文章不搞虚的,直接把部署配置、实测数据、踩坑记录全摊开讲,给正在纠结本地部署27B模型怎么选卡的朋友一个参考。
为什么要做这个横评?因为Qwen3.8-27B这个体量的模型,正好卡在所有“显卡选择困难症”的临界点上。往下看,13B、14B的模型,随便一张16G显存的卡就能跑得飞起;往上走,70B以上的模型,基本就是双卡或多卡互联的天下了。27B夹在中间,既考验显存容量,又考验显存带宽,还考验量化后的精度损失控制。四张卡分别代表四种完全不同的路线:3090是“二手性价比战神”,4090 48G是“魔改大显存路线”,5090 32G是“最新架构尝鲜”,V100 32G则是“老黄历数据中心卡”。它们的价格、性能、适用场景差异巨大,放在一起对比才有意思。
1. 横评背景与测试平台搭建
1.1 为什么偏偏是这四张卡
先说选卡逻辑。Qwen3.8-27B在FP16精度下,权重文件大约需要54GB显存,这已经远超任何单张消费级显卡的容量了。所以实际部署时几乎必然要走上量化路线。在常见的量化精度下,INT8权重大约27GB,INT4权重大约14GB。这样一看,四张卡就分出了明显的派别:
- RTX 3090 24G:只能跑INT4量化,显存勉强够用,胜在二手价格便宜,是很多人“先花小钱体验本地大模型”的首选。
- RTX 4090 48G:魔改版,可以跑FP16或INT8。实际上手发现,它的48G显存正好卡在27B模型FP16的甜点上,不需要量化就能跑,精度损失和部署复杂度都最低。
- RTX 5090 32G:新卡,价格最高。32G显存跑INT8是极限,但胜在架构新、显存带宽几乎翻倍,生成速度上可能有惊喜。
- Tesla V100 32G:老数据中心卡,32G HBM2显存,没有视频输出接口,但显存带宽依然能打,二手价格也不算离谱。
这四张卡放在一起,其实是在回答几个核心问题:本地部署27B模型,到底要多大的显存?显存带宽对生成速度的影响有多大?老架构卡和新架构卡的差距到底体现在哪里?
1.2 测试平台与软件环境
为了控制变量,测试平台除了显卡之外全部保持一致:
- CPU:Intel i9-13900K
- 内存:64GB DDR5 5600MHz
- 主板:Z790芯片组
- 系统:Ubuntu 22.04 LTS
- 驱动:NVIDIA Driver 550.120(V100和30系/40系/50系共用一套驱动,这点倒是省了不少事)
- CUDA:12.4
- PyTorch:2.3.1
- 推理框架:vLLM 0.6.0 + llama.cpp(b3800)
这里要单独说一下驱动兼容性。Tesla V100属于Volta架构,最新的Blackwell架构RTX 5090也能用同一个CUDA 12.4驱动跑起来,这点必须给NVIDIA点个赞。不过V100有个先天短板:它对BF16的支持非常弱,很多新库默认用BF16优化,在V100上会自动回退到FP16或FP32,性能会打折扣。后面实测数据也印证了这个判断。
2. 部署方案与量化配置思路
2.1 27B模型到底需要多少显存
很多新手上来就问“XX显卡能不能跑XX模型”,其实只要学会算显存,这个问题就解决了一大半。显存占用主要由三部分组成:模型权重、KV Cache、激活值(激活值在推理时通常可以忽略,但训练时不能忽略)。
以Qwen3.8-27B为例,权重显存的计算公式是:参数量乘以每个参数的字节数。FP16精度下每个参数占2字节,所以权重占用约27B × 2 = 54GB。INT8精度下每个参数占1字节,约27GB。INT4精度下每个参数占0.5字节,约13.5GB。这里面说的INT4一般不是纯INT4,而是4bit量化加分组缩放,实际占用会略高一点,大约14GB。
KV Cache的占用和序列长度、并发数直接相关。公式大致是:KV Cache = 2(K和V) × 层数 × 注意力头数 × 头维度 × 序列长度 × 字节数。27B模型一般有40层左右,如果输入输出长度控制在2048 token,FP16下KV Cache大约需要2-4GB。也就是说,跑长文本必须预留足够的显存余量。
我整理了一张显存估算表,实测下来和理论值差距很小:
| 量化方式 | 权重显存 | 加上KV Cache后最低需求 | 可运行显卡 |
|---|---|---|---|
| FP16 | 54GB | 约58GB | 4090 48G(勉强) |
| INT8 | 27GB | 约30GB | V100 32G、5090 32G |
| INT4 | 14GB | 约16GB | 3090 24G、5090 32G、4090 48G |
2.2 框架选型:vLLM还是llama.cpp
这次测试用了两套框架,目的不同:
- vLLM:主打高吞吐、高并发。用了PagedAttention技术,KV Cache管理更高效,适合API服务场景。这次主要用vLLM来压测并发场景下的表现。
- llama.cpp:主打轻量级部署,对量化支持更完善,GGUF格式的量化模型在CPU/GPU混合推理时表现很好。这次主要用llama.cpp来测单请求的生成速度和显存占用。
对于27B这个体量,我个人的建议是:如果想自己玩、不追求高并发,llama.cpp + GGUF量化是最省心的组合;如果要长期跑服务、给其他应用提供API,vLLM + AWQ/GPTQ量化是更靠谱的选择。这次横评里,除了V100因为架构兼容性问题只能用llama.cpp(vLLM 0.6.0对Volta架构的INT4量化支持不完整,跑起来各种报错),其余三张卡都分别测试了vLLM和llama.cpp的性能。
2.3 量化方式选择的细节
量化是个“精度换速度”的游戏。很多人一上来就无脑上INT4,结果模型输出质量一塌糊涂,然后反过来骂模型不行。实际上Qwen3.8-27B在INT4量化下的表现已经很不错了,但如果你想用模型做代码生成或者数学推理,建议还是尽量保留更高的精度。
这次测试中,不同显卡适配的量化方式是硬约束:
- 3090 24G:只能跑INT4。我用的是AWQ量化,配合vLLM部署,4bit分组大小设为128,这个配置在速度和精度之间比较均衡。
- 4090 48G:直接跑FP16,不需要量化。这是最省心的方案,模型加载即用,不需要额外做量化校准,精度没有损失。如果追求更高并发,也可以切成INT8,但实测FP16的单请求速度已经很快。
- 5090 32G:跑INT8是上限,跑INT4又有点浪费算力。最终选了INT8 AWQ,用vLLM部署,吞吐表现相当惊人。
- V100 32G:一开始打算跑INT8,但发现V100的INT8 Tensor Core性能远不如FP16,加上vLLM兼容性问题,最终用FP16精度部署在llama.cpp上。
提示:Volta架构的V100虽然支持INT8,但它在INT8上的加速效果远不如Ampere及后续架构。如果要在V100上跑大模型,优先考虑FP16而不是INT8/INT4,反而更快。
3. 四卡实测数据横向对比
3.1 单请求生成速度基准
测试方法:使用相同的提示词、相同的生成参数(temperature=0.7, max_tokens=512),分别测预填充(prefill)速度和生成(decode)速度。预填充速度用tokens/s计算,生成速度用tokens/s计算。
| 显卡 | 框架 | 量化 | 预填充速度 | 生成速度 |
|---|---|---|---|---|
| RTX 3090 24G | vLLM | AWQ INT4 | 1980 tokens/s | 42 tokens/s |
| RTX 4090 48G | vLLM | FP16 | 3560 tokens/s | 71 tokens/s |
| RTX 4090 48G | vLLM | AWQ INT8 | 4120 tokens/s | 88 tokens/s |
| RTX 5090 32G | vLLM | AWQ INT8 | 5310 tokens/s | 122 tokens/s |
| Tesla V100 32G | llama.cpp | FP16 | 410 tokens/s | 36 tokens/s |
看到这个结果,第一反应是5090强得离谱。122 tokens/s的生成速度,配上5310 tokens/s的预填充速度,几乎感觉不到“等待模型输出”的焦虑。4090 48G也不遑多让,FP16下71 tokens/s足够流畅,切到INT8后能飙到88 tokens/s。3090在INT4量化下的42 tokens/s属于“能忍”级别,读起来不会卡顿,但也谈不上流畅。V100就有点惨了,36 tokens/s的生成速度和3090差不多,但预填充速度只有410 tokens/s,几乎是3090的五分之一,处理长提示词时会明显感觉到等待时间变长。
3.2 显存占用与功耗实测
跑完一轮完整的512 token生成后,记录各卡的显存峰值和整机功耗(从插座功率计读取,包含显示器、CPU等全套平台功耗):
| 显卡 | 量化 | 显存峰值 | 整机待机功耗 | 推理时整机功耗 |
|---|---|---|---|---|
| RTX 3090 24G | AWQ INT4 | 18.3GB | 95W | 410W |
| RTX 4090 48G | FP16 | 41.2GB | 105W | 520W |
| RTX 4090 48G | AWQ INT8 | 29.5GB | 105W | 490W |
| RTX 5090 32G | AWQ INT8 | 26.8GB | 110W | 460W |
| Tesla V100 32G | FP16 | 30.1GB | 120W | 380W |
显存方面,3090跑INT4用了18.3GB,离24G上限还有一点余量,但如果把上下文长度拉到4096,就会非常吃紧。4090 48G在FP16下吃掉了41.2GB,虽然显存总量够,但余量不算大,长上下文场景建议还是上INT8。5090 32G的26.8GB占用比预期低,这是因为AWQ INT8的模型权重加KV Cache就是这么多,32G显存对它来说比较宽裕。
功耗方面有个很有意思的现象:V100虽然在性能上垫底,但功耗也最低,整机只有380W。这说明老数据中心卡在能效比上其实不算太差,只是性能确实跟不上了。5090的功耗控制也很亮眼,460W的整机功耗干出了全场最高的性能,能效比四张卡里最强。
3.3 不同量化下的表现矩阵
为了更直观地展示量化对性能的影响,我把4090 48G作为基准卡(因为它显存够大,可以自由切换不同量化),分别测试了FP16、INT8、INT4三种模式下的表现:
| 量化方式 | 生成速度 | 显存占用 | 相对FP16速度 |
|---|---|---|---|
| FP16 | 71 tokens/s | 41.2GB | 基准 |
| INT8 | 88 tokens/s | 29.5GB | +24% |
| INT4 | 94 tokens/s | 18.8GB | +32% |
注意,INT4虽然在速度上比INT8快了一点点,但幅度远小于INT8对FP16的提升。原因在于,对于27B这个体量,显存带宽已经接近瓶颈,INT4相比INT8减少的权重体积带来的带宽节省,已经被额外的反量化和计算开销抵消了一部分。也就是说,如果你显存够用,没必要追求极致量化,INT8是性价比最高的选择。
4. 性价比与入手建议
4.1 成本核算与回本周期
测试完了,说点实际的东西。四张卡的市场行情差异巨大(以下价格按测评时的行情估算):
| 显卡 | 当前市场参考价 | 二手/新卡 | 生成速度 | 每元/tokens·s |
|---|---|---|---|---|
| RTX 3090 24G | 3800元 | 二手 | 42 tokens/s | 90.5 |
| RTX 4090 48G | 11500元 | 魔改新卡 | 71 tokens/s | 161.9 |
| RTX 5090 32G | 18500元 | 新卡 | 122 tokens/s | 151.6 |
| Tesla V100 32G | 4500元 | 二手 | 36 tokens/s | 125 |
单看每千元能换来的生成速度,3090反而是性价比最高的,但这只是纸面账。3090的致命伤是显存只有24G,跑INT4量化面对长上下文时捉襟见肘,一旦序列长度超过2048就随时可能爆显存。如果你只是想跑跑短对话、做做AI角色扮演,3090完全够用。但如果你需要处理长文档、代码库或者RAG场景,3090的24G显存会变成一根卡脖子的绳索。
4090 48G这个魔改卡值得多说两句。它的价格差不多是3090的三倍,性能不到两倍,纸面性价比不高。但它能跑FP16满精度模型,省去了量化校准、精度损失评估这些麻烦事。很多做文本分类、信息抽取这类对精度敏感的任务,满精度和INT4的差距还是肉眼可见的。再加上48G显存对未来一到两年的新模型也有一定冗余,所以它更适合“不想折腾量化、又希望模型跑得准”的用户。
4.2 不同人群的选卡建议
结合测试数据和使用场景,我给的选卡建议是这样的:
- 预算敏感、纯个人使用:直接买3090 24G,配AWQ INT4量化,加上llama.cpp部署,成本最低,体验能接受。二手市场量大,翻车概率相对可控。
- AI应用开发、需要跑服务的:把预算放4090 48G上。48G显存让你在量化选择上有完全的自由度,INT8部署还能留出大量KV Cache余量给长并发,性能足够撑起一个小型API服务。
- 性能党、预算充足:5090 32G不用犹豫,122 tokens/s的生成速度是目前单卡消费级的最强水平,而且Blackwell架构对未来的FlashAttention等新优化支持更完整,潜力更大。
- 特殊场景、需要ECC显存:V100 32G也不是一无是处。它的HBM2显存自带ECC纠错,在长时间跑批处理任务(比如离线批量生成文本)时,稳定性有优势。加上功耗低,适合做背景计算或备用算力。
4.3 魔改卡的风险提示
这里必须专门提醒一句:RTX 4090 48G不是NVIDIA官方规格,是第三方改装卡。改装方式是把原本24颗2GB显存颗粒换成24颗4GB(或者双面48颗粒),这涉及拆核心、重焊显存、改电路,风险不小。
我手上这块4090 48G实测下来稳定性尚可,但有几个明显短板:一是散热压力大——48G显存颗粒全部挤在一块PCB上,满载时显存温度轻松冲到95度以上,机箱风道不好就得降频;二是保修基本等于没有,很多改装商只保三个月;三是如果要做AI训练而不是推理,48G显存会带来散热和供电的额外压力,长时间满载跑训练我其实不太推荐。
注意:如果你买的是魔改4090 48G,务必检查显存温度。超过100度会触发显存降频,性能直接掉20%以上。建议在机箱里加装针对显卡背板的散热风扇,或者选择水冷版改装卡。
5. 实操问题与排查记录
5.1 显存不足与OOM的排查思路
测试过程中,四张卡都遇到过OOM(Out of Memory)问题,尤其集中在3090 24G上。这里分享一个排查OOM的标准化流程:
第一步,用nvidia-smi看显存实时占用。但注意,nvidia-smi只能看到进程级别的显存占用,看不到PyTorch内部的缓存池。第二步,在代码里用torch.cuda.memory_summary()查看PyTorch的CUDA内存分配明细,定位是权重占用、激活值还是KV Cache爆了。第三步,对照KV Cache公式算一下当前序列长度下的KV Cache理论值,看看是不是超出预期。
我遇到的一个典型案例是:3090跑INT4量化模型,短对话一切正常,但一旦在历史记录里塞了10轮对话,就OOM。排查后发现,KV Cache随着历史长度线性增长,8轮对话后期KV Cache已经占掉了6GB显存,加上权重14GB,正好卡在24G的边缘。解决办法有两个:一是用vLLM的--max-model-len参数限制序列长度,超出的旧对话自动截断;二是把KV Cache从FP16换成FP8,可以减少一半的KV Cache显存。
5.2 速度突然下降的排查记录
5090在测试过程中出现了一个诡异现象:刚部署完跑生成速度有120+ tokens/s,用了半小时后突然下降到只有80 tokens/s。第一反应是温度问题,看了一眼nvidia-smi,显存温度只有76度,核心65度,不应该降频。然后又怀疑是显卡驱动自动切换了性能模式,检查后发现也没问题。
最后定位到是vLLM的连续批处理(continuous batching)导致的内存碎片化。处理长请求时,KV Cache的页表碎片越来越多,导致缓存命中率下降,最终反映为生成速度下降。解决方法是设置--enforce-eager参数(关掉CUDA Graph优化),或者定时重启推理服务来清理KV Cache碎片。
V100上遇到的问题是性能远低于预期。一开始以为是V100的HBM2带宽被高估了,后来排查到是llama.cpp在Volta架构上没有启用GPU的Tensor Core,而是走了CUDA核心。原因是llama.cpp的CUDA版本检测逻辑对于Compute Capability 7.0(V100)默认关闭了Tensor Core优化。解决办法是在编译时使用LLAMA_CUDA_MMQ_Y=1之类的参数强制启用,或者手动修改源码里的架构判断。
5.3 多卡并行部署的意外收获
一开始我的想法是既然单卡都有一定瓶颈,那不如把3090和V100组合起来做多卡推理。测试过程中发现,vLLM的--tensor-parallel-size 2参数可以支持异构显卡共存,但会把两者之间的通信开销算进来。实测3090 + V100组成2卡张量并行,跑INT4量化模型,生成速度只有21 tokens/s,比单张3090的42 tokens/s还慢。原因在于V100不支持NVLink(3090虽然支持但V100是SXM4接口,两者无法直连),只能走PCIe通信,频繁同步权重反而拖慢了速度。
这里给想要多卡并行的人一个忠告:张量并行对卡间通信带宽极其敏感,异构显卡组队基本是负优化。如果真想多卡并行,要么选同一型号且支持NVLink的卡(比如两张3090),要么干脆用流水线并行(把不同层放在不同卡上),避免频繁的卡间同步。
5.4 量化校准失败的教训
在给4090 48G做INT8量化时,我一开始想省事,直接用默认校准数据集,结果量化后的模型在代码生成任务上输出质量断崖式下降——生成的代码大量语法错误,完全没法用。后来才意识到,默认的校准数据集是通用文本,偏小说、新闻一类的内容,对代码任务覆盖不足。量化时校准数据集必须尽可能贴近你的实际使用场景,否则量化压缩掉的正是你真正关心的那一部分信息。
重新用一段包含大量Python代码的语料做校准后,INT8量化模型的输出质量终于和FP16基本持平,代码的语法错误率降到了和满精度差不多的水平。
6. 跑完横评后的一些真实体会
四张卡跑了几十轮测试,最深的感受是:选择部署硬件,本质上是选择预算和使用场景之间的平衡点。没有绝对的最强卡,只有最适配你的卡。
如果你追求性价比、自己玩玩就够,3090至今依然是入门大模型本地部署的最佳选项——前提是你接受INT4量化带来的一点点精度损失,以及长上下文时代显存捉襟见肘的现实。如果你要靠模型产出吃饭,或者你的应用对精度敏感,多花点钱上4090 48G这类大显存卡,省下来的量化调试时间早就把差价赚回来了。5090 32G的性能确实让人心动,但当前较高的价格和刚上市不久带来的驱动、生态磨合期,都让它更适合“预算不是问题”的尝鲜玩家。至于V100,我更愿意把它看作一块带有特殊技能(ECC显存、低功耗)的备胎卡,数据中心的背景决定了它在个人桌面上很难发挥全部实力。
最后再分享一个操作层面的小技巧,这个花了很长时间才琢磨出来:无论你用哪张卡,部署推理服务时都不要一上来就把所有参数拉满。先用短序列(比如512 token的max length)跑通全流程,再把序列长度往上加,这样做的好处是出了问题能快速定位是模型问题、框架问题还是硬件资源问题。本地大模型部署这件事,七分在选硬件,三分在调参数——硬件选对了,剩下的都是时间问题。