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 质量下降明显,一般不建议用
我的习惯:个人项目用 Q4_K_M 就够。生产环境我建议用 Q6_K,推理速度与模型质量之间平衡得最好。

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
我曾经踩过的坑:直接下载整个仓库有时候会下载到几百MB的 FP16 原版模型,白白浪费流量和磁盘。记得留意文件名,带 Q4_K_M 这种后缀的才是量化后的 GGUF 文件。

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 MPT
  • gptj — 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(更大,没意义)。

我个人经验:第一次转的时候别急着量化。先转成 FP16 的 GGUF 文件,用 llama.cpp 跑一下测试,确认模型能正确加载。然后再用 tools/quantize 工具量化到 Q4_K_M 或者 Q6_K。

量化操作如下:

./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 一次完整的端到端流程

下面这张流程图展示了从获取模型到跑起来的全链路:

模型获取与处理完整流程 需要部署的模型 有GGUF? 是 直接下载GGUF文件 否 下载PyTorch原版模型 convert.py 转为GGUF quantize 量化到目标精度
避坑提示:如果你打算自己转换,一定要确认模型的架构是 llama.cpp 支持的。我见过有人拿着 CodeGen 模型来转,结果不支持,白费了一个下午。

最后再啰嗦一句:模型获取是门槛最低的一步。真正出问题的地方往往在后面——配置文件写错、量化和推理参数不匹配、tokenizer 和模型不对应。每一步都要仔细检查。

嗯,这一章就到这儿。你按照上面的流程走,应该不会遇到大问题。如果 HFC 页面被墙了,记得挂代理。