- 前言
llama.cpp
是一个基于纯
C/C++
实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。
最近
DeepSeek
太火了,就想用
llama.cpp
在本地部署一下试试效果,当然在个人电脑上部署满血版那是不可能的,选个小点的蒸馏模型玩一玩就好了。
- 编译llama.cpp
首先从
Github
上下载
llama.cpp
的源码:
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
llama.cpp
支持多种硬件平台,可根据实际的硬件配置情况选择合适的编译参数进行编译,具体可以参考文档
docs/build.md
。
「编译CPU版本」
cmake -B build
cmake --build build --config Release -j 8
「编译GPU版本」
编译英伟达
GPU
版本需要先装好驱动和
CUDA
,然后执行下面的命令进行编译
cmake -B build -DGGML\_CUDA=ON -DGGML\_CUDA\_ENABLE\_UNIFIED\_MEMORY=1
cmake --build build --config Release -j 8
❝
编译完成后,可执行文件和库文件被存放在
build/bin
目录下。❞
- 模型转换与量化
本文以
DeepSeek R1
的蒸馏模型
DeepSeek-R1-Distill-Qwen-7B
为例进行介绍。
2.1 模型下载与转换
首先从魔搭社区下载模型:
pip install modelscope
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local\_dir DeepSeek-R1-Distill-Qwen-7B
下载好的模型是以
HuggingFace
的
safetensors
格式存放的,而
llama.cpp
使用的是
GGUF
格式,因此需要先要把模型转换为
GGUF
格式:
#
安装python依赖库
pip install -r requirements.txt
#
转换模型
python convert\_hf\_to\_gguf.py DeepSeek-R1-Distill-Qwen-7B/
转换成功后,在该目录下会生成一个
FP16
精度、
GGUF
格式的模型文件
DeepSeek-R1-Distill-Qwen-7B-F16.gguf
。
2.2 模型量化
FP16
精度的模型跑起来可能会有点慢,我们可以对模型进行量化以提升推理速度。
llama.cpp
主要采用了分块量化(
Block-wise Quantization
)和
K-Quantization
算法来实现模型压缩与加速,其核心策略包括以下关键技术:
-
「分块量化(Block-wise Quantization)」
该方法将权重矩阵划分为固定大小的子块(如
32
或
64
元素为一组),每个子块独立进行量化。通过为每个子块分配独立的缩放因子(
Scale
)和零点(
Zero Point
),有效减少量化误差。例如,
Q4\_K\_M
表示每个权重用
4
比特存储,且子块内采用动态范围调整。
-
「K-Quantization(混合精度量化)」
在子块内部进一步划分更小的单元(称为“超块”),根据数值分布动态选择量化参数。例如,
Q4\_K\_M
将超块拆分为多个子单元,每个子单元使用不同位数的缩放因子(如
6bit
的缩放因子和
4bit
的量化值),通过混合精度平衡精度与压缩率。
-
「重要性矩阵(Imatrix)优化」
通过分析模型推理过程中各层激活值的重要性,动态调整量化策略。高重要性区域保留更高精度(如
FP16
),低重要性区域采用激进量化(如
Q2\_K
),从而在整体模型性能损失可控的前提下实现高效压缩。
-
「量化类型分级策略」
提供
Q2\_K
至
Q8\_K
等多种量化级别,其中字母后缀(如
\_M
、
\_S
)表示优化级别:
典型场景下,
Q4\_K\_M
相比
FP16
模型可减少
70%
内存占用,推理速度提升
2-3
倍,同时保持
95%
以上的原始模型精度。实际部署时需根据硬件资源(如
GPU
显存容量)和任务需求(如生成文本长度)选择量化策略。
- 「Q4_K_M」 :中等优化级别,平衡推理速度与精度(常用推荐)。
- 「Q5_K_S」 :轻量化级别,侧重减少内存占用
执行下面的命令可将
FP16
精度的模型采用
Q4\_K\_M
的量化策略进行量化:
./build/bin/llama-quantize DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-F16.gguf DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4\_K\_M.gguf Q4\_K\_M
量化完成后,模型文件由
15.2G
减少到
4.7G
。
- 运行模型
模型量化完后,我们就可以运行模型来试试效果了。
llama.cpp
提供了多种运行模型的方式:
命令行方式
执行下面的命令就可以在命令行与模型进行对话了:
./build/bin/llama-cli -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4\_K\_M.gguf -cnv
HTTP Server方式
由于模型是以
Markdown
格式输出内容,因此用命令行的方式看着不太方便。
llama.cpp
还提供
HTTP Server
的方式运行,交互性要好很多。
首先在终端执行命令
./build/bin/llama-server -m DeepSeek-R1-Distill-Qwen-7B/DeepSeek-R1-Distill-Qwen-7B-Q4\_K\_M.gguf --port 8088
然后打开浏览器,输入地址
http://127.0.0.1:8088
就可以在网页上与模型进行交互了,非常方便!