一、大模型部署工具 llama.cpp
二、使用 llama.cpp 量化模型
2.1 克隆llama.cp
项目地址:
https://github.com/ggerganov/llama.cpp
一般配置SSH KEY,然后采用SSH克隆。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make
克隆项目,然后进行一次编译。
➜ llama.cpp git:(master) ✗ make
I ccache not found. Consider installing it for faster compilation.
I llama.cpp build info:
I UNAME_S: Darwin
I UNAME_P: arm
I UNAME_M: arm64
I CFLAGS: -I. -Icommon -D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE -DNDEBUG -DGGML_USE_ACCELERATE -DACCELERATE_NEW_LAPACK -DACCELERATE_LAPACK_ILP64 -DGGML_USE_LLAMAFILE -DGGML_USE_METAL -std=c11 -fPIC -O3 -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int -Werror=implicit-function-declaration -pthread -Wunreachable-code-break -Wunreachable-code-return -Wdouble-promotion
I CXXFLAGS: -std=c++11 -fPIC -O3 -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wmissing-declarations -Wmissing-noreturn -pthread -Wunreachable-code-break -Wunreachable-code-return -Wmissing-prototypes -Wextra-semi -I. -Icommon -D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE -DNDEBUG -DGGML_USE_ACCELERATE -DACCELERATE_NEW_LAPACK -DACCELERATE_LAPACK_ILP64 -DGGML_USE_LLAMAFILE -DGGML_USE_METAL
I NVCCFLAGS: -std=c++11 -O3
I LDFLAGS: -framework Accelerate -framework Foundation -framework Metal -framework MetalKit
I CC: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
I CXX: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
make: Nothing to be done for `default'.
提示缺少 ccache,安装
brew install ccache
安装完成以后,再次make
➜ llama.cpp git:(master) ✗ make
I ccache found, compilation results will be cached. Disable with LLAMA_NO_CCACHE.
I llama.cpp build info:
I UNAME_S: Darwin
I UNAME_P: arm
I UNAME_M: arm64
I CFLAGS: -I. -Icommon -D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE -DNDEBUG -DGGML_USE_ACCELERATE -DACCELERATE_NEW_LAPACK -DACCELERATE_LAPACK_ILP64 -DGGML_USE_LLAMAFILE -DGGML_USE_METAL -std=c11 -fPIC -O3 -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int -Werror=implicit-function-declaration -pthread -Wunreachable-code-break -Wunreachable-code-return -Wdouble-promotion
I CXXFLAGS: -std=c++11 -fPIC -O3 -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wmissing-declarations -Wmissing-noreturn -pthread -Wunreachable-code-break -Wunreachable-code-return -Wmissing-prototypes -Wextra-semi -I. -Icommon -D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE -DNDEBUG -DGGML_USE_ACCELERATE -DACCELERATE_NEW_LAPACK -DACCELERATE_LAPACK_ILP64 -DGGML_USE_LLAMAFILE -DGGML_USE_METAL
I NVCCFLAGS: -std=c++11 -O3
I LDFLAGS: -framework Accelerate -framework Foundation -framework Metal -framework MetalKit
I CC: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
I CXX: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
在目录下会生成一系列可执行文件:
main:使用模型进行推理 quantize:量化模型 server:提供模型 API 服务2.2 准备llama.cp支持的模型
llama.cpp 支持转换的模型格式有 PyTorch 的 .pth 、huggingface 的 .safetensors 、还有之前 llama.cpp 采用的 ggmlv3。
在 huggingface 上找到合适格式的模型,下载至 llama.cpp 的 models 目录下。
cd models
git clone https://huggingface.co/4bit/Llama-2-7b-chat-hf ./models/Llama-2-7b-chat-hf
2.3 转化GGUF格式
2.3.1 安装依赖
llama.cpp 项目下带有 requirements.txt 文件,直接安装依赖即可。
pip install -r requirements.txt
如果本地未安装pip和python 工具,则先进行安装
brew install pip
brew install python
2.3.2 转换模型
python convert.py ./models/Llama-2-7b-chat-hf --vocabtype spm
params = Params(n_vocab=32000, n_embd=4096, n_mult=5504, n_layer=32, n_ctx=2048, n_ff=11008, n_head=32, n_head_kv=32, f_norm_eps=1e-05, f_rope_freq_base=None, f_rope_scale=None, ftype=None, path_model=PosixPath('models/Llama-2-7b-chat-hf'))
Loading vocab file 'models/Llama-2-7b-chat-hf/tokenizer.model', type 'spm'
...
Wrote models/Llama-2-7b-chat-hf/ggml-model-f16.gguf
vocabtype 指定分词算法,默认值是 spm,如果是 bpe,需要显示指定。
2.4 开始量化模型
quantize 提供各种精度的量化。
./quantize
usage: ./quantize [--help] [--allow-requantize] [--leave-output-tensor] model-f32.gguf [model-quant.gguf] type [nthreads]
--allow-requantize: Allows requantizing tensors that have already been quantized. Warning: This can severely reduce quality compared to quantizing from 16bit or 32bit
--leave-output-tensor: Will leave output.weight un(re)quantized. Increases model size but may also increase quality, especially when requantizing
Allowed quantization types:
2 or Q4_0 : 3.56G, +0.2166 ppl @ LLaMA-v1-7B
3 or Q4_1 : 3.90G, +0.1585 ppl @ LLaMA-v1-7B
8 or Q5_0 : 4.33G, +0.0683 ppl @ LLaMA-v1-7B
9 or Q5_1 : 4.70G, +0.0349 ppl @ LLaMA-v1-7B
10 or Q2_K : 2.63G, +0.6717 ppl @ LLaMA-v1-7B
12 or Q3_K : alias for Q3_K_M
11 or Q3_K_S : 2.75G, +0.5551 ppl @ LLaMA-v1-7B
12 or Q3_K_M : 3.07G, +0.2496 ppl @ LLaMA-v1-7B
13 or Q3_K_L : 3.35G, +0.1764 ppl @ LLaMA-v1-7B
15 or Q4_K : alias for Q4_K_M
14 or Q4_K_S : 3.59G, +0.0992 ppl @ LLaMA-v1-7B
15 or Q4_K_M : 3.80G, +0.0532 ppl @ LLaMA-v1-7B
17 or Q5_K : alias for Q5_K_M
16 or Q5_K_S : 4.33G, +0.0400 ppl @ LLaMA-v1-7B
17 or Q5_K_M : 4.45G, +0.0122 ppl @ LLaMA-v1-7B
18 or Q6_K : 5.15G, -0.0008 ppl @ LLaMA-v1-7B
7 or Q8_0 : 6.70G, +0.0004 ppl @ LLaMA-v1-7B
1 or F16 : 13.00G @ 7B
0 or F32 : 26.00G @ 7B
./quantize ./models/Llama-2-7b-chat-hf/ggml-model-f16.gguf ./models/Llama-2-7b-chat-hf/ggml-model-q4_0.gguf Q4_0
llama_model_quantize_internal: model size = 12853.02 MB
llama_model_quantize_internal: quant size = 3647.87 MB
llama_model_quantize_internal: hist: 0.036 0.015 0.025 0.039 0.056 0.076 0.096 0.112 0.118 0.112 0.096 0.077 0.056 0.039 0.025 0.021
三、安卓集成llama.cpp
在项目下,examples中,存在安卓端的Demo。
3.2 手动安装BLIS
克隆代码
git clone https://github.com/flame/blis.git
#或者采用SSH克隆
git clone git@github.com:flame/blis.git
cd blis
./configure --enable-cblas -t openmp,pthreads auto
开始编译
make -j4
发生错误,不支持 -fopenmp flag
clang: clang: clang: clang: fatal error: fatal error: unsupported option '-fopenmp'unsupported option '-fopenmp'
fatal error:
fatal error: unsupported option '-fopenmp'
unsupported option '-fopenmp'
make: *** [obj/firestorm/kernels/armv8a/3/bli_gemm_armv8a_asm_d6x8.o] Error 1
make: *** Waiting for unfinished jobs....
make: *** [obj/firestorm/config/firestorm/bli_cntx_init_firestorm.o] Error 1
make: *** [obj/firestorm/kernels/armv8a/1m/bli_packm_armv8a_int_d6x8.o] Error 1
make: *** [obj/firestorm/kernels/armv8a/1m/bli_packm_armv8a_int_s8x12.o] Error 1
➜ blis git:(master)
总结
### 文章总结 - llama.cpp大模型部署与量化#### 一、大模型部署工具 llama.cpp
llama.cpp是一个高效的C++库,旨在部署大型LLM(大型语言模型),提供模型推理、量化和API服务等功能,特别优化了性能和可移植性。
#### 二、使用llama.cpp量化模型
##### 2.1 克隆llama.cpp项目
- **项目地址**: [https://github.com/ggerganov/llama.cpp](https://github.com/ggerganov/llama.cpp)
- **克隆步骤**:
- 使用SSH或HTTPS克隆项目。
- 执行`make`编译项目。如果遇到缺少`ccache`的提示,需先安装`ccache`,再次执行`make`。
- 编译成功后,目录下会生成主要可执行文件如`main`(用于推理)、`quantize`(用于模型量化)、`server`(提供API服务)。
##### 2.2 准备支持的模型
- **支持的格式**: PyTorch的`.pth`、Hugging Face的`.safetensors`以及ggmlv3格式。
- **下载模型**: 在Hugging Face上找到合适的模型并下载到`models`目录下。
##### 2.3 转化模型为GGUF格式
- **安装依赖**: 运行`pip install -r requirements.txt`。
- **模型转换**: 使用`python convert.py`脚本转换模型为GGUF格式。需指定`vocabtype`参数。
##### 2.4 模型量化
- **量化执行**: 使用`./quantize`命令进行各种精度的模型量化。支持多种量化类型,可通过`--help`查看详细用法。
- **示例命令**: 如`./quantize ./models/Llama-2-7b-chat-hf/ggml-model-f16.gguf ./models/Llama-2-7b-chat-hf/ggml-model-q4_0.gguf Q4_0`。
#### 三、安卓集成llama.cpp
- **Demo位置**: llama.cpp项目中的`examples`目录下包含安卓端的Demo。
##### 3.2 手动安装BLIS
- **克隆BLIS**: 需要的数学库,用于优化模型计算。
- **编译配置**: 使用`./configure`配置,配置时可能会遇到不支持`-fopenmp`标志的编译错误,需调整配置或修改Makefile。
- **编译**: 执行`make -j4`编译BLIS,修正不兼容的编译选项。
#### 总结
llama.cpp是一个强大的工具,通过简单的步骤可以快速部署、量化和集成大模型至多种平台。量化功能提供了多种精度选项,有助于在保持模型精度的同时减少模型大小和提升推理速度。在安卓平台上的集成示例展示了该工具的可扩展性和灵活性。