克隆和编译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 模型的效果