🗜️ 第2课:GGUF 量化格式与 9 种 HLS 算子
GGUF 是怎么把 1.6GB 的模型压缩到 392MB 的?Q4_K/Q5_K/Q6_K 是什么?9 种 HLS 算子各负责什么?
🎯 本课目标
理解 GGUF 量化格式(Q4_K/Q5_K/Q6_K/Q8_0)、9 种 HLS 算子的分工、为什么有些算子 Cosim 通过了有些没有。
一、GGUF 量化家族
GGUF 中的主要量化类型
flowchart TB
subgraph FP["原始浮点"]
F32["F32: 32位浮点
1.6 GB (Qwen2.5-0.5B)"] end subgraph Q8["Q8_0 量化"] Q80["8位整数+1个32位scale
用于 token embedding
精度损失极小"] end subgraph KQ["K-Quants 量化(GGUF独创的超级块方法)"] Q4K["Q4_K: 4位
256值超级块
压缩最大"] Q5K["Q5_K: 5位
精度和大小折中
用于 attn_q/k/v"] Q6K["Q6_K: 6位
精度最高
用于 Qwen2.5 主体"] end FP -->|"压缩"| Q8 FP -->|"压缩"| KQ Q6K -->|"Qwen2.5用这个"| RESULT["392 MB
压缩约4倍"] style FP fill:#e66767,color:#fff style KQ fill:#3987e5,color:#fff style RESULT fill:#0ca30c,color:#fff
1.6 GB (Qwen2.5-0.5B)"] end subgraph Q8["Q8_0 量化"] Q80["8位整数+1个32位scale
用于 token embedding
精度损失极小"] end subgraph KQ["K-Quants 量化(GGUF独创的超级块方法)"] Q4K["Q4_K: 4位
256值超级块
压缩最大"] Q5K["Q5_K: 5位
精度和大小折中
用于 attn_q/k/v"] Q6K["Q6_K: 6位
精度最高
用于 Qwen2.5 主体"] end FP -->|"压缩"| Q8 FP -->|"压缩"| KQ Q6K -->|"Qwen2.5用这个"| RESULT["392 MB
压缩约4倍"] style FP fill:#e66767,color:#fff style KQ fill:#3987e5,color:#fff style RESULT fill:#0ca30c,color:#fff
为什么叫 K-Quant? "K"代表超级块(super-block)——把 256 个连续的权重值作为一个组,共享一个 scale 因子。相比"每个值独立量化",超级块可以利用块内的统计分布达到更高精度。GGUF 是 llama.cpp 生态的标准格式,Ollama 就是用它来分发模型的。
二、GGUF 张量导出:实际数字
| 模型 | 张量数 | 其中量化张量 | K-Quant张量 | 总Payload |
|---|---|---|---|---|
| SmolLM2-135M | 272 | 211 | 30 (Q4/Q5_K) | 100 MB |
| Qwen2.5-0.5B | 290 | 169 | 24 (Q6_K) | 392 MB |
三、9 种 HLS 算子进度表
HLS 算子 CSim / CSynth / Cosim 状态
flowchart TB
subgraph PASSED["✅ 全部通过"]
E1["token_embd_lookup
(F32/Q8_0)"] E2["RMSNorm+top1
(Q8_0)"] E3["Q5 proj (attn_q/k/v)
Q5_K proj (ffn_down)"] end subgraph PARTIAL["⚠️ 部分通过"] P1["Q4_K layer2 cosim ✅
351K cycles"] P2["Attention Chain
CSim✅ CSynth✅
Cosim: selected chain✅
all-tile: host✅ RTL❌"] end subgraph FAILED["❌ 未通过"] F1["Output Proj+Residual
CSim⚠️ CSynth✅ Cosim❌
AXI boundary + xsim OOM"] end style PASSED fill:#0ca30c,color:#fff style PARTIAL fill:#c98500,color:#000 style FAILED fill:#d03b3b,color:#fff
(F32/Q8_0)"] E2["RMSNorm+top1
(Q8_0)"] E3["Q5 proj (attn_q/k/v)
Q5_K proj (ffn_down)"] end subgraph PARTIAL["⚠️ 部分通过"] P1["Q4_K layer2 cosim ✅
351K cycles"] P2["Attention Chain
CSim✅ CSynth✅
Cosim: selected chain✅
all-tile: host✅ RTL❌"] end subgraph FAILED["❌ 未通过"] F1["Output Proj+Residual
CSim⚠️ CSynth✅ Cosim❌
AXI boundary + xsim OOM"] end style PASSED fill:#0ca30c,color:#fff style PARTIAL fill:#c98500,color:#000 style FAILED fill:#d03b3b,color:#fff
四、Output Proj 为什么失败了?
这是当前最大的技术阻塞。Output Projection + Residual 的 C/RTL Cosim 失败,原因有两层:
- AXI boundary overflow:HLS 推断的 AXI 读取请求超出了 BRAM 的地址范围——576 行 × 396 字节/行 = 228,096 字节,但 HLS 在末尾多读了 32 字节(addr=228,080),越界了
- xsim OOM:Xilinx 仿真器在尝试全规模 Cosim 时内存耗尽(消耗了约 1.6GB)
解决方案:8 行 padded slice 的 CSim/CSynth 已通过(DSP=6, FF=3,003, LUT=6,439),但 Cosim 仍需解决 AXI 地址对齐和路径长度问题。