跳过正文

llama.cpp 量化部署

··1461 字·3 分钟
lizqwerscott
作者
lizqwerscott
目录

克隆和编译llama.cpp
#

下载 llamap.cpp 代码
#

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

(可选)如需使用qX_k 量化方法(相比常规量化方法效果更好)
#

请手动打开llama.cpp文件,修改下列行(约2500行左右)

原始代码
#

if (nx % QK_K != 0 || ny % QK_K != 0) {

新代码
#

if (nx % QK_K != 0) {

对llama.cpp项目进行编译,生成./main和./quantize二进制文件。
#

make

Windows/Linux用户
#

推荐与BLAS(或cuBLAS如果有GPU)一起编译,可以提高prompt处理速度,参考: llama.cpp#blas-build

  • BLAS 编译命令

    make LLAMA_OPENBLAS=1
    
  • cuBLAS(有GPU) 编译命令

    make LLAMA_CUBLAS=1
    

macOS用户
#

无需额外操作,llama.cpp已对ARM NEON做优化,并且已自动启用BLAS。

M系列芯片
#

推荐使用Metal启用GPU推理,显著提升速度。参考, llama.cpp#metal-build 只需将编译命令改为:

LLAMA_METAL=1 make

生成量化版本模型
#

本地的 pth 格式模型
#

处理目录结构
#

将合并模型(.pth格式模型)中最后一步生成的 tokenizer.model 文件放入 zh-models 目录下,模型文件 consolidated.*.pth 和配置文件 params.json 放入 zh-models/7B 目录下。请注意 LLaMA 和 Alpaca 的 tokenizer.model 不可混用(原因见训练细节)。例如,如果是.pth格式的模型,目录结构类似:

llama.cpp/zh-models/

  • 7B/
    • consolidated.00.pth
    • params.json
  • tokenizer.model

将上述.pth模型权重转换为 gguf 的FP16格式
#

生成文件路径为 zh-models/7B/ggml-model-f16.bin

python convert.py zh-models/7B/

进一步对FP16模型进行4-bit量化
#

生成量化模型文件路径为 zh-models/7B/ggml-model-q4_0.guff。不同量化方法的性能对比见本文最后。

./quantize ./zh-models/7B/ggml-model-f16.bin ./zh-models/7B/ggml-model-q4_0.bin q4_0

huggingface 下载的模型
#

首先下载模型
#

可以从 huggingface 下载模型 了解.

获取下载目录
#

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

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

转换
#

直接执行这个脚本, 生成的 guff 模型就在你下载的模型文件夹中

python convert.py /path/model/path

量化
#

./quantize ./path/model-f16.pth ./path/model-q4_0.gguf q4_0

加载并启动模型
#

直接运行
#

CPU 直接运行
#

./main -m ./models/chinese-13b/firefly-llama2-13b-chat-q4_0.guff -c 512 -b 8 -n 256 --keep 48 \
  --repeat_penalty 1.0 --color -i -t 16 \
  -r "User:" -f prompts/chat-with-bob.txt

CPU 与 GPU 运行
#

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

./main -m ./models/chinese-13b/firefly-llama2-13b-chat-q4_0.guff -ngl 1 -c 512 -b 8 -n 256 --keep 48 \
  --repeat_penalty 1.0 --color -i -t 16 \
  -r "User:" -f prompts/chat-with-bob.txt

常用命令
#

在提示符 > 之后输入你的 prompt,cmd/ctrl+c 中断输出,多行信息以 \ 作为行尾。 如需查看帮助和参数说明,请执行 ./main -h 命令。

常用运行参数
#

-c 控制上下文的长度,值越大越能参考更长的对话历史(默认:512) -ins / -i 启动类 ChatGPT 对话交流的 instruction 运行模式 -f 指定 prompt 模板,alpaca 模型请加载 prompts/alpaca.txt, 所有模板都在 prompts/ 目录下面 -n 控制回复生成的最大长度(默认:128) -b 控制 batch size(默认:8),可适当增加 -t 控制线程数量(默认:4),可适当增加 –repeat_penalty 控制生成回复中对重复文本的惩罚力度 –temp 温度系数,值越低回复的随机性越小,反之越大 –top_p, top_k 控制解码采样的相关参数

更详细的官方说明请参考:https://github.com/ggerganov/llama.cpp/tree/master/examples/main

启动服务器
#

和直接运行一样, 可以 CPU 与 GPU 一起运行

./server -m ./models/chinese-13b/firefly-llama2-13b-chat-q5_k_s.guff -ngl 25 -c 512 -b 8 -n 256 -t 8

更多介绍:

./server -h

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

量化参数介绍: llamap.cpp 量化统计表

结论
#

结论来源: 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 模型的效果