FPGA 部署评估 · Qwen2.5-0.5B-Instruct

官方 AWQ / GPTQ / GGUF 量化模型在 FPGA 上的差异、数据格式与硬件实现报告

本报告把前面讨论的表格扩展成工程化视角:同一个 Qwen2.5-0.5B-Instruct,在官方 AWQ、GPTQ-Int4、GPTQ-Int8、GGUF q4/q8/K-quant 等版本下,实际部署到 FPGA 时会在外部存储、AXI 数据流、解包逻辑、scale/zero 处理、MAC 阵列、BRAM 缓冲和验证流程上产生明显差异。

报告日期:2026-06-17 目标:FPGA 硬化 / 加速推理 重点:数据格式、bit 到数值关系、硬件代价 建议方向:自定义硬件 binary,而非原样上板

1. 结论摘要

最重要的判断:官方量化模型可以作为输入源和软件基线,但通常不能作为 FPGA 内部的最终格式。FPGA 版应在 PC 端写 converter,把 Hugging Face 的 safetensorsGGUF 解析后,重新整理成你的 AXI burst、PE 阵列、BRAM tile、group-size 对齐的 硬件原生 binary

首选 bring-up

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=4group_size=128zero_point=trueversion=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 版做 W4A8W4A16,用 INT4 × INT8/INT16 → INT32 partial sum,最后再按 group 乘 scale。

2. 模型基线与官方量化版本

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=896intermediate_size=4864vocab_size=151936num_hidden_layers=24tie_word_embeddings=true

官方模型 外部格式 官方配置 / 文件信息 FPGA 部署含义
Qwen2.5-0.5B-Instruct-AWQ Hugging Face safetensors + AWQ config 4-bit AWQ;group_size=128zero_point=trueversion=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=128desc_act=falsesym=truequant_method=gptqmodel.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 分散、地址生成复杂等问题。

3. 从 FPGA 角度的详细对比表

3.1 消耗资源对比

维度 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 阵列。
可做 baseline 可转格式
不建议直接实现 K-quant kernel。
可做 debug

3.2 数据规整程度对比

维度 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 频繁。

适合软件,不适合简单硬件流水。

3.3 数据格式、数值公式与硬件处理方式对比

格式 存储 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_int8q_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 阵列都低效。

4. 数据的具体存储 bit 与实际数值关系

量化模型本质上是把连续浮点权重 w 映射成低 bit 整数 q,再用 scale/zero 恢复近似权重 w_hat。FPGA 不一定真的要恢复完整浮点权重;更好的做法是把公式变形后做整数累加。

4.1 通用 affine 量化

量化:
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=0q_max=15。每个 group 有自己的 scale_gzero_g。如果 group_size=128,则每 128 个输入通道共享一组 scale/zero。

4.2 symmetric 量化

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,而不是只看文件名。

4.3 AWQ 的 group-wise zero 修正技巧

直接做 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 累加器。

4.4 累加位宽估算

假设 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 范围。

4.5 scale 的表示

官方权重量化文件里的 scale 常是 FP16/F16,FPGA 内部可以有三种选择:

scale 实现优点缺点建议
FP16 scale + FP16/FP32 乘法 最接近软件 reference,容易 bring-up。 DSP/LUT/延迟较高;小 FPGA 不友好。 KV260 可用于第一版;PYNQ-Z2 不建议大量使用。
定点 scale,例如 Qm.n 面积和功耗更低;适合流水化。 需要离线统计 scale 范围,确定小数位和饱和策略。 推荐最终版。
查表 / shift 近似 资源最低。 精度风险较高。 只适合极限优化或特定层。

5. FPGA 友好的数据打包与存储建议

官方 safetensorsGGUF 文件都不是理想的 PL 直接读取格式。建议在 PC 端把模型转换成下面这种硬件 binary。

官方模型文件 AWQ / GPTQ / GGUF 软件 kernel 排布 PC 端 converter 反 pack / transpose 重排成 AXI / PE friendly 硬件 binary 连续 tile blocks q / scale / zero 分区 DDR burst stream PL 数据流:AXI reader → unpack → group accumulator → scale/zero correction → output buffer 原则:让 PE 每拍拿到规整 qweight 和 activation,避免在 MAC 内做复杂地址跳转。

5.1 推荐的硬件 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 解析

5.2 以 group_size=128、AXI 128-bit 为例

一个 128-bit AXI beat 可以携带:

INT4:32 个权重 / beat INT8:16 个权重 / beat FP16:8 个数 / 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]

5.3 AoS 到 SoA:GGUF/K-quant 为什么不适合直接上板

许多 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  | ...

6. 硬件实现会遇到的问题与逻辑实现建议

6.1 顶层架构

PS ARM调度/tokenizer DDRweights/KVactivation buffers AXIburst readerdescriptor DMA UnpackINT4/INT8scale/zeroprefetch GEMV PE ArrayINT MAC lanespartial sum INT32group scalezero correction OutputFP16/fixedDDR/BRAMtop-k/logits 非矩阵算子建议RMSNorm / RoPE / Softmax / SiLU / sampling 可先在 PS 或小 PL 单元做;第一版不要把所有算子一次性硬化。

6.2 关键硬件模块

模块职责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_qsum_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,最终层非常吃带宽。

6.3 对不同格式的专用逻辑差异

格式建议硬件 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;硬件侧只用转换后的权重。

6.4 常见坑清单

7. 资源与瓶颈分析

7.1 模型尺寸为什么没有按 bit 数线性下降?

以 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=151936hidden_size=896,所以 embedding 参数数约为:

151,936 × 896 = 136,134,656 参数

如果这一部分保留 FP16,仅它就约 260 MiB。很多量化文件还包含 tokenization 文件、metadata、部分未量化 tensor、对齐 padding。因此文件大小不会简单等于 参数量 × bit / 8

7.2 每 token decode 的核心瓶颈

对 batch=1 的 autoregressive decode,主瓶颈通常是权重流带宽,而不是峰值算力。每生成一个 token,绝大多数大矩阵权重要从 DDR 被读一遍,PL 只是在流上做 GEMV。不同量化格式的粗略带宽压力如下:

格式主权重字节/参数元数据开销带宽瓶颈评价
W4 AWQ/GPTQ0.5 bytescale/zero 每 group 额外开销最适合小 FPGA
W8 GPTQ/GGUF q8_01 bytescale 每 group/block 开销带宽翻倍
GGUF K-quant2.6–6.6 bit/weight 有效值不等superblock scale/min/high-bit 开销控制复杂,未必快
FP16/BF162 bytes小 FPGA 不现实

7.3 资源消耗的相对排名

指标从低到高的倾向说明
DDR 带宽GPTQ W4 ≈ AWQ W4 < GGUF Q4/K < GPTQ W8 ≈ GGUF Q8 < FP16W4 主权重最低,但元数据和布局会影响实际 burst 效率。
PL 控制复杂度GPTQ W8 < GPTQ W4 < AWQ W4 < GGUF Q4_0 < GGUF K-quantsAWQ 多 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 高利用率。

8. 推荐实施路线

建议路线:先用官方 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 达到目标。

8.1 针对你当前 FPGA 方向的选择

目标推荐输入原因
最快跑通硬件 GEMVGPTQ-Int8 或自己导出的 W8byte 级数据,误差小,便于定位硬件问题。
第一版可用 W4 加速GPTQ-Int4symmetric 更规整,文件较小,适合自定义 INT MAC。
对齐公开 KV260 AWQ 思路AWQactivation-aware W4,质量潜力好,但 zero 修正复杂。
PC/PS 软件 baselineGGUF Q4_K_M / Q8_0llama.cpp 使用方便,适合输出质量和 prompt 验证。
最终极限优化原始 BF16 → 自己量化可以控制 group_size、scale 格式、校准集、层级混合精度和硬件 pack。

最终推荐:GPTQ-Int4 作为 FPGA 硬件闭环的第一输入源,把 AWQ 作为第二阶段质量优化/论文路线对齐,把 GGUF 当软件参考和 tokenizer/prompt 验证,不建议直接把 GGUF K-quant 解码逻辑搬进 PL。

9. 资料来源与依据

  1. Qwen2.5 collection:Qwen2.5 系列包含 0.5B、1.5B、3B、7B、14B、32B、72B 等尺寸。来源:Hugging Face Qwen2.5 Collection
  2. Qwen2.5-0.5B-Instruct-AWQ 模型页:列出参数量 0.49B、非 embedding 0.36B、24 层、GQA 14Q/2KV、32,768 context、AWQ 4-bit 等信息。来源:Qwen AWQ model page
  3. Qwen2.5-0.5B-Instruct-AWQ config:列出 hidden_size=896intermediate_size=4864vocab_size=151936bits=4group_size=128quant_method=awqzero_point=true。来源:AWQ config.json
  4. Qwen2.5-0.5B-Instruct-GPTQ-Int4 config/files:列出 bits=4group_size=128desc_act=falsequant_method=gptqsym=true,以及 repo 约 471 MB、model.safetensors 约 459 MB。来源:GPTQ-Int4 config.jsonmodel pagefiles tree
  5. Qwen2.5-0.5B-Instruct-GPTQ-Int8 config/files:列出 bits=8group_size=128desc_act=falsequant_method=gptqsym=true,以及 model.safetensors 约 640 MB。来源:GPTQ-Int8 config.jsonfiles tree
  6. Qwen2.5-0.5B-Instruct-GGUF 文件列表:官方提供 fp16、q2_k、q3_k_m、q4_0、q4_k_m、q5_0、q5_k_m、q6_k、q8_0 等,并列出文件大小。来源:GGUF files tree
  7. llama.cpp / ggml 量化结构:block_q4_0block_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 做验证。