首页
/ llama.cpp 技术指南:从快速上手到多后端推理的 C/C++ LLM 推理框架

llama.cpp 技术指南:从快速上手到多后端推理的 C/C++ LLM 推理框架

2026-09-06 14:22:41作者:平淮齐Percy

llama.cpp 是一个纯 C/C++ 实现的 LLM(及 VLM)推理框架,核心目标是让大模型在“最少依赖”的前提下跑在从 Apple Silicon 到服务器 GPU 的广泛硬件上。本文基于仓库根目录的 README.md 展开,覆盖其四种安装路径、统一命令行入口 llama 的子命令结构、17 种推理后端矩阵,以及 CMake 构建选项背后的工程取舍,读完后可独立完成模型下载、CLI 推理、OpenAI 兼容 API 服务的部署,并理解各后端开关的落地位置。

快速上手:四条安装路径

README 的 Quick start 给出了四种安装方式,各自适用不同场景:

  1. 官网安装脚本:访问 llama.app 按指引安装(适合终端用户,支持 llama update 自更新,见下文源码分析);
  2. Docker 运行:参见 Docker 文档
  3. 预编译二进制:从项目 releases 页下载,无需任何编译环境;
  4. 源码构建:克隆仓库后按 构建指南 编译(仓库顶层同时提供 MakefileCMakeLists.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 显示全部——所以 benchquantize 这类“专家命令”不会干扰初学者的视野。update 命令的实现(app/llama.cpp)也印证了 README 的说法:只有通过 llama.app 脚本安装的构建(定义 LLAMA_INSTALL_BUILD)才支持自更新。

项目定位与设计要点

README 的 Description 部分陈述了 llama.cpp 的核心设计目标与五条技术特征,全部可在仓库中找到对应实现:

  • 无依赖的纯 C/C++ 实现:核心库 llama 的公开头文件仅 include/llama.hinclude/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_CUDAGGML_VULKANGGML_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-cpuggml-cudaggml-metalggml-vulkanggml-openclggml-syclggml-rpcggml-openvinoggml-cannggml-etggml-hexagonggml-virtgpuggml-webgpuggml-zdnnggml-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/clitools/completiontools/server 中均有支持,grammars/ 目录附带 json.gbnfc.gbnfchess.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.txtLLAMA_VERSION 基于 major.minor.patch(当前为 0.3.0)拼装,LLAMA_BUILD_IS_DEV 开启时追加 -dev 后缀——这解释了 release 徽章(v 开头 tag)与 nightly 徽章(b 开头 tag)并存的原因。旧版选项名(如 LLAMA_CUBLASLLAMA_CUDALLAMA_METAL)已被 llama_option_depr 函数(CMakeLists.txt)统一迁移到 GGML_* 命名空间,即后端开关的权威定义在 ggml 层而非 llama 层——理解这一点对阅读各后端构建文档至关重要。

移动端与移动端生态另有专题:Android 构建(配套 examples/llama.android 演示工程)、XCFramework 打包LLAMA_BUILD_MTMD 选项支持单独构建多模态库用于 Apple 语言绑定,见 CMakeLists.txt)。

模型、量化与性能调优

围绕“拿到一个能跑的模型”这条主线,README 的 Development 文档组形成完整闭环:

  1. 获取模型docs/models.md 说明 GGUF 为唯一要求的存储格式,Hugging Face 上有海量兼容模型,-hf 参数支持 :quant 后缀直接指定量化档位;
  2. 量化操作tools/quantize 提供量化命令,tools/imatrix 提供基于信息矩阵的量化校准(llama bench/perplexity 可用于量化前后的质量对照);
  3. 多 GPU 切分docs/multi-gpu.md 覆盖张量并行与层间 offload;
  4. 性能排障token 生成性能技巧 给出从 CPU 频率、线程数到后端选择的排查路径;
  5. 发布流程docs/release.md 描述 release tag、夜构建与徽章的对应关系;
  6. 补全参数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.cppcommon/subproc.cpp 等文件,llama licenses 子命令可在运行时输出这些许可声明(app/llama.cpp)。

贡献与协作

README 的 Contributing 章节明确了协作规则:贡献者可直接开 PR,维护者可向 master 合并;issue、PR 与项目的维护同样欢迎外部参与。更完整的规范见 CONTRIBUTING.md,仓库根的 AGENTS.mdskills/ 目录还提供了面向自动化开发流程的贡献指引;新模型适配可参考 docs/development/HOWTO-add-model.mdconversion/ 下的各模型转换脚本。

小结

llama.cpp 的 README 用一页篇幅勾勒出一个清晰的工程蓝图:以 ggml 为张量底座、以统一 llama 二进制为体验入口、以 17 个可插拔后端覆盖从手机 NPU 到数据中心 GPU 的硬件谱系,再用 GBNF 语法、量化工具链和多模态子系统补齐生产级能力。从 app/llama.cpp 的命令表到 ggml/CMakeLists.txt 的后端开关,再到 docs/ 下的专题文档,每一处 README 声明都有对应的可验证落点——这正是该项目值得在本地大模型场景中深入使用的核心原因。

登录后查看全文
热门项目推荐
相关项目推荐