简介
llama.cpp 是一个用于大语言模型推理的 C/C++ 库,主要解决推理过程中的性能问题。其设计理念旨在实现轻量级、最小外部依赖、多平台以及广泛灵活的硬件支持。
- 纯粹的 C/C++ 实现,没有外部依赖
- 支持广泛的硬件:
- x86_64 CPU 的 AVX、AVX2 和 AVX512 支持
- 通过 Metal 和 Accelerate 支持 Apple Silicon(CPU 和 GPU)
- NVIDIA GPU(通过 CUDA)、AMD GPU(通过 hipBLAS)、Intel GPU(通过 SYCL)等
- GPU 的 Vulkan 后端
- 多种量化方案以加快推理速度并减少内存占用
- CPU+GPU 混合推理,以加速超过总 VRAM 容量的模型
llama.cpp 提供了模型量化的工具,可以将模型参数从 32 位浮点数转换为 16 位浮点数,甚至是 8、4 位整数。除此之外,llama.cpp 还提供了服务化组件,可以直接对外提供模型的 API。
1. llama.cpp 环境安装
克隆仓库并进入该目录:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
构建 GPU 执行环境,确保安装 CUDA 工具包,适用于有 GPU 的操作系统。
如果 CUDA 设置正确,那么执行 nvidia-smi、nvcc --version 没有错误提示,则表示一切设置正确。
mkdir build
sudo apt-get install make cmake gcc g++
cd build
cmake .. -DGGML_CUDA=ON
cmake --build . --config Release -j4
cd ..
make install
在当前版本(截至 2024 年 11 月 10 日)这些指令分别被重命名为 llama-quantize、llama-cli、llama-server。
ln -s your/path/to/llama.cpp/build/bin/llama-quantize llama-quantize
ln -s your/path/to/llama.cpp/build/bin/llama-server llama-server
ln -s your/path/to/llama.cpp/build/bin/llama-cli llama-cli
2. LLAMA 模型转换
这里我们会从 pth 开始,一步步给出我们怎么将模型应用到 llama.cpp 中的。
2.1 pth 原始模型处理
首先安装高版本 python 3.10。
pip install protobuf==3.20.0
pip install transformers
pip install sentencepiece
pip install peft
2.1.1 下载原版模型
下载原版 LLaMA 模型的权重和 tokenizer.model 文件。可以使用官方渠道或社区提供的资源。
压缩包内文件目录如下(LLaMA-7B 为例):
├── llama-7b
│ ├── consolidated.00.pth
│ ├── params.json
│ └── checklist.chk
└── tokenizer.model
2.1.2 使用 pyllama 下载
另一种下载 Llama 模型的方法是使用 pyllama 库。
pip3 install transformers pyllama -U
python3 -m llama.download --model_size 7B
在 Mac M2 下可能会遇到架构报错,需要手动构建 itree 库:
brew install cmake
pip3 install https://github.com/juncongmoo/itree/archive/refs/tags/v0.0.18.tar.gz
pip3 uninstall pyllama
git clone https://github.com/juncongmoo/pyllama
pip3 install -e pyllama
python3 -m llama.download --model_size 7B
2.2 原版转为 hf 格式文件
2.2.1 hf 格式转换
使用 transformers 提供的脚本 convert_llama_weights_to_hf.py 将原版 LLaMA 模型转换为 HuggingFace 格式。
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
--output_dir目录下会生成 HF 格式的模型文件,诸如 config.json, pytorch_model.bin 等。
2.2.2 合并 LoRA
选择 Chinese-LLaMA-Alpaca 作为 LoRA 合并的操作。我们需要合并 LoRA 权重,生成全量模型权重。
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
参数说明:
--base_model:存放 HF 格式的 LLaMA 模型权重和配置文件的目录。--lora_model:中文 LLaMA/Alpaca LoRA 解压后文件所在目录。--output_type:指定输出格式,可为 pth 或 huggingface。--output_dir:指定保存全量模型权重的目录。
2.3 hf 转 gguf 模型
将模型转化为 gguf 格式并进行量化,在 llama.cpp 路径下:
# hf 版本
python convert_hf_to_gguf.py ../hf_data --outfile /workspace/chinese_gguf/llama-7b.gguf --outtype q8_0
# pth 版本
python3 examples/convert_legacy_llama.py /workspace/lora_pth_data/ --outfile /workspace/chinese_gguf/chinese.gguf
使用 llama-quantize 转换精度:
./llama-quantize /workspace/chinese_gguf/chinese.gguf /workspace/chinese_gguf/chinese_q4_0.gguf Q4_0
转换完成后,模型目录下会多一个 chinese_q4_0.gguf 文件。
3. 使用 llama.cpp 运行 GGUF 模型
可以通过上面的操作,或者去 Hugging Face 找 GGUF 格式的大模型版本,下载模型文件放在 llama.cpp 项目 models 目录下。
git clone https://huggingface.co/rozek/LLaMA-2-7B-32K-Instruct_GGUF ./models/LLaMA-2-7B-32K-Instruct_GGUF
3.1 交互模式
可通过 llama-cli 或 llama-server 运行模型。
llama-cli -m chinese_q4_0.gguf -p "you are a helpful assistant" -cnv -ngl 24
其中:
-m参数后跟要运行的模型-cnv表示以对话模式运行模型-ngl:当编译支持 GPU 时,该选项允许将某些层卸载到 GPU 上进行计算。
3.2 模型 API 服务
llama.cpp 提供了完全与 OpenAI API 兼容的 API 接口,使用经过编译生成的 llama-server 可执行文件启动 API 服务。
./llama-server -m /mnt/workspace/my-llama-13b-q4_0.gguf -ngl 28
默认端口号为 8080,这样就可以启动了一个 API 服务,可以使用 curl 命令进行测试。
curl --request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "What color is the sun?", "n_predict": 512}'
此外可通过 web 页面或者 OpenAI api 等进行访问。安装 openai 依赖:
pip install openai
使用 OpenAI api 访问:
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":"system","content":"You are a helpful assistant."},{"role":"user","content":"tell me something about michael jordan"}]
)
print(completion.choices[0].message.content)
3.3 模型 API 服务 (第三方)
在 llama.cpp 项目中有提到各种语言编写的第三方工具包,可以使用这些工具包提供 API 服务,这里以 Python 为例,使用 llama-cpp-python 提供 API 服务。
pip install llama-cpp-python
pip install sse_starlette starlette_context pydantic_settings
python -m llama_cpp.server --model models/Llama3-q8.gguf
4. 实现类似 ChatGPT 的聊天应用
为了让我们和语言模型之间的交互更加友好,我们可以借助一些开源项目打造一款类似 ChatGPT 的聊天应用。下面列举一些比较有名的 Web UI:
接下来我们就基于 Open WebUI 来实现一个本地聊天应用。Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。
运行如下的 Docker 命令即可安装 Open WebUI:
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/ 即可,首次访问需要注册一个账号。
5. 参考链接
- Qwen 本地运行 llama.cpp
- [Chinese-LLaMA-Alpaca Wiki](https://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/llama.cpp 量化部署)


