llama.cpp 和 vllm

模型与算力

从硬件、吞吐和实际场景出发,讲清选推理框架时怎么在 llama.cpp 和 vLLM 之间做决定,并给出可落地的判断步骤。

本地跑模型的人迟早会卡在这一步:机器就那一台,模型权重也下好了,到底用 llama.cpp 还是 vLLM?网上说法一半对一半,照着装完才发现方向错了。这篇不站队,只给一套按硬件形态、并发量、离线还是在线三个维度走的判断顺序,顺带说清哪些情况下两边都能用、不用纠结。

本地跑模型的人迟早会卡在这一步:机器就那一台,模型权重也下好了,到底用 llama.cpp 还是 vLLM?网上说法一半对一半,照着装完才发现方向错了。这篇不站队,只给一套按硬件形态、并发量、离线还是在线三个维度走的判断顺序,顺带说清哪些情况下两边都能用、不用纠结。

先说结论性的思路:这不是「谁更强」的问题,而是「你的机器和你的请求长什么样」的问题。选型之前先把自己的场景写下来,再对照后面的清单逐条排除,比看一堆横评有用得多。

先认清两个框架各自是从哪长出来的

llama.cpp 起家于在消费级硬件和 CPU 上把模型跑起来,重单机、重量化、重跨平台;vLLM 起家于服务端批量推理,重吞吐、重调度、重多卡。两者不是升级关系,是两种目标函数的产物:一个是「这台机器能跑」,一个是「这批请求要并发地跑完」。

单机取向
让有限硬件尽量跑得动,愿意为省显存牺牲一点调度灵活性
服务取向
让同一批硬件同时服务更多请求,愿意为吞吐接受更重的部署和依赖

判断自己属于哪一类,先回答一个问题:你的请求是一次一个,还是一次来几十上百个。这个答案基本能砍掉一半纠结。

第一步看硬件形态,不是看参数表

硬件形态是最硬的约束,也是最容易被忽略的一步。很多人先看别人推荐哪个框架,再回头看自己的机器,顺序反了。

  • 只有 CPU、或者核显/集显、或者 Mac 统一内存:llama.cpp 这条路基本没有悬念
  • 消费级单卡、显存刚好卡在模型边缘:先算显存账,去站内 /tools 里的换算工具和 /compute/sizing 按模型过一遍,再决定选哪边
  • 多张数据中心卡、显存富裕:优先把 vLLM 当作默认候选,除非你的场景根本不需要并发
  • 混合场景(部分层卸载到 CPU)要提前想清楚:这条路对两个框架的代价完全不一样

什么情况下这条判断不适用?当你的硬件是「勉强够」而不是「明显够」的时候。显存刚好卡边缘时,两个框架都可能有额外开销,这时候必须实测,不能只看硬件类型下结论。

吞吐和延迟:先分清你要的是哪个

单请求低延迟和整体高吞吐是两件事,很多时候不能同时拿满。先把指标定死再选框架,不然永远选不对。

场景更在意的指标选型倾向
离线批量生成语料整批跑完的总时间vLLM 的批量调度更有优势
在线对话服务每个请求的首字延迟看并发量,低并发两边都能用
本机写代码辅助响应是否跟手llama.cpp 更省心
跑评测集单位时间处理样本数按并发量实测后再定

并发一上来,批处理和显存管理策略的差别会被放大,这就是为什么服务端场景的讨论绕不开 vLLM。在线对话、API 网关这类请求间隔短、要持续接客的场景,和离线批量生成语料、跑评测集的场景,选型结论可能相反。

量化格式决定你能走哪条路

llama.cpp 生态围绕 GGUF 这类为低比特和混合卸载设计的格式;vLLM 更偏服务端常见的量化与并行方案,两边的权重不一定通用。选框架前先确认你手上的权重格式有没有对应支持,否则后面全是白折腾。

  • 量化档位直接影响显存占用和质量,档位怎么选要看站内 /ai-dict/category/tech 里的概念说明,别凭感觉挑最低比特
  • 同一个模型在两个框架下可用档位不同,拿不准就先查格式支持情况
  • 如果模型只有一种格式可用,那选型空间其实已经被压到只剩一条路
  • 换框架往往意味着重新下权重、重新验证效果,这个成本要算进决策

部署和运维的隐形代价

环境依赖、容器化难度、驱动版本耦合程度,这些不写在对比表里,但决定了你后期加班多少。一个人维护的小项目和一个有值班的团队,该选的方案大概率不一样。

成本项llama.cpp 侧vLLM 侧
依赖复杂度相对轻,跨平台好装偏重,与环境耦合更紧
多机多卡通常不是它的主场常见部署形态
上手门槛单机本地化跑通较快服务化配置需要经验
出问题找人社区资料偏本地场景社区资料偏服务端场景

团队里谁能维护它:如果只有一个人懂,选那个出问题时社区资料更好找的。更新模型、换权重、回滚版本的流程要提前想,别等到线上出问题才补。

并发涨上来之后会发生什么

vLLM 的优势在并发下才显现,低并发时它的复杂度可能是纯负担;反过来 llama.cpp 在单请求场景往往更省心。所以并发估算是选型的核心输入之一,不能拍脑袋。

  1. 估显存余量按模型大小和量化档位反推显存余量,参考站内 /compute/sizing 的思路,再看你要的并发数能不能放下
  2. 定峰值并发要不要多卡多机,取决于峰值并发而不是平均值;平均很低、峰值很高的业务要按峰值准备
  3. 找瓶颈位置扩容之前先确认瓶颈在显存、在算力还是在调度,不然加卡不一定有用
  4. 小规模验证用同一模型、同一批请求量在两个框架各跑一次,比较实际表现再定

这条判断在什么情况下不适用?当你的业务并发几乎恒定、没有明显峰值时,按平均值准备也问题不大,但这类业务本来就少见。

许可证和合规别放到最后

框架本身的开源许可证和模型权重的许可证是两回事,两个都要看,别只看模型能不能商用。权重许可证的细节容易埋坑,特别是再分发和商用边界。

  • 拿不准就去站内 /ai-dict 相关条目把概念对齐,别照搬别人的结论
  • 如果模型要进内网或对外提供服务,合规判断要前置到选型阶段,不然后面可能推翻重来
  • 再分发权重的场景要额外确认授权范围,这一步很多人会漏
  • 开源权重不等于随便用,具体条款以你实际下载的那份为准

一张能直接照着走的判断清单

把前面几节压缩成五个问题,顺着走一遍基本能得出结论。如果两个框架都满足条件,那就说明这个场景选哪个都能跑,不必继续纠结。

  1. 问题一:硬件只有 CPU 或 Mac?是,则基本选 llama.cpp,跳到问题五
  2. 问题二:并发并发请求常年只有一两个?是,则优先 llama.cpp,除非你明确要服务化
  3. 问题三:服务化多张卡、并发几十以上、要持续对外供服务?是,则优先 vLLM
  4. 问题四:权重格式你的权重格式只有一种可用?那就按格式定框架,别按偏好定
  5. 问题五:实测把上面结论拿去做一次小规模实测,用同一模型、同一提示词、同一批请求量对一遍,再最终定下来
选框架不是选立场,是把硬件、并发、格式这三个约束按顺序排除掉。

最后提醒一句:任何对比表都只是起点。你机器上的显存、驱动、权重格式,才是真正决定答案的东西。先跑起来,再谈优化。

下一步把你手上机器的实际表现和站内资料对照一遍,再决定要不要换框架。

常见问题

llama.cpp 和 vLLM 能不能在同一个项目里同时用?

可以,但要想清楚分工。常见做法是把批量离线任务和在线低并发入口放一边,把高并发的服务接口放另一边,两边各自跑各自擅长的模型格式。代价是你要多维护一套环境和权重,人少的时候这个代价不一定划算。

我只有一张消费级显卡,是不是就一定选 llama.cpp?

不一定,取决于并发。如果只是自己用、一次一个请求,选 llama.cpp 更省事,量化档位也更灵活。如果这张卡要同时接好几个用户,就得先按模型和量化算显存余量,再判断 vLLM 在你的卡上是否跑得起来,别默认它一定行。

换成 vLLM 之后速度没变快,是什么原因?

大概率是并发没上去。vLLM 的收益主要来自批处理和显存调度,单请求场景下它和别的方案差别很小,甚至更慢。先确认你的实际并发量,再去排查是不是配置或参数没调对,具体报错和排查顺序可以对照站内相关部署文章。

量化档位选低一点,是不是就能用更小的卡跑?

显存占用确实会降,但质量损失和速度变化要一起看,不是越低越好。同一模型在不同档位下的表现差异,建议用你自己的任务集实测一遍,别只看别人的对比结论。档位与精度损失的原理可以去站内的技术词典条目补一下。

选框架的时候,价格要不要一起算?

要,但要看你走的是自建还是租卡。自建看的是硬件一次投入和电费,租卡看的是按时计费下的吞吐效率——吞吐高意味着同样任务占用的时长更短。具体租金和口径别凭记忆,去站内的算力和比价页面看当时的数字。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。