ollama llama.cpp 性能

模型与算力

给本地推理选型的人一套对比思路:怎么量 Ollama 和 llama.cpp 的吞吐与显存,什么场景该换后端,避免只凭感觉换。

你在本地跑模型时大概遇到过这种纠结:同一个模型,Ollama 一把梭能跑起来,但并发一上来就卡;换 llama.cpp 自己编译又怕调不明白。两边文档都只讲怎么装,不讲「什么量级该用谁」。这篇给一套能自己动手做的对比流程:先定测量口径,再分场景看吞吐和显存,最后落到改配置还是换后端。

你在本地跑模型时大概遇到过这种纠结:同一个模型,Ollama 一把梭能跑起来,但并发一上来就卡;换 llama.cpp 自己编译又怕调不明白。两边文档都只讲怎么装,不讲「什么量级该用谁」。这篇给一套能自己动手做的对比流程:先定测量口径,再分场景看吞吐和显存,最后落到改配置还是换后端。

先说一句实话:这三个后端没有绝对赢家,只有「你这台机器、你这个用法」下更合适的那一个。所以本文不给结论,只给判断标准和动作。你按下面的顺序走一遍,基本能自己得出结论,比看别人的对比表靠谱。

先统一测量口径,别拿两个不同条件比

对比后端最容易犯的错,是变量没控住:A 后端用这个量化、那个上下文长度,B 后端换了另一套,测出来的差异到底来自后端还是来自配置,谁也说不清。要得到有意义的对比,先把除了后端之外的东西全部固定住,再开测。

  • 同一个模型文件、同一档量化、同一段提示词,只换后端,比出来才有意义
  • 至少记四个数:首 token 延迟、稳定输出速度、峰值显存、并发到几个人时开始掉速
  • 跑之前先看一眼显存占用曲线,别等卡了才去看是不是爆了
  • 每项至少测三轮取中间值,单次结果波动很大,容易误导判断
  1. 固定输入条件选一个模型文件和一个量化档位,写一段固定长度的提示词和固定输出上限,先用 /tools/speed-test 把延迟基线量出来,记下来。
  2. 采集四项指标分别记录首 token 延迟、稳定输出速度、峰值显存、开始掉速的并发数。峰值显存用系统监控看,别只看后端自己报的数。
  3. 固定机器状态测之前关掉其他占显存或占 CPU 的程序,确认机器没有在跑后台任务,否则测出来的吞吐忽高忽低。
  4. 记录并对比把两套结果放在同一张表里逐项看。如果差异集中在某一项,说明瓶颈就在那一项上,不用整机重测。

Ollama 的性能长项和短板在哪

Ollama 的优势不在性能,在「你不用管」。模型拉取、量化档位、显存卸载、OpenAI 兼容接口都是一条命令的事,特别适合单人或小团队先把东西跑通,再谈优化。如果你的场景是单人对话、偶尔批处理,它大概率够用,不必为了性能去折腾别的后端。

它的短板通常出在并发上。同时几个人提问、或者一边跑对话一边跑嵌入,吞吐会明显往下掉,这种时候先怀疑调度和显存争抢,而不是模型本身不行。另一个容易踩的点是多模型常驻:它是按需加载还是常驻显存,直接决定你多开几个模型会不会互相挤。

场景更可能卡在哪先做什么
单人对话、偶尔批处理基本不卡,延迟略高不用换后端,先看有没有必要优化
多人同时提问并发调度、显存争抢先降并发或限制上下文,再看是不是真需要换
一边对话一边跑嵌入两条负载抢资源拆成两个实例,别指望一个进程全包
多模型同时常驻模型互相挤显存确认加载策略,必要时逐个加载
先确认自己到底是卡在吞吐还是卡在延迟,这两件事的解法完全不同。

llama.cpp 什么时候更划算,代价是什么

llama.cpp 更贴近底层,量化格式、线程数、批大小这类参数你自己能调,适合想榨出最后一点吞吐、或者要把推理嵌进自己程序的人。CPU 或 CPU+GPU 混合推理、内存比显存富裕的机器、需要极简依赖的场合,它往往比上层封装更顺手。

代价是配置和更新的活要自己扛:参数、编译选项、模型格式转换都得跟,出问题排查面比 Ollama 大。一个人管运维的团队要先算一笔账:省下来的那点吞吐,值不值每周多花的调试时间。如果你们没有专人维护,这个成本经常被低估。

吞吐优先
有并发要求、要调调度和批处理时,底层可控性更有价值
部署优先
只有一个人维护、想快速上线时,封装好的那层更划算
嵌入优先
需要把推理塞进已有程序、依赖越少越好时,底层方案更合适
混合推理优先
显存不够、要用内存或 CPU 顶一部分算力时,可调参数空间更重要

按场景选后端,以及换过去怎么不翻车

选型不要一刀切。单人本地问答和调试,优先选省事的那条路;对外提供服务、有并发要求,优先选能调调度和批处理的那条路;两种需求同时存在,就拆成两个服务,别硬塞进一个进程。

  1. 固定三样东西换后端之前先把模型文件与量化档位、提示词模板、输出长度上限固定住,否则后面分不清变好变差是谁的功劳。
  2. 小流量并行新旧后端同时跑,用同一批问题喂进去,对比输出质量和耗时。这一步是验证等价性,不是比谁快。
  3. 切主流量确认输出质量没有明显退化后再切主流量,切的时候一次只动一个变量。
  4. 留回退路径保留旧后端的启动命令和配置快照,出问题能在几分钟内切回去,别把自己逼到只能现场调试。

有一种情况换了也没用:如果你的瓶颈在网络、在中转站限流、或者在硬盘读模型太慢,换后端基本白费。这时候先去 /tools/verify 把链路各段分开测,确认慢在哪一段,再决定动不动后端。

下一步想让自己的对比有参照系,可以到 /tools/speed-test 跑一遍当前后端的基线,再去 /sites 看看别人在同类硬件上用的什么组合,最后到 /price-watch 核对当时的成本数据,把性能账和成本账放一起看。

常见问题

同一个模型,Ollama 和 llama.cpp 跑出来速度差很多正常吗?

差一截是常见的,但差多少取决于你的量化档位、上下文长度、并发数以及有没有跑满显存。先把这些条件固定住再比,差异才有参考价值。如果差异大到离谱,先查是不是一边在 CPU 上跑、另一边在 GPU 上跑。

我就一个人用,有必要折腾 llama.cpp 吗?

多数情况下没必要。单人对话的瓶颈往往在首 token 等待和上下文长度,而不是极限吞吐。先用现成的跑顺,等你确实遇到「并发上不去」或「要嵌进自己程序」再迁移,成本更低。迁移前建议在站内先比对一遍各后端的适用场景再动手。

怎么判断慢是后端的问题而不是显存不够?

看显存曲线:如果接近占满并且速度在几十秒后明显下滑,多半是显存和卸载在拖。把上下文长度调小、量化降一档再测一次,如果速度恢复,问题就不在后端。反过来,显存很空但速度上不去,才值得去查后端的批处理和线程设置。

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