Appearance
模型加载与 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 开始,梳理完整的加载调用链。
参考答案
调用链:
llama_model_load_from_file(path, params)- →
llama_model::load(model_loader, params) - →
llm_load_hparams(loader)— 解析架构和超参数 - →
llm_load_vocab(loader)— 加载词表 - →
llm_load_tensors(loader, progress_cb)— 加载权重 - → 对每个张量:检查类型、创建 ggml_tensor、设置 mmap 映射
- → 根据架构创建
llm_layer结构并关联张量
练习 3:添加新架构支持
阅读 docs/development/HOWTO-add-model.md,理解添加新模型架构需要的步骤。
参考答案
添加新架构的步骤(摘自 HOWTO):
- 在
llama-arch.h的llm_arch枚举中添加新架构 - 在
llama-arch.cpp中注册架构的层定义和张量映射 - 在
llm_load_hparams中添加超参数解析 - 在
llama-model.cpp中实现llm_build_*函数(forward pass) - 在
llama-model.cpp的 switch 中添加架构分发 - 编写转换脚本将 HuggingFace 权重转为 GGUF
- 添加测试用例
拓展挑战
- 使用
gguf-py手动构建一个最小的 GGUF 文件 - 对比同一模型在 F16 和 Q4_0 下的 GGUF 文件大小
- 阅读
convert_hf_to_gguf.py理解权重转换过程