《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_0 | 4.5 | 低 | ~4GB (7B) |
| Q5_0 | 5.5 | 很低 | ~5GB |
| Q8_0 | 8.5 | 极低 | ~7GB |
| F16 | 16 | 无 | ~14GB |
---
反量化过程
// 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 章。
💬 讨论回复 (0)
推荐
🌟 智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
🎁 领取 2000万 Tokens