Appearance
模型加载与 GGUF 格式 — 概念
GGUF 文件格式
GGUF (GGML Universal File) 是二进制格式,结构如下:
┌──────────────────┐
│ Header │ magic + version + tensor_count + metadata_count
├──────────────────┤
│ Metadata KV Pairs │ key-value 元数据(架构、超参数、词表等)
├──────────────────┤
│ Tensor Info Array │ 每个张量的 name、dims、type、offset
├──────────────────┤
│ Alignment Padding │ 对齐填充
├──────────────────┤
│ Tensor Data │ 所有张量的实际数据
└──────────────────┘元数据 (Metadata)
GGUF 存储丰富的模型信息:
general.architecture— 模型架构名(如 "llama", "gpt2")llama.context_length— 最大上下文长度llama.embedding_length— embedding 维度llama.block_count— Transformer 层数llama.attention.head_count— 注意力头数tokenizer.ggml.tokens— 词表tokenizer.ggml.scores— token 分数
张量存储
每个张量记录:
- 名称(如
blk.0.attn_q.weight) - 维度(n_dims)
- 数据类型(F16, Q4_0 等)
- 在文件中的偏移量
模型架构
llama-arch.h 定义了支持的模型架构枚举:
c
enum llm_arch {
LLM_ARCH_LLAMA,
LLM_ARCH_GPT2,
LLM_ARCH_FALCON,
LLM_ARCH_BAICHUAN,
LLM_ARCH_STARCODER,
LLM_ARCH_QWEN2,
// ... 50+ 架构
};每种架构定义了:
- 层结构(attention, FFN 的组成)
- 张量命名规则
- 特殊操作(如 RoPE 变体)
权重映射
模型加载时,将 GGUF 中的张量名映射到模型结构:
GGUF tensor name → 模型位置
blk.0.attn_q.weight → layers[0].attention.wq
blk.0.attn_k.weight → layers[0].attention.wk
blk.0.attn_v.weight → layers[0].attention.wv
blk.0.attn_output.weight → layers[0].attention.wo
blk.0.ffn_gate.weight → layers[0].ffn.w1
blk.0.ffn_up.weight → layers[0].ffn.w3
blk.0.ffn_down.weight → layers[0].ffn.w2内存映射 (mmap)
llama.cpp 使用 mmap 加载大模型:
- 不将整个文件读入内存
- 按需映射权重页到地址空间
- 操作系统自动管理物理内存
- 允许加载超过物理内存的模型
相关概念
- gguf — GGUF 格式详解
- tensor — 张量存储与类型
- quantization — 权重量化