跳过正文
Background Image

llama.cpp 量化部署

··849 字·2 分钟
lizqwerscott
作者
lizqwerscott

安装 llama.cpp
#

详细的可以看 官方编译文档

下载 llamap.cpp 代码
#

git clone https://github.com/ggerganov/llama.cpp

编译
#

CPU
#

cmake -B build
cmake --build build --config Release -j 16

CUDA
#

需要 CUDA toolkit

cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j 16

可以设置环境变量 GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 来使用统一内存架构在 CPUGPU 之后共享内存,但是会损害非集成 GPU 的性能 (但可以支持集成 GPU 的性能)。

生成量化版本模型
#

详细可以查看 官方量化文档

首先安装转化脚本依赖
#

普通安装
#

# install Python dependencies
python3 -m pip install -r requirements.txt

使用 uv
#

最好使用 --index-strategy unsafe-best-match 使用这个可以防止 numpy 没有对应版本的包导致的报错。 这个参数不管先后顺序,把所有 index 都混起来找最合适的版本。

uv venv --python 3.11
uv pip install -r ./requirements.txt --index-strategy unsafe-best-match

然后激活 .venv 虚拟环境

huggingface 下载的模型
#

首先下载模型
#

可以从 huggingface 下载模型 了解,或者如果在 ModelScope 上面有镜像的话,可以使用 ModelScope 提供的工具下载。

获取下载目录
#

一般下载好的就在 ~/.cache/huggingface/hub 目录中. 例如, 从 firefly-llama2-13b-chat 下载的就在:

~/.cache/huggingface/hub/models–YeungNLP–firefly-llama2-13b-chat/snapshots/7e72d87fb49a727d9078b4d721e3319f4642f8bc

转换
#

直接执行这个脚本, 生成的 gguf 模型就在你下载的模型文件夹中,默认转化的为 ggml FP16 格式

python convert_hf_to_gguf.py /path/model/path

量化
#

这样就量化成 4-bits(使用 Q4_K_M 方法)

./llama-quantize ./path/model-f16.gguf ./path/model-Q4_K_M.gguf Q4_K_M

可以使用 GGUF-my-repo 来在线量化
#

加载并启动模型
#

直接运行
#

详细查看 官方文档

CPU 直接运行
#

./llama-cli -m ./models/model.gguf -cnv -p "You are a helpful assistant"

CPU 与 GPU 运行
#

如已通过 Metal 编译或者使用了 cuBLAS 编译,则只需加上 -ngl 1 即可启用GPU推理.

./llama-cli -m ./models/model.gguf -cnv -ngl 1 -p "You are a helpful assistant"

启动服务器
#

详细查看 官方文档 和直接运行一样, 可以 CPU 与 GPU 一起运行

./llama-server -m ./models/model.gguf -cnv -ngl 1

关于量化方法选择及推理速度
#

量化参数介绍: 量化统计表格

结论 1
#

结论来源: alpaca llama.cpp 量化部署

  • 默认的量化方法为 q4_0,虽然速度最快但损失也是最大的,其余方法各有利弊,按实际情况选择
  • 需要注意的是F16以及 q8_0 并不会因为增加线程数而提高太多速度
  • 线程数 -t 与物理核心数一致时速度最快,超过之后速度反而变慢(M1 Max上从8改到10之后耗时变为3倍)
  • 如果使用了Metal版本(即启用了苹果GPU解码),速度还会有进一步显著提升,表中标注为 -ngl 1
  • 综合推荐(仅供参考):7B推荐 Q5_1 或 Q5_K_S,13B 推荐 Q5_0 或 Q5_K_S
  • 机器资源够用且对速度要求不是那么苛刻的情况下可以使用 q8_0 或 Q6_K,接近 F16 模型的效果

注释
#


  1. 这个结论可能有点老了 ↩︎