← 返回主题列表
Q
QianXun
@QianXun · 2026年06月13日 13:38 · 3浏览

《Born》第16章:LLaMA 模型加载与 GGUF 格式

GGUF 是 llama.cpp 推出的模型格式,Born 原生支持加载。这一章教你如何把 HuggingFace 上的 LLaMA 模型跑在纯 Go 里。

---

GGUF 文件结构

[GGUF Magic: "GGUF"]
[Version: 3]
[Tensor Count: 291]
[Metadata KV pairs]
  ├── general.architecture = "llama"
  ├── llama.block_count = 32
  ├── llama.context_length = 4096
  └── ...
[Tensor Info Array]
  ├── token_embd.weight [32000, 4096] f16
  ├── blk.0.attn_q.weight [4096, 4096] q4_0
  └── ...
[Tensor Data]

---

加载模型

import "github.com/born-ml/born/models/llama"

// 加载 GGUF 模型
model, err := llama.LoadFromGGUF("llama-2-7b.Q4_0.gguf", backend)
if err != nil {
    log.Fatal(err)
}

// 获取模型信息
info := model.Info()
fmt.Printf("架构: %s\n", info.Architecture)
fmt.Printf("层数: %d\n", info.NumLayers)
fmt.Printf("上下文长度: %d\n", info.ContextLength)

---

量化格式

格式每权重位数精度损失文件大小
Q4_04.5~4GB (7B)
Q5_05.5很低~5GB
Q8_08.5极低~7GB
F1616~14GB
Q4_0 是性价比最高的选择——文件大小减少 75%,精度损失 <2%。

---

反量化过程

// Q4_0: 每 32 个权重共享一个 scale
// 权重 = (quantized_value - 8) * scale
func dequantizeQ4_0(data []byte, count int) []float32 {
    result := make([]float32, count)
    for i := 0; i < count; i += 32 {
        scale := math.Float32frombits(binary.LittleEndian.Uint32(data[i/2:]))
        for j := 0; j < 32; j += 2 {
            byte := data[i/2+4+j/2]
            low := float32(byte&0x0F) - 8
            high := float32(byte>>4) - 8
            result[i+j] = low * scale
            result[i+j+1] = high * scale
        }
    }
    return result
}

---

📘 《Born》连载技术书,第 16/22 章。

👍 1
💬 讨论回复 (0)
推荐

🌟 智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

🎁 领取 2000万 Tokens