llama.cpp 技术指南:从快速上手到多后端推理的 C/C++ LLM 推理框架
llama.cpp 是一个纯 C/C++ 实现的 LLM(及 VLM)推理框架,核心目标是让大模型在“最少依赖”的前提下跑在从 Apple Silicon 到服务器 GPU 的广泛硬件上。本文基于仓库根目录的 README.md 展开,覆盖其四种安装路径、统一命令行入口 llama 的子命令结构、17 种推理后端矩阵,以及 CMake 构建选项背后的工程取舍,读完后可独立完成模型下载、CLI 推理、OpenAI 兼容 API 服务的部署,并理解各后端开关的落地位置。
快速上手:四条安装路径
README 的 Quick start 给出了四种安装方式,各自适用不同场景:
- 官网安装脚本:访问 llama.app 按指引安装(适合终端用户,支持
llama update自更新,见下文源码分析); - Docker 运行:参见 Docker 文档;
- 预编译二进制:从项目 releases 页下载,无需任何编译环境;
- 源码构建:克隆仓库后按 构建指南 编译(仓库顶层同时提供 Makefile 与 CMakeLists.txt,以及 CMakePresets.json 预设常用配置)。
安装完成后的两条最短命令——直接从 Hugging Face 下载模型并运行:
# 下载并运行 Hugging Face 上的模型(GGUF 格式)
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF
# 启动 OpenAI 兼容 API 服务
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUF
其中 -hf <user>/<model>[:quant] 参数会触发内置下载逻辑,模型获取文档 进一步说明:通过 MODEL_ENDPOINT 环境变量可指向任何兼容 Hugging Face API 的端点;本地已有 GGUF 文件时也可直接加载;非 GGUF 格式则需用仓库内的 convert_*.py 脚本(如 convert_hf_to_gguf.py)先转换,转换脚本清单 与 gguf-py 是格式层的参考实现。
统一二进制 llama 的子命令结构
上述 llama cli / llama serve 并非两个独立程序,而是由 统一入口 路由的单一可执行文件。从 app/llama.cpp 的命令表可以看到完整子命令集:
| 子命令 | 说明 | 别名 | 隐藏 |
|---|---|---|---|
serve |
HTTP API 服务 | server |
否 |
cli |
命令行交互式界面 | client |
否 |
download |
下载模型 | get |
否 |
completion |
文本补全 | complete |
是 |
bench |
提示处理与生成基准测试 | — | 是 |
batched-bench |
批量解码基准测试 | — | 是 |
fit-params |
计算适配设备显存的参数 | — | 是 |
quantize |
模型量化 | — | 是 |
perplexity |
困惑度与 KL 散度 | — | 是 |
update |
更新到最新 release | — | 仅官网安装可见 |
version / licenses / help |
版本、第三方许可、帮助 | — | 否 |
路由逻辑很简单:main 取第一个参数,在命令表中按名称或别名匹配,然后设置 LLAMA_APP_CMD 环境变量(保证子进程能正确重新调用自身),再调用对应函数(app/llama.cpp)。--help 默认只列非隐藏命令,llama help all 显示全部——所以 bench、quantize 这类“专家命令”不会干扰初学者的视野。update 命令的实现(app/llama.cpp)也印证了 README 的说法:只有通过 llama.app 脚本安装的构建(定义 LLAMA_INSTALL_BUILD)才支持自更新。
项目定位与设计要点
README 的 Description 部分陈述了 llama.cpp 的核心设计目标与五条技术特征,全部可在仓库中找到对应实现:
- 无依赖的纯 C/C++ 实现:核心库
llama的公开头文件仅 include/llama.h 与 include/llama-cpp.h,根 CMakeLists.txt 也只安装这两个头文件,第三方依赖全部采用 single-header 形式(见文末致谢),且均可选; - Apple Silicon 是一等公民:通过 ARM NEON、Accelerate 与 Metal 框架优化,Metal 后端在 ggml 的 CMake 中对 Apple 平台默认开启(
GGML_METAL_DEFAULT ON); - x86 全谱指令集:AVX / AVX2 / AVX512 / AMX;
- RISC-V 扩展:RVV、ZVFH、ZFH、ZICBOP、ZIHINTPAUSE;
- 低比特量化:1.5-bit 到 8-bit 的多种整数量化,兼顾推理速度与显存占用,量化类型定义集中在 ggml/src/ggml-quants.h,操作工具为 tools/quantize;
- 多 GPU 后端:NVIDIA GPU 使用自定义 CUDA 内核(ggml/src/ggml-cuda,含 187 个
.cu内核文件),AMD GPU 走 HIP,摩尔线程 GPU 走 MUSA,另有 Vulkan 与 SYCL 后端; - CPU+GPU 混合推理:对超出总显存的模型做部分卸载加速。
README 同时声明项目构建在 ggml 张量库之上——在本仓库中它以内嵌子目录形式存在(ggml/),根 CMakeLists.txt 通过 add_subdirectory(ggml) 将其纳入同一构建,也可用 LLAMA_USE_SYSTEM_GGML 选项改用系统安装的 libggml。
支持的推理后端矩阵
README 的 “Supported backends” 表是全项目硬件覆盖度的权威清单,17 个后端及其目标设备与文档入口如下:
| 后端 | 目标设备 | 文档 |
|---|---|---|
| BLAS | 全平台 | 构建指南 BLAS 小节 |
| BLIS | 全平台 | docs/backend/BLIS.md |
| CANN | 昇腾 NPU | docs/backend/CANN.md |
| CUDA | NVIDIA GPU | 构建指南 CUDA 小节 |
| HIP | AMD GPU | 构建指南 HIP 小节 |
| Hexagon(进行中) | 高通骁龙 | docs/backend/snapdragon/README.md |
| IBM zDNN | IBM Z / LinuxONE | docs/backend/zDNN.md |
| MUSA | 摩尔线程 GPU | 构建指南 MUSA 小节 |
| Metal | Apple Silicon | 构建指南 Metal 小节 |
| OpenCL | Adreno GPU | docs/backend/OPENCL.md |
| OpenVINO(进行中) | Intel CPU/GPU/NPU | docs/backend/OPENVINO.md |
| RPC | 全平台(分布式) | tools/rpc |
| SYCL | Intel GPU | docs/backend/SYCL.md |
| VirtGPU | VirtGPU APIR | docs/backend/VirtGPU.md |
| Vulkan | 通用 GPU | 构建指南 Vulkan 小节 |
| WebGPU | 全平台(浏览器) | 构建指南 WebGPU 小节 |
| ZenDNN | AMD CPU | docs/backend/ZenDNN.md |
各后端在 ggml/CMakeLists.txt 中均以 GGML_<BACKEND> 选项控制,例如 GGML_CUDA、GGML_VULKAN、GGML_SYCL 等,默认关闭(Metal 在 Apple 平台除外)。以 CUDA 为例,该文件还暴露了若干进阶旋钮:GGML_CUDA_FA(FlashAttention 内核,默认开)、GGML_CUDA_GRAPHS(CUDA graphs,默认开)、GGML_CUDA_COMPRESSION_MODE(可选 none/speed/balance/size)等——这说明后端的可编译性只是第一层,运行时行为还有独立的调优面。
源码目录结构也与后端矩阵一一对应:ggml/src 下每个 ggml-<name>/ 子目录即一个后端的内核与绑定实现(ggml-cpu、ggml-cuda、ggml-metal、ggml-vulkan、ggml-opencl、ggml-sycl、ggml-rpc、ggml-openvino、ggml-cann、ggml-et、ggml-hexagon、ggml-virtgpu、ggml-webgpu、ggml-zdnn、ggml-zendnn 等),各后端算子覆盖度可在 docs/ops.md 的 CSV 矩阵中核对。
工具生态:cli、completion、server 与 GBNF
README 的 Documentation 章节把用户侧能力归纳为四个工具入口:
- tools/cli:交互式命令行界面,支持聊天、多模态(VLM)会话,是
-hf快速体验的主入口; - tools/completion:面向单次/批量补全场景,支持按提示词生成、反向提示等;
- tools/server:基于 cpp-httplib + nlohmann/json + llama 库的轻量 HTTP 服务,提供一组 LLM REST API 与内置 Web UI(
LLAMA_BUILD_UI选项控制是否内嵌编译,默认使用预构建 UI,见 CMakeLists.txt); - GBNF 语法:GGML BNF 是一种形式文法描述格式,用于约束模型输出——例如强制输出合法 JSON 或只输出 emoji,在
tools/cli、tools/completion、tools/server中均有支持,grammars/ 目录附带json.gbnf、c.gbnf、chess.gbnf等现成语法。
构建系统:从 CMake 选项理解工程取舍
对想要深入定制构建的读者,根 CMakeLists.txt 的选项区(约 L116-L146)是一份精炼的“功能开关清单”:
LLAMA_BUILD_TOOLS/LLAMA_BUILD_TESTS/LLAMA_BUILD_EXAMPLES/LLAMA_BUILD_SERVER/LLAMA_BUILD_APP:独立构建(standalone)时默认全部开启,作为库被上层工程引入时则自动关闭;LLAMA_OPENSSL(默认开):启用 HTTPS,是-hf下载与服务器 TLS 的前提;LLAMA_SUBPROCESS(默认开,移动端/WASM 平台自动关):服务器路由等特性依赖子进程能力,这也是 CMakeLists.txt 中按CMAKE_SYSTEM_NAME特判的原因;LLAMA_SANITIZE_THREAD/ADDRESS/UNDEFINED:三套 sanitizer,配合 tests/ 下的 test-thread-safety.cpp 等用例做并发问题排查。
版本策略同样值得注意:CMakeLists.txt 中 LLAMA_VERSION 基于 major.minor.patch(当前为 0.3.0)拼装,LLAMA_BUILD_IS_DEV 开启时追加 -dev 后缀——这解释了 release 徽章(v 开头 tag)与 nightly 徽章(b 开头 tag)并存的原因。旧版选项名(如 LLAMA_CUBLAS、LLAMA_CUDA、LLAMA_METAL)已被 llama_option_depr 函数(CMakeLists.txt)统一迁移到 GGML_* 命名空间,即后端开关的权威定义在 ggml 层而非 llama 层——理解这一点对阅读各后端构建文档至关重要。
移动端与移动端生态另有专题:Android 构建(配套 examples/llama.android 演示工程)、XCFramework 打包(LLAMA_BUILD_MTMD 选项支持单独构建多模态库用于 Apple 语言绑定,见 CMakeLists.txt)。
模型、量化与性能调优
围绕“拿到一个能跑的模型”这条主线,README 的 Development 文档组形成完整闭环:
- 获取模型:docs/models.md 说明 GGUF 为唯一要求的存储格式,Hugging Face 上有海量兼容模型,
-hf参数支持:quant后缀直接指定量化档位; - 量化操作:tools/quantize 提供量化命令,tools/imatrix 提供基于信息矩阵的量化校准(
llama bench/perplexity可用于量化前后的质量对照); - 多 GPU 切分:docs/multi-gpu.md 覆盖张量并行与层间 offload;
- 性能排障:token 生成性能技巧 给出从 CPU 频率、线程数到后端选择的排查路径;
- 发布流程:docs/release.md 描述 release tag、夜构建与徽章的对应关系;
- 补全参数:docs/completions.md 汇总
--temp、--top-k等采样参数(底层实现在 common/sampling.cpp)。
第三方依赖致谢
README 末尾的 Acknowledgements 列举了项目依赖的全部 single-header 库,这与“无依赖 C/C++”的设计并不矛盾——依赖被刻意收敛到可整体删除的单头文件级别:
| 库 | 用途 | 许可 |
|---|---|---|
| yhirose/cpp-httplib | llama-server 的 HTTP 服务器 |
MIT |
| nothings/stb | 多模态子系统的图像解码 | Public domain |
| nlohmann/json | 各工具/示例的 JSON 处理 | MIT |
| mackron/miniaudio | 多模态子系统的音频解码 | Public domain |
| sheredom/subprocess.h | C/C++ 子进程启动 | Public domain |
对应源码位于 common/download.cpp、common/subproc.cpp 等文件,llama licenses 子命令可在运行时输出这些许可声明(app/llama.cpp)。
贡献与协作
README 的 Contributing 章节明确了协作规则:贡献者可直接开 PR,维护者可向 master 合并;issue、PR 与项目的维护同样欢迎外部参与。更完整的规范见 CONTRIBUTING.md,仓库根的 AGENTS.md 与 skills/ 目录还提供了面向自动化开发流程的贡献指引;新模型适配可参考 docs/development/HOWTO-add-model.md 与 conversion/ 下的各模型转换脚本。
小结
llama.cpp 的 README 用一页篇幅勾勒出一个清晰的工程蓝图:以 ggml 为张量底座、以统一 llama 二进制为体验入口、以 17 个可插拔后端覆盖从手机 NPU 到数据中心 GPU 的硬件谱系,再用 GBNF 语法、量化工具链和多模态子系统补齐生产级能力。从 app/llama.cpp 的命令表到 ggml/CMakeLists.txt 的后端开关,再到 docs/ 下的专题文档,每一处 README 声明都有对应的可验证落点——这正是该项目值得在本地大模型场景中深入使用的核心原因。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00