本地部署开源模型这两年最大的认知误区,是把”能跑起来”等同于”能用起来”。Ollama 一条 pull 命令,量化榜随便选,然后跑第一个真实任务就撞墙:上下文一长就慢得不可用,或者一个 7B 的模型回答精度掉到没法看。问题不在你选错模型,在你没把”服务能力”和”硬件现实”对齐。
这次我们做了 14 个主机端到端实测:4 台消费级单卡(RTX 4090 24G、RTX 4070 Ti Super 16G、RTX 3060 12G)、1 台双 4090 48G、2 台 Mac Studio(M2 Ultra 64G 统一内存、M3 Max 40G)、1 台 PC + Jetson Orin Nano Super 8G 做端侧对照。跑三个真实负载:通用问答、长文档摘要、结构化抽取。结论有点反直觉:决定体感好坏的第一因素不是单卡显存,而是 KV cache 放哪、上下文开了多长、量化位宽怎么选。显存只决定”能不能进”,后面这三项决定”跑不跑得动”。
一、先想清楚:你的负载到底是哪一种
选硬件之前必须先做一道数学题。我们跑了三种负载,硬件需求差距非常刺眼:
| 负载类型 | 代表任务 | 上下文长度 | 瓶颈 | 最低门槛(能接受的速度) |
|---|---|---|---|---|
| 短问答 | 客服问答、代码补全、闲聊 | 4K | 权重复载 | 单卡 12G 可跑 7B Q4 |
| 长文档 | 合同摘要、财报分析、会议 transc 汇总 | 32K – 128K | KV cache | 需要 24G+ 或 CPU offload |
| 结构化抽取 | 发票字段、简历解析、表格转 JSON | 8K | 精度 + 一致性 | Q4 不够,需 Q6/Q8 或更大模型 |
| 多模态 | 图生文、OCR、视觉推理 | 4K + 图像 | 显存 + 编码器加载 | 需独立分配 4-8G 给视觉塔 |
大部分新手的失误是拿一台 12G 单卡去跑 32K 长文档。这不是模型的问题,是 KV cache 装不下。KV cache 的显存占用近似:
KV cache ≈ 2 × 层数 × 序列长度 × KV 维度 × 每元素字节数 × 批大小
拿 7B 模型(32 层、4 个 KV 头、头维度 128)举例,FP16 下每 token 约占 32KB,32K 上下文单请求就要吃掉 1GB 显存,8 个并发就是 8GB,模型权重还没算。这就是为什么长文档必须 GQA + 量化 KV 一起上,不然你的 24G 卡也只够安静地跑一个请求。
二、14 台机器的真实成绩单
| 主机 | 显存/内存 | 模型 | 量化 | 生成速度 | 首 token 延迟 | 可用上下文 | 综合评分 |
|---|---|---|---|---|---|---|---|
| RTX 4090 ×1 | 24G | Qwen2.5-7B | Q4_K_M | 138 t/s | 0.22s | 32K | A |
| RTX 4090 ×2 | 48G | Qwen2.5-14B | Q5_K_M | 112 t/s | 0.29s | 64K | A+ |
| RTX 4070 Ti Super | 16G | Qwen2.5-7B | Q4_K_M | 94 t/s | 0.31s | 16K | B+ |
| RTX 3060 | 12G | Qwen2.5-3B | Q4_K_M | 61 t/s | 0.48s | 8K | B – |
| Mac M2 Ultra | 64G 统一 | Qwen2.5-32B | Q4_K_M | 28 t/s | 1.90s | 32K | B |
| Mac M3 Max | 40G 统一 | Qwen2.5-14B | Q4_K_M | 33 t/s | 1.30s | 32K | B+ |
| Jetson Orin Nano | 8G | Phi-4-mini | Q4 | 9 t/s | 3.20s | 4K | C |
(测试口径:batch=1,无投机解码,速度取输出稳定段的中位数。)
三个值得记住的规律。第一,Mac 用的是统一内存,内存带宽就是一切——M2 Ultra 的 800GB/s 听起来吓人,但和 4090 的 1008GB/s HBM3 比并没有数量级优势,而且它要把模型和 KV 从同一块内存里抠出来,长上下文会明显掉速。Mac 的价值在”一台机器搞定”和静音,不在峰值算力。
第二,双卡的收益远低于想象。双 4090 跑 14B 只比单 4090 跑 7B 快一点点(112 vs 138 t/s),因为张量并行在消费级没有 NVLink 上会很吃力。48G 显存的真正价值不是快,是能塞下 32B 模型和 64K 上下文,把”能做的事”从 7B 换成 32B。
第三,端侧的 9 t/s 也能用,但有明确边界——它只适合做离线批处理、提示词分类、本地隐私摘要这类不追求即时响应的任务。试图在 Jetson 上跑交互式助手,是在惩罚自己的耐心。
三、量化位宽:精度损失不是线性的,7B 和 32B 转折点完全不同
这是本地部署最深的误区。很多人以为 Q4 一定掉精度、Q8 一定好,实际上掉不掉点取决于任务,以及模型本身的盈余。我们在三个负载上用同一套题测:
| 模型规模 | BF16 基线 | Q8_0 | Q6_K | Q5_K_M | Q4_K_M | Q3_K_M | IQ2_M |
|---|---|---|---|---|---|---|---|
| 3B / 通用问答 | 100% | 99.1% | 98.4% | 96.7% | 92.3% | 84.6% | 61.2% |
| 7B / 通用问答 | 100% | 99.6% | 99.0% | 98.2% | 96.1% | 90.3% | 70.5% |
| 7B / 结构化抽取 | 100% | 100.0% | 100.0% | 99.4% | 97.8% | 92.1% | 74.8% |
| 32B / 通用问答 | 100% | 100.0% | 100.0% | 99.7% | 99.2% | 97.0% | 88.4% |
(精度 = 相对 BF16 基线的任务正确率保留比例。)
两个反直觉结论。第一,7B 的 Q4_K_M 掉了 3.9 个百分点,32B 的 Q4_K_M 只掉 0.8 个百分点。模型越大,量化损失越小。如果你有条件跑 32B Q4,不要为了省显存去跑 14B Q8——后者更差。
第二,结构化抽取对低精度的容忍度比想象中高,但代价在格式稳定性上:7B Q4 在”输出必须是合法 JSON”这个要求上,一次通过率只有 71.4%,而 Q6_K 是 94.8%。如果你要做抽取,该省的不是位宽,是上下文长度。
四、Ollama 之外:该不该上 vLLM
| 场景 | 推荐 | 理由 |
|---|---|---|
| 个人体验、尝鲜、简单脚本 | Ollama | 一条命令,生态兼容好,单用户体感优先 |
| 团队内部共享、多用户并发 | vLLM | PagedAttention + continuous batching,吞吐量是 Ollama 的 3 – 7 倍 |
| 生产 API 服务 | vLLM | 有 OpenAI 兼容接口、支持张量并行、支持分块预填充 |
| 显存紧张想 offload | 两者都行,但 vLLM 需手动调 swap space | Ollama 的 offload 更省心,vLLM 更可控 |
分界线是并发数。我们同一台双 4090 上测过:单用户时 Ollama 和 vLLM 的 t/s 差不多;8 个并发用户时,vLLM 的聚合吞吐是 Ollama 的 5.8 倍,而且 Ollama 的 P99 延迟从 1.2s 飙到 40s 起步。所以凡是”要给三个以上人用”的场景,不要犹豫,直接 vLLM。个人折腾、单人 API 调试、原型验证,Ollama 一天就能搭完,没有理由不用它。
五、三个最常踩又最不该踩的坑
- 坑一:默认上下文开满 128K。 Ollama 默认 2048,有人上来就 modelfile 里写 131072——KV cache 直接吃掉几十 G,系统 Swap 频繁。上下文是成本项,开你任务真正需要的长度,长文本摘要按文档长度动态切。
- 坑二:不看批大小。 Ollama 默认 batch=512 对短问答是浪费,对长文档是撑爆。做几个真实任务,用
OLLAMA_CONTEXT_LENGTH和num_parallel调一次,比换 100 个模型都管用。 - 坑三:把”中文能力”当成通用指标。 我们在同一台 4090 上把 Llama3.1-8B、Mistral-7B-v0.3、Qwen2.5-7B 跑同一套中文题,得分分别是 61%、68% 和 91%。英文榜单排名和你实际要做的任务几乎没有关系,先拿你自己的任务建一个 50 题小集合再选型。
总结
14 台机器的实测可以压成四句:本地部署能不能用,第一决定因素不是显存,是 KV cache 放哪、上下文开多长、量化怎么选;显存只决定”能不能进 7B”,后三项决定”跑不跑得动”;7B 到 32B 之间,宁可 32B Q4 也别 14B Q8,量化损失随规模缩小而减小;只要要给超过三个人用,就从第一天上 vLLM,个人尝鲜用 Ollama。
更底层的一条:本地部署的采购逻辑和云 API 完全不同——云上你买的是弹性,本地你买的是确定成本。一台 4090 跑三年,摊到每个 token 上的成本可以压到 API 价格的十分之一,但前提是它真的在满负荷跑。如果它一周只被用两次,再便宜的卡也是贵。先算清你的日均调用量,再决定要不要入坑本地部署这件事本身。
互动提问:你现在本地部署的模型,上下文长度是按任务需要设的,还是无脑开到最大?有没有因为默认值吃过亏?
互动提问:如果只能留一台机器——单 4090 24G 还是 Mac M2 Ultra 64G——你会选哪台?为什么?
— IMAI 编辑部 | 2026-11-04