Llama.cpp 构建于 ggml 之上、C/C++ 实现、以GGUF 为主要模型格式的开源大模型推理项目,多用量化后的模型,利用 CPU、GPU 及系统内存,在普通个人电脑和消费级硬件上本地运行。
借助 ARM NEON、Accelerate、Metal 等技术的深度优化,对 Apple Silicon 支持较好,非常适合 Apple 用户使用。
| 名称 | 是什么 | llama.cpp 中大致负责 |
|---|---|---|
| ARM NEON | ARM CPU 的 SIMD 指令集扩展 | CPU 向量计算加速 |
| Apple Accelerate | Apple 提供的高性能数学计算框架 | CPU 数学/矩阵运算加速 |
| Metal | Apple 的 GPU 图形与通用计算 API | GPU 加速 |
ARM NEON:
-
ARM 架构提供的 SIMD(Single Instruction, Multiple Data)向量指令技术;
-
普通 CPU 指令可能一次处理一个数,而 SIMD 可以让一条指令同时处理一组数据。矩阵、向量这些 LLM 推理中大量存在的运算非常适合这种方式;
-
ARM NEON = Apple Silicon CPU 底层的向量计算能力之一;
Apple Accelerate:
-
利用 CPU 的向量处理能力,提供高性能、低能耗的计算。里面包含:BLAS / LAPACK、vDSP、vForce、BNNS、vImage、Sparse Solvers 等;
-
Accelerate = Apple 官方提供的 CPU 高性能数学计算框架;
Metal 类比:
-
Apple Silicon:Metal → Apple GPU
-
NVIDIA:CUDA → NVIDIA GPU
NEON + Accelerate 让 CPU 为什么能跑得不错,Metal 处理 GPU 怎么参与加速。
llama.cpp 支持 macOS、Linux、Windows、iOS、Android 平台,提供命令行工具和图形界面工具。
模型合集
Llama Models 精选了一批开源模型,都可以在 llama.cpp 中直接运行,同时给出了所需要的内存大小,方便用户选择适合自己硬件的模型。
此外,还可以在 Hugging Face 上找到更多模型(截止目前,GGUF 模型的数量为:208,750),并使用 llama.cpp 进行推理。
进入 Text Generation 类型的模型仓库页面时,比如:ukisai/Swift-1.5-Qwen3.8-27B-GSQ-RCO-GGUF,点击右侧的”Use this model“,在弹出的面板选择 llama.cpp,可以看到不同平台的安装及运行命令,按照其方式操作即可。
安装
Linux Server 推荐使用 One-line install command 安装,如下,该命令会自动检测平台架构,获取最新版本二进制并安装。
curl -LsSf https://llama.app/install.sh | sh
# 输出类似
Version: b11200
Probing CUDA...
Downloading cuda-probe...
Found: 89
Downloading llama...
Installation completed successfully
To make llama available in future sessions, add ~/.local/bin to your PATH by running:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile
Then open a new terminal and run:
llama serve
To start it now without modifying your PATH, run:
~/.llama-app/llama serve安装完成后,查看版本:
llama cli --version
# 输出类似
version: 0.5.0-dev (build 11200, commit 81bc6b83f)
built with Clang 19.1.7 for Linux x86_64macOS 也可以使用命令行安装,但是推荐使用图形化界面,下载dmg 文件安装。
Windows、Android 等平台,查看 releases 页面,下载对应的 zip 文件。
工具
llama.cpp 提供了模型推理与输出控制工具,日常使用:
-
主要关注 CLI 和 Server;
-
llama-completion与 GBNF Grammar 仍然存在并被维护,但更多用于原始文本生成、兼容特殊模型或进行更底层的生成控制;
llama cli
llama cli 是 llama.cpp 当前主要的本地命令行交互入口,适合直接加载 GGUF 模型并在终端中进行推理和对话。
llama cli -m <model-path.gguf>多模态模型加载对应的 multimodal projector:
llama cli -m <model-path.gguf> --mmproj <mmproj-path.gguf>适合:
-
本地快速测试模型;
-
SSH 环境直接与模型交互;
-
测试 GGUF 是否能够正常加载;
-
调整 context、GPU offload、sampling 等推理参数;
-
测试图片等多模态输入;
llama cli 是当前使用 llama.cpp 最直接的交互式入口之一。
llama serve
llama serve 用于将模型作为长期运行的推理服务启动,同时提供 HTTP API 和 Web UI。
llama serve -m <model-path.gguf>多模态模型加载对应的 multimodal projector:
llama serve -m <model-path.gguf> --mmproj <mmproj-path.gguf>相比 llama cli,不再只是当前 Terminal Session 中直接与模型交互,而是把模型变成一个可以被其他程序调用的服务。
典型用途:
-
浏览器 Web UI 测试模型;
-
OpenAI-compatible API;
-
Python / JavaScript 客户端调用;
-
接入自己的 FastAPI、Agent 或其他应用;
-
局域网或远程提供模型服务;
如果服务暴露到非可信网络,需要配置 API Key 或其他访问控制,不能直接裸露推理端口。
llama cli 面向“人直接使用模型”,llama serve 面向“把模型作为服务提供出去”。
llama-completion
和 cli 类似,也能加载 GGUF 进行推理,但是抽象层级和使用目标不同,不需要作为日常使用重点,但它们能帮助理解 llama.cpp 更底层的生成机制,是偏向原始 Prompt → Completion 文本生成的工具,例如:
llama-completion \
-m model.gguf \
-p "Once upon a time" \
-n 128 \
-no-cnv保留了较多直接控制文本交互过程的能力,例如:
reverse prompt
input prefix
input suffix
interactive mode
chat template
sampling parameters其中 reverse prompt、input prefix / suffix 是早期 LLM 使用方式。
例如早期模型通过如下纯文本结构模拟对话:
User: Hello
Assistant:input prefix / suffix 可以帮助程序自动拼接这些文本;reverse prompt 则可以在模型生成到特定文本,例如 User: 时停止生成并把控制权交回用户。
现代 Chat / Instruct 模型通常已经通过 Chat Template 管理:
System
User
Assistant之间的消息格式和对话边界,因此普通用户已经很少需要手动管理这些内容。
但 llama-completion 仍然有价值,例如:
-
Base Model 的原始文本续写;
-
没有标准 Chat Template 的模型;
-
自定义 Prompt 格式;
-
调试 Chat Template;
-
研究模型原始 completion 行为;
-
特殊 Fine-tune / 老模型兼容;
llama-completion是 llama.cpp 保留的偏底层文本生成工具;现代 Chat / Instruct 模型的日常交互通常优先使用llama cli。
GBNF Grammar
GBNF 严格来说不是一个独立工具,而是 llama.cpp 的 Grammar 格式与约束生成机制。
GBNF:GGML BNF,基于 BNF(Backus–Naur Form,巴科斯范式)的思想,用于描述允许模型生成什么样的文本结构。例如:
root ::= "yes" | "no"模型生成时就只能产生符合该 Grammar 的内容,大致流程:
模型预测 Token
↓
Grammar 判断哪些 Token 合法
↓
限制 Sampling 候选
↓
选择合法 Token
↓
继续生成属于:Constrained Decoding / Constrained Generation(约束解码 / 约束生成)。
GBNF 可以用于限制:
-
JSON;
-
固定文本格式;
-
DSL;
-
特定命令语法;
-
SQL 等结构化语言;
-
自定义协议或输出格式;
现代应用开发通常不需要自己编写 GBNF,例如模型需要输出:
{
"name": "Ocean",
"age": 18
}应用层通常定义 JSON Schema,然后通过 llama.cpp 的 Structured Output 能力进行约束。
GBNF 从普通用户需要直接接触的接口,逐渐下沉为 llama.cpp 约束生成体系中的底层能力;现代应用通常通过 JSON Schema / Structured Output 等更高层接口使用这类能力。
如果需要描述 JSON 以外的特殊语言、DSL 或精确语法,直接编写 Grammar 仍然有价值。
关系
| 名称 | 定位 | 当前使用频率 |
|---|---|---|
llama cli | 本地交互式推理 | 常用 |
llama serve | Web UI + HTTP API 服务化 | 常用 |
llama-completion | 原始 Prompt / Completion 与底层交互控制 | 较少直接使用 |
| GBNF Grammar | 约束模型生成内容的语法机制 | 较少手写,底层仍重要 |
日常使用
├── llama cli
│ └── 直接与模型交互
│
└── llama serve
└── 把模型变成服务
深入理解
├── llama-completion
│ └── Prompt → Completion / 原始文本交互控制
│
└── GBNF Grammar
└── Constrained Decoding / 输出结构约束