简介
大模型发展日新月异,推理性能始终是落地的关键瓶颈。llama.cpp 作为一个轻量级、低依赖的 C/C++ 实现,解决了在 CPU 甚至无 GPU 环境下运行 LLaMA 模型的难题。它支持广泛的硬件后端(AVX、Metal、CUDA、Vulkan 等),并提供多种量化方案来平衡速度与精度。
相比传统的 Python 框架,llama.cpp 的优势在于纯粹的 C/C++ 实现,没有外部依赖,且支持 CPU+GPU 混合推理,能够突破显存限制。此外,它还内置了服务化组件,可直接对外提供 API。
环境安装
首先克隆仓库并进入目录:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
构建 GPU 执行环境前,请确保已安装 CUDA 工具包。若 nvidia-smi 和 nvcc --version 无报错,则环境配置正确。
使用以下命令编译(注意空格):
mkdir build
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j4
cd build
make install
当前版本中,部分指令已重命名为 llama-quantize、llama-cli 和 llama-server。建议建立软链接以便调用:
ln -s /path/to/llama.cpp/build/bin/llama-quantize ./llama-quantize
ln -s /path/to/llama.cpp/build/bin/llama-server ./llama-server
ln -s /path/to/llama.cpp/build/bin/llama-cli ./llama-cli
模型转换流程
我们将以 PTH 格式模型为例,演示如何将其转换为 llama.cpp 可用的 GGUF 格式。
1. 原始模型处理
首先需要准备高版本的 Python 环境(3.10+)及相关依赖:
pip install protobuf==3.20.0 transformers sentencepiece peft
下载原版 LLaMA 权重和 tokenizer 文件。如果官方下载受限,可使用社区提供的资源或脚本自动下载。下载完成后,目录结构通常如下(以 7B 为例):
├── llama-7b
│ ├── consolidated.00.pth
│ ├── params.json
│ └── checklist.chk
└── tokenizer.model
2. 转为 HuggingFace 格式
为了兼容性,建议先将原始 PTH 模型转换为 HF 格式。可以使用 Transformers 库提供的转换脚本:
git clone https://github.com/huggingface/transformers.git
cd transformers
python src/transformers/models/llama/convert_llama_weights_to_hf.py \
--input_dir /workspace/pth_model/7B \
--model_size 7B \
--output_dir /workspace/hf_data
输出目录将包含 config.json、pytorch_model.bin 等标准 HF 文件。
3. LoRA 合并(可选)
如果使用过微调后的 LoRA 模型,需先合并权重生成全量模型。以 Chinese-LLaMA-Alpaca 为例:
git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca.git
cd Chinese-LLaMA-Alpaca
python scripts/merge_llama_with_chinese_lora.py \
--base_model /workspace/hf_data \
--lora_model /workspace/chinese_llama_lora_7b \
--output_dir /workspace/lora_pth_data
注意检查生成的 SHA256 值以确保完整性。若遇到内存不足错误,可指定 --offload_dir 进行缓存。
4. 转为 GGUF 并量化
这是最关键的一步。llama.cpp 提供了 convert_hf_to_gguf.py 脚本将 HF 模型转为 GGUF 格式,并使用 llama-quantize 进行量化。
# 转换 HF 到 GGUF (F16)
python convert_hf_to_gguf.py ../hf_data --outfile /workspace/chinese_gguf/llama-7b.gguf --outtype f16
# 量化为 Q4_0 (推荐用于消费级显卡)
./llama-quantize /workspace/chinese_gguf/llama-7b.gguf /workspace/chinese_gguf/llama-7b-q4_0.gguf Q4_0
量化类型选择直接影响速度与精度。Q4_K_M 通常是性价比最高的选择,而 Q8_0 则接近原始精度但体积较大。
运行与推理
交互模式
使用 llama-cli 可以直接在终端进行对话测试:
llama-cli -m chinese_q4_0.gguf -p "You are a helpful assistant" -cnv -ngl 24
参数说明:
-m: 指定模型文件路径。-cnv: 启用对话模式。-ngl: 卸载层数,设为 24 表示尽可能利用 GPU 加速。
API 服务
llama.cpp 内置了 OpenAI 兼容的 API 接口,启动 llama-server 即可:
./llama-server -m /mnt/workspace/my-llama-13b-q4_0.gguf -ngl 28
启动后默认监听 8080 端口。可通过 curl 测试:
curl --request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "What color is the sun?", "n_predict": 512}'
日志中会显示 offloading ... layers to GPU,确认模型已在 GPU 上运行。
若需通过 Python 调用,可安装 openai 库并配置 base_url:
import openai
client = openai.OpenAI(
base_url="http://127.0.0.1:8080/v1",
api_key="sk-no-key-required"
)
completion = client.chat.completions.create(
model="qwen",
messages=[{"role": "user", "content": "tell me something about michael jordan"}]
)
print(completion.choices[0].message.content)
搭建 Web 聊天界面
为了获得更好的交互体验,可以结合 Open WebUI 打造类似 ChatGPT 的界面。Open WebUI 支持离线运行,兼容多种 LLM 后端。
通过 Docker 快速部署:
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
访问 http://localhost:3000/ 注册账号后即可使用。该界面支持 Markdown 渲染、代码高亮、多模型切换及 RAG 集成等功能。

