本报告把前面讨论的表格扩展成工程化视角:同一个 Qwen2.5-0.5B-Instruct,在官方 AWQ、GPTQ-Int4、GPTQ-Int8、GGUF q4/q8/K-quant 等版本下,实际部署到 FPGA 时会在外部存储、AXI 数据流、解包逻辑、scale/zero 处理、MAC 阵列、BRAM 缓冲和验证流程上产生明显差异。
最重要的判断:官方量化模型可以作为输入源和软件基线,但通常不能作为 FPGA 内部的最终格式。FPGA 版应在 PC 端写 converter,把 Hugging Face 的 safetensors 或 GGUF 解析后,重新整理成你的 AXI burst、PE 阵列、BRAM tile、group-size 对齐的 硬件原生 binary。
GPTQ-Int4。官方是 4-bit GPTQ,文件较小,group size 为 128,且 GPTQ-Int8 配置明确是 symmetric / desc_act=false;同类 GPTQ-Int4 页面也标记为 4-bit GPTQ。对 FPGA 来说,symmetric 形式通常比 AWQ 的 asymmetric zero-point 更好做整数 MAC。
AWQ。官方 AWQ 配置为 bits=4、group_size=128、zero_point=true、version=gemm。它的数学形式更接近 w = scale × (q - zero),精度通常更稳,但硬件要多做 zero 修正。
GGUF。非常适合 PC / CPU / llama.cpp 验证,但 GGUF 的 block layout 是 CPU kernel 友好,不是 FPGA AXI stream 友好。特别是 K-quants 的 superblock、scale/min、high-bit 字段会让 PL 控制逻辑复杂。
不要照搬论文中的 FP32 MAC 到小 FPGA。论文里把 INT4 权重反量化后做 FP32 MAC,工程原型容易,但面积、功耗、DSP/LUT 都不友好。更推荐 FPGA 版做 W4A8 或 W4A16,用 INT4 × INT8/INT16 → INT32 partial sum,最后再按 group 乘 scale。
Qwen2.5-0.5B-Instruct 的网络结构在各量化版本中基本一致:官方模型页列出参数量 0.49B、非 embedding 参数 0.36B、24 层、GQA 为 14 个 Q heads / 2 个 KV heads、上下文长度 32,768,并采用 RoPE、SwiGLU、RMSNorm、Attention QKV bias、tied word embeddings 等结构。AWQ config 进一步列出 hidden_size=896、intermediate_size=4864、vocab_size=151936、num_hidden_layers=24、tie_word_embeddings=true。
| 官方模型 | 外部格式 | 官方配置 / 文件信息 | FPGA 部署含义 |
|---|---|---|---|
Qwen2.5-0.5B-Instruct-AWQ |
Hugging Face safetensors + AWQ config | 4-bit AWQ;group_size=128;zero_point=true;version=gemm;repo 约 742 MB,model.safetensors 约 731 MB。 |
适合做论文路线或 activation-aware W4 权重压缩;但要处理 zero-point、scale、qweight 打包和矩阵重排。 |
Qwen2.5-0.5B-Instruct-GPTQ-Int4 |
Hugging Face safetensors + GPTQ config | 4-bit GPTQ;repo 约 471 MB,model.safetensors 约 459 MB;模型页标记 tensor type 包含 I32/F16。 |
硬件上相对规整,适合作为第一版 W4 硬件闭环输入源;仍需 converter。 |
Qwen2.5-0.5B-Instruct-GPTQ-Int8 |
Hugging Face safetensors + GPTQ config | 8-bit GPTQ;group_size=128;desc_act=false;sym=true;quant_method=gptq;model.safetensors 约 640 MB。 |
最容易验证数值正确性,解包简单;但 DDR 带宽几乎是 W4 的 2 倍,不适合作为小板最终性能目标。 |
Qwen2.5-0.5B-Instruct-GGUF |
GGUF container;llama.cpp / ggml 生态 | 官方提供 fp16、q2_k、q3_k_m、q4_0、q4_k_m、q5_0、q5_k_m、q6_k、q8_0 等文件。官方页面列出 q2_k 415 MB、q4_0 429 MB、q4_k_m 491 MB、q8_0 676 MB 等。 | 适合 CPU 软件基线;直接搬到 FPGA 会遇到 block 对齐、K-quant superblock、scale/min 分散、地址生成复杂等问题。 |
| 维度 | AWQ 4-bit | GPTQ Int4 | GPTQ Int8 | GGUF Q4_0 / Q4_K_M | GGUF Q8_0 |
|---|---|---|---|---|---|
| DDR 权重带宽 | 主权重 4 bit,但每 group 还要读 scale 和 zero。 |
主权重 4 bit;symmetric 形式通常少 zero 修正。 |
主权重 8 bit,理论权重带宽约为 W4 的 2 倍。 |
Q4 权重低带宽,但 block metadata 和 K-quant 结构增加非连续访问。 |
权重 8 bit,加上每 block scale。 |
| 外部文件大小 | 官方 safetensors 约 731 MB;repo 约 742 MB。 | 官方 safetensors 约 459 MB;repo 约 471 MB。 | 官方 safetensors 约 640 MB。 | q4_0 约 429 MB;q4_k_m 约 491 MB。 | q8_0 约 676 MB。 |
| PL 解包逻辑 | nibble unpack + qzero unpack + scale 对齐。 |
nibble unpack + signed/implicit-center 解释。 |
byte unpack,控制简单。 |
q4_0 还可以;q4_k_m 复杂。 |
block scale + int8 数据。 |
| DSP / LUT 代价 | 若逐元素 FP32 dequant+MAC,代价很高;若 group-wise INT MAC,代价可控。 | 最适合做 INT4×INT8/INT16 累加,DSP 和 LUT 都相对可控。 | INT8 乘法位宽更高,但控制更简单;DDR 会更耗功。 | K-quant 的控制逻辑、scale/min 解码会消耗更多 LUT 和状态机资源。 | 乘法位宽高于 W4,但实现最直观。 |
| BRAM / URAM 缓冲 | 需要 qweight tile、zero tile、scale tile、activation tile。 | 需要 qweight tile、scale tile、activation tile。 | 权重无需 nibble buffer,但读入量更大。 | 需要 block metadata buffer;K-quant 最好先转成结构化 SoA。 | 需要 activation 和 int8 block buffer。 |
| PYNQ-Z2 适配性 | 文件大,zero 逻辑重;必须自定义 pack,不能照搬 FP32 MAC。 |
W4 带宽低,公式较规整,适合第一版硬件闭环。 |
512 MB DDR 板上不适合作最终版。 |
作为 PC 软件基线更合适。 |
格式简单,但带宽/容量压力大。 |
| KV260 适配性 | 最接近公开论文的 AWQ 流式思路。 |
更适合自定义整数 PE 阵列。 |
不建议直接实现 K-quant kernel。 |
| 维度 | AWQ 4-bit | GPTQ Int4 | GPTQ Int8 | GGUF Q4_0 | GGUF K-quants |
|---|---|---|---|---|---|
| group / block 大小 | group_size=128。Qwen 的 896 和 4864 都能被 128 整除,矩阵内分组规整。 |
通常也是 group_size=128;与 Qwen hidden/intermediate 维度对齐良好。 |
group_size=128;byte 级更好对齐。 |
llama.cpp 中 q4_0 为 32 个权重一 block:FP16 scale + 16 bytes quants。 | 通常 256 个元素一 superblock;q2/q4/q5 可能有 scale/min,q3/q6 有 high-bit 或 scale 字段。 |
| AXI burst 友好度 | 转换后很好:128-bit AXI beat 可放 32 个 INT4 权重。 | 转换后很好:同样 32 个 INT4 / 128-bit beat。 | 很好:128-bit AXI beat 可放 16 个 INT8 权重。 | 原始 q4_0 block 大小约 18 bytes,不天然对齐 16/32/64B burst。 | 字段分散,控制复杂;建议先 converter 成 SoA 或统一 W4/W8 格式。 |
| scale / zero 分离 | scale 与 zero 都要对齐 qweight group。 | scale 为主;symmetric 形式一般无动态 zero-point 修正,具体仍要按后端解码核验证。 | scale 为主,q 为 int8。 | 每 32 权重一个 scale,scale 读取频率高。 | scale/min 可能被再量化,且和权重交织在 superblock 内。 |
| 地址生成复杂度 | 需要处理 qweight/qzero/scales 多流同步。 |
少一个 zero 修正流,PE 输入更干净。 |
block 小,metadata 频繁。 |
适合软件,不适合简单硬件流水。 |
| 格式 | 存储 bit | bit → 实际数值关系 | 硬件友好写法 | 主要风险 |
|---|---|---|---|---|
| AWQ W4 asymmetric | q:4-bit;zero:4-bit 或 packed zero;scale:通常 FP16/F16。 |
w_hat = scale_g × (q - zero_g)。其中 q 通常是 0..15 的 nibble,zero_g 是 group 对应 zero-point。 |
不要逐元素 FP32 反量化。做 psum_q=Σ(q×x) 和 sum_x=Σx,group 末尾算 scale×(psum_q-zero×sum_x)。 |
qzero 的 packed 语义、nibble 顺序、zero 是否有实现层偏移,都必须用软件 reference 校验。 |
| GPTQ Int4 symmetric | q:4-bit packed;scale:F16/FP16;可能还有后端需要的 packed 辅助 tensor。 |
数学上可理解为 w_hat = scale_g × q_signed。若存储为 unsigned nibble,硬件需要转换成带符号值,例如 q_signed = q_u - 8;具体以 converter 解析后的 reference 为准。 |
INT4 × INT8/INT16 → INT32,group 结束后乘 scale。比 AWQ 少 zero 修正项。 |
GPTQ safetensors 的 qweight 排布服务 GPU/ExLlama/GEMM kernel,不等于矩阵自然行列序;必须正确反 pack / transpose。 |
| GPTQ Int8 symmetric | q:8-bit signed 或等价 packed 形式;scale:F16/FP16。 |
w_hat = scale_g × q_int8,q_int8 ∈ [-128,127] 或实现等价范围。 |
byte 读入,直接 INT8×INT8/INT16。非常适合调试数值链路。 |
带宽和模型体积更大;小 FPGA 上 token/s 容易被 DDR 卡住。 |
| GGUF Q4_0 | 每 32 权重:FP16 d + 16 bytes packed nibble。 |
典型关系为 w_hat = d × (q - 8),其中 q 来自 4-bit nibble。 |
可以实现,但建议在 PC 端转成 group=128 的统一 W4 格式,减少 scale 频率和地址复杂度。 | 原始 block 18 bytes 不好做 AXI 对齐;直接实现 llama.cpp block kernel 会牺牲 PE 利用率。 |
| GGUF Q8_0 | 每 32 权重:FP16 d + 32 个 int8。 |
w_hat = d × q_int8。 |
最适合硬件调试:读取、解包、乘法都直观。 | 最终性能不理想,DDR 流量高。 |
| GGUF K-quants | 通常 256 元素 superblock,含 quants、scale/min、high-bit、super scale 等字段。 | q2_K/q4_K/q5_K 多数可理解为 w = a×q + b;q3_K/q6_K 更接近 scale-only 加额外 bit 字段。 |
不建议直接硬件实现。先转成统一 W4/W8 SoA 格式,再给 GEMV 引擎。 | 控制状态机复杂、bitfield 多、metadata 交错,容易让 AXI burst 和 PE 阵列都低效。 |
量化模型本质上是把连续浮点权重 w 映射成低 bit 整数 q,再用 scale/zero 恢复近似权重 w_hat。FPGA 不一定真的要恢复完整浮点权重;更好的做法是把公式变形后做整数累加。
量化:
q = clamp(round(w / scale) + zero, q_min, q_max)
反量化:
w_hat = scale × (q - zero)
AWQ 的 zero_point=true 就是 affine/asymmetric 形式。4-bit 下 q_min=0、q_max=15。每个 group 有自己的 scale_g 和 zero_g。如果 group_size=128,则每 128 个输入通道共享一组 scale/zero。
q_signed = signed_decode(q_bits)
w_hat = scale × q_signed
GPTQ symmetric 可以理解为 zero 固定在 0 或由编码中心隐含表示。对 4-bit 来说,硬件里常见做法是把 unsigned nibble 0..15 转成 signed 值,例如 q_signed = q_u - 8,范围变成 -8..7。实际官方文件可能还有 qzeros/g_idx 等后端辅助 tensor,converter 应以软件 kernel 的数值输出为 golden reference,而不是只看文件名。
直接做 AWQ 的方式是每个权重都先算:
weight_i = scale_g × (q_i - zero_g)
y += x_i × weight_i
这会让每个 PE 都有 subtract 和 scale 乘法。更硬件友好的变形是:
y_group = Σ_i x_i × scale_g × (q_i - zero_g)
= scale_g × (Σ_i x_i × q_i - zero_g × Σ_i x_i)
硬件中:
psum_q = Σ_i x_i × q_i
sum_x = Σ_i x_i
y_group = scale_g × (psum_q - zero_g × sum_x)
这个变形的意义非常大:zero 修正从“每个乘法一次”变成“每个 group 一次”,scale 乘法也从每个权重一次减少到每个 group 一次。代价是多维护一个 sum_x 累加器。
假设 activation 用 INT8,范围约 -127..127,W4 signed 值范围约 -8..7。一个 group 内 128 项乘加的绝对上界大致是:
max_abs ≈ 128 × 127 × 8 = 130,048
18 bit 加符号位已能覆盖单 group 的理论上界,但完整 dot product 会跨多个 group。以 hidden_size=896 为例,有 7 个 group;以 intermediate_size=4864 为例,有 38 个 group。因此实际 partial sum 建议至少使用 INT32。如果 activation 用 INT16,INT32 仍可用,但要重新校验 saturation 和 scale 范围。
官方权重量化文件里的 scale 常是 FP16/F16,FPGA 内部可以有三种选择:
| scale 实现 | 优点 | 缺点 | 建议 |
|---|---|---|---|
| FP16 scale + FP16/FP32 乘法 | 最接近软件 reference,容易 bring-up。 | DSP/LUT/延迟较高;小 FPGA 不友好。 | KV260 可用于第一版;PYNQ-Z2 不建议大量使用。 |
| 定点 scale,例如 Qm.n | 面积和功耗更低;适合流水化。 | 需要离线统计 scale 范围,确定小数位和饱和策略。 | 推荐最终版。 |
| 查表 / shift 近似 | 资源最低。 | 精度风险较高。 | 只适合极限优化或特定层。 |
官方 safetensors 和 GGUF 文件都不是理想的 PL 直接读取格式。建议在 PC 端把模型转换成下面这种硬件 binary。
model.bin
├── header
│ ├── magic/version/checksum
│ ├── n_layers, hidden_size, intermediate_size, vocab_size
│ ├── quant_type: GPTQ_W4_SYM / AWQ_W4_ASYM / W8_SYM
│ └── tensor offset table
├── layer_00
│ ├── q_proj.weight.tile_blocks
│ ├── k_proj.weight.tile_blocks
│ ├── v_proj.weight.tile_blocks
│ ├── o_proj.weight.tile_blocks
│ ├── gate_proj.weight.tile_blocks
│ ├── up_proj.weight.tile_blocks
│ └── down_proj.weight.tile_blocks
├── ... layer_23
├── embedding_or_lm_head_blocks
└── tokenizer/config 单独放 PS 文件系统,不建议 PL 解析
一个 128-bit AXI beat 可以携带:
对于 W4、group=128,一个 group 的 qweight 正好是 128 个 4-bit = 512 bit = 4 个 128-bit beat。再加每 group 的 scale 和 zero。建议把 qweight 和 scale/zero 分成两类流:qweight 主流保持满 burst,scale/zero 小流提前预取到 BRAM 或寄存器。
W4 group block 示例:
[group_header]
scale_g: 16-bit 或 fixed-point
zero_g : 4-bit/8-bit,AWQ 使用;GPTQ symmetric 可省略或固定
[qweight]
beat0: q[0]..q[31] packed as 32 nibbles
beat1: q[32]..q[63]
beat2: q[64]..q[95]
beat3: q[96]..q[127]
[optional padding to 16/32/64B alignment]
许多 CPU 量化格式是 Array-of-Structs:一个小 block 内同时放 scale、min、quants、高位 bit。CPU cache 读取很方便,但 PL 里的 PE 阵列更喜欢 Struct-of-Arrays:qweight 连续、scale 连续、zero 连续,方便多个 AXI master 或 DMA channel 并行预取。
GGUF 原始倾向:
block0: scale0 | q0..q31 | block1: scale1 | q32..q63 | ...
FPGA 推荐:
q_stream: q0..q31 | q32..q63 | q64..q95 | ...
scale_stream: scale0 | scale1 | scale2 | ...
zero_stream: zero0 | zero1 | zero2 | ...
| 模块 | 职责 | AWQ 特别点 | GPTQ 特别点 | 实现风险 |
|---|---|---|---|---|
| Descriptor / Scheduler | PS 写寄存器告诉 PL 当前层、矩阵、输入向量地址、权重 offset、输出地址、tile 参数。 | 要提供 scale/zero stream base address。 | 要提供 scale stream base address;可少 zero stream。 | descriptor 错误会导致难以定位的整层偏差,需加 checksum 和 layer-by-layer debug。 |
| AXI Burst Reader | 连续读取 qweight 主流,最好多 outstanding request,按 tile 双缓冲。 | qweight/zero/scale 三流同步。 | qweight/scale 两流同步。 | DDR 不连续、burst 太短、跨 4KB 边界会严重掉速。 |
| Nibble / Byte Unpacker | 把 128-bit beat 解析成 32 个 INT4 或 16 个 INT8。 | 还要解 qzero nibble。 | 要做 signed 解释或 implicit center correction。 | nibble 高低位顺序、端序、tensor transpose 是最常见 bug。 |
| Activation Buffer | 缓存输入向量 x,复用于多个输出通道。 | 还要支持 sum_x 计算。 |
只需送入 PE 做 q×x。 | activation 是 FP16/FP32 还是 INT8/INT16,决定整个 datapath。 |
| PE Array / MAC | 多个 lane 并行做乘加,产生 partial sum。 | 建议算 psum_q 和 sum_x,group 后 zero 修正。 |
建议直接 psum=Σq×x,group 后乘 scale。 |
不要第一版就追满 DSP;先保证 bit-exact。 |
| Scale / Requant | 把 INT32 partial sum 乘 scale,输出 FP16 或定点。 | 计算 scale×(psum-zero×sum_x)。 |
计算 scale×psum。 |
scale 定点化的溢出、舍入、饱和会影响文本质量。 |
| Output Reducer / Top-K | 对输出通道做规约、写回,LM head 需要扫描 vocab logits。 | LM head/vocab projection 是大瓶颈;尽量在 PL 内做 block top-k,避免完整 logits 全写 DDR。 | vocab=151,936,最终层非常吃带宽。 | |
| 格式 | 建议硬件 datapath | 不建议做法 | 第一版验证策略 |
|---|---|---|---|
| AWQ W4 | qweight INT4 → psum_q;并行计算 sum_x;group 末尾 zero correction + scale。 |
每个权重都先反量化成 FP32 再 MAC。 | 先用一层小矩阵做 bit-exact;比较 PC converter 输出和 PL 输出。 |
| GPTQ W4 | q_signed × x → INT32 psum;group 末尾乘 scale。 |
直接把 qweight safetensors 当自然矩阵顺序读。 | 优先实现 q_proj 或 down_proj 单矩阵;逐 output channel 对比。 |
| GPTQ W8 | int8 × x,byte unpack,scale 后输出。 |
把 W8 当最终性能目标上 PYNQ-Z2。 | 用于验证 RMSNorm、RoPE、attention、MLP 的数值链路。 |
| GGUF Q4/Q8 | 先在 PC 端转成统一硬件格式;或只把 q8_0/q4_0 作为最小 block kernel 实验。 | 直接实现所有 K-quants 的 block 解码。 | 用 llama.cpp 输出作为端到端文本 baseline;硬件侧只用转换后的权重。 |
以 GGUF 为例,q2_k 约 415 MB,q4_0 约 429 MB,q4_k_m 约 491 MB,看起来 2-bit 和 4-bit 大小差距并不大。关键原因是 Qwen2.5-0.5B 的 embedding/LM head 很大。官方 config 给出 vocab_size=151936、hidden_size=896,所以 embedding 参数数约为:
151,936 × 896 = 136,134,656 参数
如果这一部分保留 FP16,仅它就约 260 MiB。很多量化文件还包含 tokenization 文件、metadata、部分未量化 tensor、对齐 padding。因此文件大小不会简单等于 参数量 × bit / 8。
对 batch=1 的 autoregressive decode,主瓶颈通常是权重流带宽,而不是峰值算力。每生成一个 token,绝大多数大矩阵权重要从 DDR 被读一遍,PL 只是在流上做 GEMV。不同量化格式的粗略带宽压力如下:
| 格式 | 主权重字节/参数 | 元数据开销 | 带宽瓶颈评价 |
|---|---|---|---|
| W4 AWQ/GPTQ | 0.5 byte | scale/zero 每 group 额外开销 | |
| W8 GPTQ/GGUF q8_0 | 1 byte | scale 每 group/block 开销 | |
| GGUF K-quant | 2.6–6.6 bit/weight 有效值不等 | superblock scale/min/high-bit 开销 | |
| FP16/BF16 | 2 bytes | 少 |
| 指标 | 从低到高的倾向 | 说明 |
|---|---|---|
| DDR 带宽 | GPTQ W4 ≈ AWQ W4 < GGUF Q4/K < GPTQ W8 ≈ GGUF Q8 < FP16 | W4 主权重最低,但元数据和布局会影响实际 burst 效率。 |
| PL 控制复杂度 | GPTQ W8 < GPTQ W4 < AWQ W4 < GGUF Q4_0 < GGUF K-quants | AWQ 多 zero;K-quants 多 bitfield 和 superblock。 |
| 数值调试难度 | GPTQ W8 / GGUF Q8 < GPTQ W4 < AWQ W4 < GGUF K-quants | 低 bit + asymmetric + backend packing 越多,越难 bit-exact。 |
| 最终性能潜力 | GGUF 直跑 < W8 < AWQ/GPTQ W4 自定义 binary | 性能潜力取决于是否能保持长 burst 和 PE 高利用率。 |
建议路线:先用官方 GGUF/GPTQ 做 PC 软件基线,再用 GPTQ-Int4 做硬件第一版,最后再评估 AWQ 或自量化。不要第一版就直接实现 GGUF K-quant 或 FP32 MAC。
| 阶段 | 输入模型 | 目标 | 硬件策略 | 验收标准 |
|---|---|---|---|---|
| 阶段 0:软件基线 | GGUF Q4_K_M / Q8_0 或 GPTQ-Int4 | 确认 prompt template、tokenizer、采样、输出质量。 | PC / CPU / llama.cpp / transformers。 | 固定 prompt 下输出可复现;保存每层 reference。 |
| 阶段 1:converter | GPTQ-Int4 safetensors | 从官方格式导出自定义硬件 binary。 | 把 qweight 解包、转置、按 group/tile/AXI beat 重排。 | PC 上用硬件 binary 反推结果,与原模型单层误差一致。 |
| 阶段 2:单矩阵 PL GEMV | 自定义 W4 binary | 跑通 q_proj / down_proj 等单矩阵。 | INT4×INT8/INT16 → INT32,group scale 输出。 | 单矩阵输出与 golden reference 误差在设定范围内。 |
| 阶段 3:单层 Transformer | 同上 | 接入 RMSNorm、RoPE、Attention、MLP。 | 非矩阵算子可先在 PS,矩阵在 PL。 | 单层输出对齐;token logits 排名基本一致。 |
| 阶段 4:全模型 decode | GPTQ-Int4 或 AWQ W4 | 端到端生成。 | PS 调度 + PL GEMV + DDR KV cache + top-k。 | 能稳定生成;吞吐和功耗可测。 |
| 阶段 5:优化 | AWQ 或自量化 | 提高质量/速度/容量利用。 | 定点 scale、双缓冲、多 AXI、LM head top-k、layer fusion。 | 质量接近软件基线,token/s 达到目标。 |
| 目标 | 推荐输入 | 原因 |
|---|---|---|
| 最快跑通硬件 GEMV | GPTQ-Int8 或自己导出的 W8 | byte 级数据,误差小,便于定位硬件问题。 |
| 第一版可用 W4 加速 | GPTQ-Int4 | symmetric 更规整,文件较小,适合自定义 INT MAC。 |
| 对齐公开 KV260 AWQ 思路 | AWQ | activation-aware W4,质量潜力好,但 zero 修正复杂。 |
| PC/PS 软件 baseline | GGUF Q4_K_M / Q8_0 | llama.cpp 使用方便,适合输出质量和 prompt 验证。 |
| 最终极限优化 | 原始 BF16 → 自己量化 | 可以控制 group_size、scale 格式、校准集、层级混合精度和硬件 pack。 |
最终推荐:把 GPTQ-Int4 作为 FPGA 硬件闭环的第一输入源,把 AWQ 作为第二阶段质量优化/论文路线对齐,把 GGUF 当软件参考和 tokenizer/prompt 验证,不建议直接把 GGUF K-quant 解码逻辑搬进 PL。
hidden_size=896、intermediate_size=4864、vocab_size=151936、bits=4、group_size=128、quant_method=awq、zero_point=true。来源:AWQ config.json。bits=4、group_size=128、desc_act=false、quant_method=gptq、sym=true,以及 repo 约 471 MB、model.safetensors 约 459 MB。来源:GPTQ-Int4 config.json、model page 与 files tree。bits=8、group_size=128、desc_act=false、quant_method=gptq、sym=true,以及 model.safetensors 约 640 MB。来源:GPTQ-Int8 config.json 与 files tree。block_q4_0、block_q8_0、K-quant superblock 结构及注释。来源:llama.cpp ggml-common.h;另见镜像源码片段 ggml-quants.h。注:本报告中的“硬件友好公式”和“推荐 binary layout”是面向 FPGA GEMV 加速器的工程建议,不代表官方 AWQ/GPTQ/GGUF 文件的原始内部布局。实际实现时应以官方模型加载库或 reference kernel 的数值输出为准,逐 tensor、逐 group、逐 nibble 做验证。