【大模型】基于llama.cpp实现大模型格式转换、量化、推理

发布于:2025-03-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

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可以帮助开发者在资源受限的环境中实现实时推断和高能效计算。

二、下载编译

  1. 下载代码
git clone https://github.com/ggerganov/llama.cpp
  1. 编译

参考官方教程: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-clillama-quantizellama-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 模型。

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

在这里插入图片描述

参考资料


网站公告

今日签到

点亮在社区的每一天
去签到