Skip to content

模型加载与 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 加载大模型:

  • 不将整个文件读入内存
  • 按需映射权重页到地址空间
  • 操作系统自动管理物理内存
  • 允许加载超过物理内存的模型

相关概念