4. 模型获取:从 HuggingFace 下载 GGUF 格式模型与转换工具
模型从哪里来?这是搭建 llama.cpp 服务的第一步。
很多人一上来就想着训练,其实没必要。跑推理直接用现成的开源模型就好。HuggingFace 是全球最大的模型仓库,绝大多数主流模型都在上面。
但有个问题:HuggingFace 上大部分是 PyTorch 格式的原生模型,llama.cpp 读不了。它只认 GGUF 格式。所以我们有两个选择:要么直接下载别人转好的 GGUF 文件,要么自己动手转。
4.1 GGUF 格式到底是什么?
GGUF 是 llama.cpp 团队设计的模型文件格式。G 代表 GPT,GUF 是 2023 年推出的新一代格式,取代了老旧的 GGML。
说白了,GGUF 就是把模型的权重和参数打包成一个单一文件。它自带版本号和张量类型信息,加载的时候不需要额外配置文件。
我最早用 llama 的时候,老是被不同版本的库搞晕。GGUF 的出现彻底解决了这个问题。你拿一个 GGUF 文件,放到任何支持 GGUF 的推理引擎里都能跑,兼容性特别好。
4.2 量化是什么?为什么需要它?
原生模型通常用 FP16 或者 FP32 精度存储。一个 7B 参数的模型,FP16 就需要大约 14GB 显存。大部分人没这个条件。
量化就是为了解决这个问题。它把权重从 16 位浮点数压缩成 4 位、5 位或 8 位整数。压缩后模型文件变小,推理速度变快,显存需求也大幅降低。代价是精度轻微损失。
常见的量化方法大致有这些:
| 量化类型 | bits | 典型文件体积(7B 模型) | 说明 |
|---|---|---|---|
| Q6_K | 6.26 | ~5.3 GB | 几乎无损,我自己的经验是这档性价比最高 |
| Q4_K_M | 4.51 | ~3.6 GB | 大多数场景的主力选择 |
| Q3_K_M | 3.35 | ~2.7 GB | 显存不够时的折衷方案 |
| Q2_K | 2.51 | ~2.1 GB | 质量下降明显,一般不建议用 |
4.3 直接从 HuggingFace 下载 GGUF 模型
这是最简单的方法。HuggingFace 上已经有很多社区贡献者提前量化并上传了 GGUF 文件。
比如 TheBloke 这个用户,他几乎量化了所有主流模型。你搜模型名加上 "-GGUF" 就能找到。
4.3.1 使用 huggingface-cli 下载
先安装工具:
pip install huggingface-hub
然后下载整个仓库或单个文件。我个人习惯直接把整个仓库拉下来,万一以后要换量化版本也方便:
# 下载仓库下所有文件(含多个量化版本)
huggingface-cli download TheBloke/Llama-2-7B-Chat-GGUF \
--local-dir ./models/llama-2-7b-chat-gguf \
--local-dir-use-symlinks False
如果你只想下载某一个文件,比如 Q4_K_M 版本:
huggingface-cli download TheBloke/Llama-2-7B-Chat-GGUF \
llama-2-7b-chat.Q4_K_M.gguf \
--local-dir ./models
4.3.2 使用 wget 直接下载
如果你不想装额外的库,直接用 wget 也行。先去 HuggingFace 的模型页面找到文件的直链:
wget https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf \
-O ./models/llama-2-7b-chat.Q4_K_M.gguf
注意:HuggingFace 对 wget 有访问限制,大文件建议用 huggingface-cli 带断点续传。
4.4 使用 llama.cpp 自带的下载工具
llama.cpp 项目里有一个 scripts/hf.sh 脚本,专门用来从 HuggingFace 下载模型。但我得说老实话,这个脚本我用得不多。它本质就是封装了 huggingface-cli,多了一层 shell 调用,反而容易出 bug。
除非你不想装 Python 环境,否则直接用 huggingface-cli 更靠谱。
4.5 手动转换:把 PyTorch 模型转成 GGUF
有时候你想要的模型没有现成的 GGUF 文件,这时候就得自己动手转了。这个过程分成三步。
4.5.1 下载原版模型
先从 HuggingFace 拉 PyTorch 格式的模型文件:
git lfs install
git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf
注意 Meta 的模型需要申请访问权限。自己在 HuggingFace 官网同意协议就行。下载前记得配置 git 代理,不然动不动就断。
4.5.2 确定模型架构
不是所有模型都能直接转换。llama.cpp 支持 LLaMA、Mistral、Falcon、MPT、GPT-J、BLOOM、StableLM 等常见架构。你的模型必须其中之一才行。
怎么查?看模型的 config.json 文件里的 model_type 字段:
llama— Meta LLaMA 系列mistral— Mistral 系列falcon— Falcon 系列mpt— Mosaic MPTgptj— GPT-J / GPT-NeoX
4.5.3 执行转换脚本
llama.cpp 项目根目录下有一个 convert.py 脚本(或者 convert-hf-to-gguf.py),用法很简单:
# 克隆 llama.cpp 项目
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# 安装依赖
pip install -r requirements.txt
# 执行转换
python convert.py /path/to/your/model \
--outfile /path/to/output.gguf \
--outtype f16
--outtype 参数可以指定输出精度。f16 就是 FP16,体积最小;也可以是 f32(更大,没意义)。
量化操作如下:
./quantize /path/to/model-f16.gguf /path/to/model-q4_k_m.gguf Q4_K_M
这个量化工具就在 llama.cpp 的构建目录下,编译一次就有了。
4.6 文件管理与后续使用
模型文件都比较大,我建议固定一个目录存放:
models/
├── llama-2-7b-chat.Q4_K_M.gguf
├── mistral-7b-instruct.Q6_K.gguf
└── phi-2.Q4_K_M.gguf
在 llama.cpp 的服务器启动命令里直接指定文件路径就行。
4.7 一次完整的端到端流程
下面这张流程图展示了从获取模型到跑起来的全链路:
最后再啰嗦一句:模型获取是门槛最低的一步。真正出问题的地方往往在后面——配置文件写错、量化和推理参数不匹配、tokenizer 和模型不对应。每一步都要仔细检查。
嗯,这一章就到这儿。你按照上面的流程走,应该不会遇到大问题。如果 HFC 页面被墙了,记得挂代理。