llama.cpp部署大模型

模型与算力

讲清 llama.cpp 从编译、量化到启动的完整流程,含参数选择、卡点排查与选型边界,帮你本地跑通模型。

想在本地跑模型,看到别人一句 llama.cpp 就带过了,自己上手却卡在编译报错、量化文件挑不明白、启动后速度慢得没法用。这篇按顺序把三件事拆开讲:怎么把工具编出来、量化档位和文件格式怎么对、启动参数按什么思路调。每一步都告诉你验证方法和出错先查哪里,最后说清什么情况别用 llama.cpp。

想在本地跑模型,看到别人一句 llama.cpp 就带过了,自己上手却卡在编译报错、量化文件挑不明白、启动后速度慢得没法用。这篇按顺序把三件事拆开讲:怎么把工具编出来、量化档位和文件格式怎么对、启动参数按什么思路调。每一步都告诉你验证方法和出错先查哪里,最后说清什么情况别用 llama.cpp。

你别指望一次就把参数调到位,本地推理是个试错过程。先跑通,再谈快慢。下面按编译、权重、启动、验证、排查、边界、流程的顺序来,每一步都有能动手做的事。

先搞清 llama.cpp 适合干什么活

它是纯 C/C++ 写的推理实现,不依赖 Python 环境,编译完就是几个可执行文件,适合想在普通机器、Mac 或没有显卡的机器上跑模型的人。优势集中在单机单人、显存或内存吃紧、要离线、要嵌入自己程序的场景;不擅长高并发服务,批量请求场景该看别的方案。

纯 CPU 推理
没有独显也能跑,速度取决于你的 CPU 和内存带宽,适合小模型或对响应速度要求不高的场景。
混合推理
部分层放显卡,部分层留 CPU,适合显存不够全放的机器,但层数分配要试。
本地接口服务
自带 server 模式,可以起一个兼容 OpenAI 风格的端点,给本地工具或脚本调。

先说清不适用:多人同时访问、要求稳定吞吐、需要动态批处理的线上服务,llama.cpp 不是首选,站内选型对照可到 /ai-nav/category/ai-model-platform 看平台类目录。如果你要的是对外提供稳定 API,那就该看托管方案,别拿单机工具硬扛。

编译:先备环境,再按后端选开关

准备编译器与构建工具链:Linux 装好 gcc/g++ 与 cmake,Windows 用对应工具链,Mac 装好 Xcode 命令行工具,缺哪个装哪个,报错基本都在这一步。装完先跑一遍版本检查,确保 cmake 和编译器都能正常输出。

按硬件决定后端:NVIDIA 卡开 CUDA,Mac 开 Metal,AMD 开 ROCm,纯 CPU 就不加开关。不确定自己的卡属于哪类,到 /compute/gpus 对照加速卡规格库。后端选错,编译可能过,但运行会崩或者完全用不上显卡。

  1. 装工具链Linux 下用包管理器装 build-essential 和 cmake;Mac 下装 Xcode Command Line Tools;Windows 下装对应编译器和 cmake。装完执行 cmake --version 确认能输出版本号。
  2. 选后端开关根据你的显卡类型决定开不开 CUDA、Metal 或 ROCm。不确定就先不开,纯 CPU 编译一次,确认工具能跑起来,再加后端开关重新编译。
  3. 编译并冒烟编译完成后立刻用最小模型文件跑一句对话,确认可执行文件能加载权重、能出字。编译过了但跑不动,通常是后端和驱动没对上,回去检查驱动版本和编译开关。

权重与量化:先选格式,再选档位

llama.cpp 吃的是 GGUF 格式,从别处下到的权重如果格式不对,需要先转换再量化,转换脚本和量化脚本都在编译出来的工具里,别去外面找第三方工具。转换前确认原始权重完整,转换后文件大小合理,能加载才算成功。

量化档位是在质量、体积、速度之间做取舍:位宽越低体积越小、跑得越快,但输出更容易变味。判断标准是先跑你自己的真实任务,比一个没人看的通用分数靠谱。同一模型不同量化文件大小差别很大,下载前先算一遍你的显存或内存够不够放,算的方法到 /models/deploy 用部署测算工具过一遍。

考虑因素低档位(体积小)中档位(均衡)高档位(体积大)
质量表现容易变味,适合简单任务多数任务够用接近原始模型,适合细活
运行速度最快,占用最低中等最慢,占用最高
内存需求低,小内存机器友好中等高,需要大内存或显存
适用场景快速验证、轻量问答日常离线使用对输出质量要求高的任务
  • 不要迷信某个档位「一定够用」:上下文开得越长、同时跑的任务越多,实际占用比理论值高,留出余量再决定。
  • 下载量化文件时核对文件大小和哈希值,避免下到一半或者下错文件。
  • 同一模型的不同量化文件,可以在同一台机器上跑同一个任务对比输出,选择你能接受的最低档位来换取速度。
  • 如果你要转换权重,先确认原始格式和转换脚本匹配,否则转出来文件可能加载失败。

启动:把参数分成三组来调

第一组是模型与上下文:指定模型文件路径、上下文长度、线程数。上下文不是越大越好,开太大直接吃内存,还会拖慢速度,先按任务实际需要设。线程数一般设成物理核心数,设太多反而因为调度开销变慢。

第二组是硬件卸载:把多少层放到显卡上跑由参数控制,放不下就往 CPU 挪。想全放 GPU 就先看显存够不够,不够就降量化档位或减层数,别硬撑。第三组是服务化:想做成本地接口,用自带的 server 模式起一个兼容 OpenAI 风格的端口,再让上层工具连;端点地址、端口这些细节自己对一遍 /ai-dict/category/infra。

参数组主要参数调整思路
模型与上下文模型路径、上下文长度、线程数上下文按任务需要设,线程数设物理核心数,不要超
硬件卸载卸载层数显存够就多放,不够就少放,从少到多加
服务化端口、监听地址默认只监听本地,需要外部访问再改,注意安全

跑通之后先量三个数

加载时间:从启动到能响应第一句话,这段太长说明权重太大或磁盘太慢,机械盘换固态往往立竿见影。生成速度:直接看每秒出多少字,判断体感能不能接受,横向比对的量法可以参照 /tools/speed-test 的测速思路。内存与显存占用:跑起来用系统监控看一眼峰值,再乘以你计划的并发倍数,就知道这台机器还能不能干别的。

指标怎么量判断标准
加载时间从执行启动命令到出现第一个回复的时间超过十几秒就要看磁盘和权重大小
生成速度看每秒输出字符数或单词数低于你的阅读速度就影响体验
内存峰值系统监控工具看进程占用留出至少三分之一余量给系统和其他程序

把这三个数记下来,换量化档位或改参数后再测一遍,你才有自己的对照表,而不是凭感觉说「好像快了点」。

卡住了按这个顺序排查

第一步看编译:任何后端相关的报错,先回到编译阶段,确认后端开关开了、驱动和工具链版本匹配。第二步看文件:加载失败先确认文件是不是完整的 GGUF、有没有下到一半,再确认路径里没有中文和空格。第三步看资源:能加载但一跑就崩或极慢,基本是内存/显存不够,降档位、减层数、缩上下文,三选一或一起上。第四步看参数:前面都排除了再动参数,把上下文、线程数、卸载层数恢复到保守值,一次调一项。

  1. 检查编译与后端确认编译时后端开关是否打开,驱动版本是否匹配。重编译一次确保干净。
  2. 检查文件完整性确认模型文件是完整 GGUF,路径无中文和空格,文件大小与来源标注一致。
  3. 检查资源占用启动时看内存显存峰值,超了就降量化档位、减卸载层数、缩上下文。
  4. 恢复保守参数把上下文、线程数、卸载层数设回默认或保守值,确认能跑,再逐项调整。

什么情况下别折腾 llama.cpp

要对外提供稳定服务、有并发要求时,去 /compute/platforms 看算力怎么买更合适,或者对比托管推理的路子,别拿单机工具硬扛。团队里没人愿意碰命令行和编译,只想装个东西就能聊天,用带图形界面的整合包更省事。模型需要频繁换、要跑很多个不同架构时,自己编译维护的成本会滚起来,先估算维护时间再决定。硬件本身太弱、参数规模和内存差太远时,再怎么调量化档位也换不来体验,该换机器或换小模型。

  • 并发请求超过个位数,或者要求响应时间稳定,就不要用 llama.cpp 直接对外。
  • 需要图形界面、一键启动的团队,优先考虑整合包或桌面应用。
  • 模型切换频繁、要维护多个架构,编译成本高于收益。
  • 机器内存或显存低于模型最低要求,调参也救不回来。

一套可复用的小流程

定任务:先写清楚这台机器要干什么活,是离线问答、本地文档处理还是给程序提供接口,任务决定模型规模和量化档位。算资源:按模型规模估内存显存,留出余量,测算入口在 /models/deploy。编译验证:先跑通再优化,编译通过是后面所有工作的前提。调参记录:每次只改一项,把加载时间、生成速度、占用记成表,形成自己机器的基线。再决定要不要换方案:如果调完还是不满意,回到选型环节重新比一遍,参考 /ai-nav/category/ai-api 里的接入选项。许可证别忽略:权重能不能商用、要满足什么条件,装之前先看清楚,判断思路可对照 /safety 的合规条目。

常见问题

llama.cpp 和 Ollama 到底该用哪个?

看你要的是什么。Ollama 帮你把模型管理、下载、接口都包好了,装上就能用,省事;llama.cpp 是底层实现,编译和参数全在你手里,适合要接进自己程序、要精细控制显存、或者环境里不方便装一堆依赖的场景。只想快点聊天选前者,要嵌入和调优选后者。

编译一直报错怎么办?

先分清是哪一类:找不到编译器说明工具链没装全;报后端相关的错说明 CUDA、Metal 或 ROCm 的环境和驱动没对上。做法是先把后端开关关掉,用纯 CPU 编一遍确认基础流程通,再加上后端。这一步能过,问题就锁定在后端环境里,去查驱动的版本匹配。

量化到很低的档位会不会变傻?

会掉一些,但掉多少跟任务强相关。写代码、做数学、长链条推理这类任务,低档位更容易露馅;摘要、分类、信息抽取这类相对宽泛的任务,感受往往没那么明显。判断方法只有一个:拿你自己的真实输入在两个档位下各跑一遍,对比后再决定,别只信别人的一句话结论。

跑起来特别慢,先动哪个参数?

先看是不是没卸载到显卡上,全在 CPU 跑当然慢;能上卡的话优先调卸载层数。其次看上下文长度,开得过大对速度和内存都是负担,按任务需要往下压。最后才是线程数之类的细节。调的顺序是资源类参数优先,细节参数最后。

能不能拿它做对外的服务接口?

能起一个本地接口给自己或小范围用,但要清楚它的定位是单机推理。并发一上来、请求排队,体验会明显变差。要对外提供服务,先按并发量估算需要多少卡,方法参考 /compute/sizing,再对比租卡和托管推理的成本,别直接拿单机方案上线。

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