Skip to content

模型加载与 GGUF 格式 — 练习

练习 1:用 Python 查看 GGUF 元数据

使用 gguf-py 库读取一个 GGUF 模型文件,列出所有元数据和张量名称。

参考答案
bash
pip install gguf
python -c "
from gguf import GGUFReader
reader = GGUFReader('model.gguf')
# 打印元数据
for key, val in reader.fields.items():
    print(f'{key}: {val}')
# 打印张量
for tensor in reader.tensors:
    print(f'{tensor.name}: type={tensor.tensor_type}, shape={tensor.shape}')
"

练习 2:追踪模型加载流程

llama-model-loader.cpp 中,从 llama_model_load_from_file 开始,梳理完整的加载调用链。

参考答案

调用链:

  1. llama_model_load_from_file(path, params)
  2. llama_model::load(model_loader, params)
  3. llm_load_hparams(loader) — 解析架构和超参数
  4. llm_load_vocab(loader) — 加载词表
  5. llm_load_tensors(loader, progress_cb) — 加载权重
  6. → 对每个张量:检查类型、创建 ggml_tensor、设置 mmap 映射
  7. → 根据架构创建 llm_layer 结构并关联张量

练习 3:添加新架构支持

阅读 docs/development/HOWTO-add-model.md,理解添加新模型架构需要的步骤。

参考答案

添加新架构的步骤(摘自 HOWTO):

  1. llama-arch.hllm_arch 枚举中添加新架构
  2. llama-arch.cpp 中注册架构的层定义和张量映射
  3. llm_load_hparams 中添加超参数解析
  4. llama-model.cpp 中实现 llm_build_* 函数(forward pass)
  5. llama-model.cpp 的 switch 中添加架构分发
  6. 编写转换脚本将 HuggingFace 权重转为 GGUF
  7. 添加测试用例

拓展挑战

  • 使用 gguf-py 手动构建一个最小的 GGUF 文件
  • 对比同一模型在 F16 和 Q4_0 下的 GGUF 文件大小
  • 阅读 convert_hf_to_gguf.py 理解权重转换过程