0. 前言
llama.cpp
是一個基于純C/C++
實現的高性能大語言模型推理引擎,專為優化本地及云端部署而設計。其核心目標在于通過底層硬件加速和量化技術,實現在多樣化硬件平臺上的高效推理,同時保持低資源占用與易用性。
最近DeepSeek
太火了,就想用llama.cpp
在本地部署一下試試效果,當然在個人電腦上部署滿血版那是不可能的,選個小點的蒸餾模型玩一玩就好了。
1. 編譯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
目錄下。
2. 模型轉換與量化
本文以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:中等優化級別,平衡推理速度與精度(常用推薦)。
- Q5_K_S:輕量化級別,側重減少內存占用
典型場景下,
Q4_K_M
相比FP16
模型可減少70%
內存占用,推理速度提升2-3
倍,同時保持95%
以上的原始模型精度。實際部署時需根據硬件資源(如GPU
顯存容量)和任務需求(如生成文本長度)選擇量化策略。
執行下面的命令可將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
。
3. 運行模型
模型量化完后,我們就可以運行模型來試試效果了。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
就可以在網頁上與模型進行交互了,非常方便!