文章目录
llama.cpp是一个开源项目,专门为在本地CPU上部署量化模型而设计。它提供了一种简单而高效的方法,将训练好的量化模型转换为可在CPU上运行的低配推理版本。
一、工作原理
llama.cpp的核心是一个优化的量化推理引擎。这个引擎能够高效地在CPU上执行量化模型的推理任务。它通过一系列的优化技术,如使用定点数代替浮点数进行计算、批量处理和缓存优化等,来提高推理速度并降低功耗。
总结来说:
- llama.cpp 使用的是 C 语言写的机器学习张量库 ggml
- llama.cpp 提供了模型量化的工具
1.1 优点
- 高效性能:llama.cpp针对CPU进行了优化,能够在保证精度的同时提供高效的推理性能。
- 低资源占用:由于采用了量化技术,llama.cpp可以显著减少模型所需的存储空间和计算资源。
- 易于集成:llama.cpp提供了简洁的API和接口,方便开发者将其集成到自己的项目中。
- 跨平台支持:llama.cpp可在多种操作系统和CPU架构上运行,具有很好的可移植性。
1.2 支持的模型
从官方文档上可以看到支持的模型,基本上主流的模型都是支持的。
1.2 应用场景
llama.cpp适用于各种需要部署量化模型的应用场景,如智能家居、物联网设备、边缘计算等。在这些场景中,llama.cpp可以帮助开发者在资源受限的环境中实现实时推断和高能效计算。
二、下载编译
- 下载代码
git clone https://github.com/ggerganov/llama.cpp
- 编译
参考官方教程:https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md
首先打开项目目录:
cd llama.cpp-master
- CPU编译
cmake -B build
cmake --build build --config Release
- GPU编译
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
补充说明:如果不支持cmake编译命令的,可以先用
sudo apt install cmake
命令安装cmke包。
这里给出编译中几个常见的概念 CMake、Make、g++之间的区别:
- CMake 是一个跨平台的构建系统生成工具。它的主要作用是通过配置文件(通常是 CMakeLists.txt)生成适合于目标平台的构建脚本或文件;
- Make 是一个构建自动化工具。它通过读取 Makefile 来执行编译和构建过程;
- g++/clang/MinGW 是负责具体编译的编译器。
编译前项目的目录内容如下:
编译后的目录多了 build
文件夹以及一些其他文件,其中 build
文件夹中的内容如下所示:
cd ./build/bin
ls
可以看到 llama-cli
、llama-quantize
、llama-server
等后续需要使用到的命令文件。
三、LLM操作
本文是使用 MiniCPM-2B-sft-bf16 模型来进行试验,llama.cpp有支持的可操作模型列表,支持转换的模型格式有PyTorch的 .bin 、huggingface 的 .safetensors,根据支持列表进行下载操作即可。
MiniCPM-2B-sft-bf16:MiniCPM 3.0 是一个 4B 参数量的语言模型,相比 MiniCPM1.0/2.0,功能更加全面,综合能力大幅提升,多数评测集上的效果比肩甚至超越众多 7B-9B 模型。
- Github地址:https://github.com/OpenBMB/MiniCPM
3.1 格式转换 (convert_hf_to_gguf)
我们通常在HuggingFace上下载的模型文件是.safetensors
格式的,格式转换主要是将下载的模型转换为.gguf
格式。基于llama.cpp,我们可以使用convert-hf-to-gguf.py
转换脚本读取模型配置、分词器、张量名称+数据,并将它们转换为GGUF元数据和张量,以便在CPU上进行快速推理,而不需要GPU。
GGUF格式是GPT-Generated Unified Format,由Georgi Gerganov定义发布的一种大模型文件格式。
它设计用于快速加载和保存模型,支持各种模型,并允许添加新功能同时保持兼容性。
GGUF文件格式专为存储推断模型而设计,特别适用于语言模型如GPT
转换命令:
python3 convert_hf_to_gguf.py python3 convert_hf_to_gguf.py ../model/MiniCPM-2B-sft-bf16
转换过程如下:
可以看到,在执行转换后,会在model目录下生成对应的F16 gguf文件,大小约为5G:
3.2 量化 (llama-quantize)
量化主要是为了减少模型推理对硬件资源的要求,提高推理效率,但是模型的精度也会降低,通过牺牲模型参数的精度,来换取模型的推理速度。
使用 llama-quantize
命令量化模型。
量化模型的命名方法遵循: Q + 量化比特位 + 变种
。量化位数越少,对硬件资源的要求越低,推理速度越快,但是模型的精度也越低。
量化命令:
cd /root/project-llama-cpp/build/bin
./llama-quantize /root/model/MiniCPM-2B-sft-bf16/CPM-2B-sft-F16.gguf /root/model/MiniCPM-2B-sft-bf16/CPM-2B-sft-Q4_K_M.gguf Q4_K_M
注意:这里,我们使用了绝对路径。
通过
python ./llama-quantize -h
命令可以看到量化支持的参数。
量化过程如下:
量化后的模型gguf文件为:CPM-2B-sft-Q4_K_M.gguf,大小为:1.68G
3.3 推理 (llama-cli)
llama-cli 推理命令的使用方式,可以参考官方文档:https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md
(1)推理命令
cd /root/project-llama-cpp/build/bin
./llama-cli -m /root/model/MiniCPM-2B-sft-bf16/CPM-2B-sft-Q4_K_M.gguf -n 128 --prompt "<用户>机器学习是什么<AI>"
通过
./llama-cli -h
命令可以看到推理支持的参数。
推理过程及输出如下:
(2)对话模式 (Conversation Mode)
./llama-cli -m /root/model/MiniCPM-2B-sft-bf16/CPM-2B-sft-Q4_K_M.gguf -cnv
3.4 API服务 (llama-server)
llama.cpp提供了与OpenAI API兼容的API接口,使用make生成的llama-server来启动API服务。
./llama-server -m /root/model/MiniCPM-2B-sft-bf16/CPM-2B-sft-Q4_K_M.gguf --host 0.0.0.0 --port 1234