Feasibility Report

Qwen2.5-0.5B 在 Zynq-7020 FPGA 上“硬化实现”的可行性分析

参考 gateGPT 的 RTL / 微码 / 固定点 / KV-cache 思路,评估是否能把 Qwen2.5-0.5B 小模型做成类似“模型烧进 FPGA”的实现。结论区分“全片上硬化”和“外部 DDR 流式加速”两种含义。

日期:2026-06-16 目标器件:Xilinx / AMD Zynq-7020 模型:Qwen2.5-0.5B / 0.49B params 参考:gateGPT / microGPT RTL

1. 结论摘要

结论 A:完整片上硬化不可行

如果“硬化”指权重、embedding、KV cache、执行引擎全部在 Zynq-7020 的 PL 片上资源内,结论是基本不可能。仅 Qwen2.5-0.5B 的 INT4 权重就约 247 MB,而 Zynq-7020 的 BRAM 只有约 0.6 MB,即使把所有 LUT 都当 ROM 也远远不够。

结论 B:外部 DDR + 专用 RTL 可做研究 Demo

如果接受权重放 DDR、PL 只实现高度定制的 Transformer 推理流水线,那么可以做成模型专用 FPGA 加速器,但不再是 gateGPT 那种“权重 LUT-baked / 小模型全在片上”的形态。实际吞吐大概率在低个位数到数 token/s 量级,受 DDR 带宽强约束。

结论 C:gateGPT 思路可借鉴但不能线性放大

可借鉴的是微码调度、固定点整数参考、KV cache、共享 scratchpad、逐 token 增量解码;不可照搬的是把所有权重作为 ROM 常量烧进 FPGA。Qwen 的词表、层数、隐藏维度、MLP 和上下文长度比 gateGPT 大几个数量级。

一句话判断:在 Zynq-7020 上“像 gateGPT 一样全硬化 Qwen2.5-0.5B”不可行;“做一个 Qwen2.5-0.5B INT4/INT8 的外部 DDR 流式推理加速器”可以尝试,但性能、工程量和模型精度都会很吃紧。

目录

2. 事实基线

Qwen2.5-0.5B 关键结构

项目数值 / 说明
参数量0.49B,非 embedding 参数 0.36B
层数24 Transformer decoder blocks
隐藏维度896
MLP intermediate4864,SwiGLU 结构通常需要 gate/up/down 三个投影
Attention14 个 query heads,2 个 KV heads,head_dim=64
词表151,936,tied word embeddings
上下文32,768 tokens
原始权重文件HF LFS 中 model.safetensors 约 988,097,824 bytes

来源见 [S1][S2][S3]

Zynq-7020 PL 资源

资源Z-7020对本问题的含义
Logic Cells85K足以做控制、DMA、小型矩阵引擎,不足以容纳大模型常量。
LUT53,200即使每个 LUT 当 64-bit ROM,也只有约 0.41 MB 原始容量。
BRAM4.9 Mb,约 0.6 MB只能放 tile buffer、少量查表和局部 scratchpad。
DSP slices220算力不是唯一瓶颈;权重流入带宽更致命。
PS-PL 高性能接口4 个 64-bit AXI_HP可做 DDR burst streaming,但需要优秀 DMA 和仲裁设计。
DDR 理论带宽示例1066 MT/s × 4 B = 4264 MB/s实际可达带宽低于理论上限,并受 CPU/其它 master 争用影响。

来源见 [S4][S5][S6]

gateGPT 基线

项目gateGPT为什么重要
模型1 个 Transformer block,n_embed=244 heads,MLP hidden 96,context 16,vocab 27这是字符级、极小上下文、极小词表模型,不是 0.5B 级 LLM。
数值格式Q5.11 signed 16-bit fixed point固定点 RTL 可验证、可综合,是可借鉴点。
架构微码 ROM sequencer + 多个 datapath actuators + 共享双口 scratchpad + persistent KV cache调度思想很好,可迁移到更大模型的流式加速器。
最终资源15.5k LUT62 DSP2 RAMB36,80 MHzZynq-7020 可以容纳类似 tiny model,但 Qwen 的权重和计算量大约多 5e4 级。
吞吐53.8k–69.2k tok/s,取决于上下文位置该吞吐来自极小模型,不能外推到 Qwen。

来源见 [S7]

3. 与 gateGPT 的量级差异

结构尺寸比

维度gateGPTQwen2.5-0.5B倍率
层数12424×
hidden size2489637.3×
MLP hidden / intermediate96486450.7×
vocab27151,9365627×
context1632,7682048×
粗略参数量约 8.6k–11k约 494M约 45k–57k×

最容易被低估的是词表:gateGPT 的输出头是 24×27=648 MAC;Qwen 的 tied LM head 是 896×151,936≈136M MAC。仅输出层就已经比 gateGPT 整个模型大很多。

Qwen 参数拆解估算

组成估算参数说明
Embedding / tied LM head151,936 × 896 = 136,134,656权重共享,但推理时输出 logits 仍要读/算这张矩阵。
每层 attention 投影约 1,836,160Q/O 为 896×896,K/V 为 896×128,外加 QKV bias。
每层 MLP3 × 896 × 4864 = 13,074,432SwiGLU 的 gate/up/down 投影是主项。
每层合计约 14.91M含 norm/gain 和少量 bias。
24 层 block约 357.9M接近官方非 embedding 参数 0.36B。
总计约 494.0M与官方 0.49B 相符。

4. 存储与 KV cache 压力

权重存储:片上资源差距是决定性瓶颈

权重量化权重体积,不含 scale/zero-point相对 Zynq-7020 BRAM 约 645 KB判断
BF16 / FP16约 988 MB约 1532×完全不可能片上容纳
INT8约 494 MB约 766×不能片上容纳
INT4约 247 MB约 383×仍远超片上资源
INT2约 124 MB约 191×仍远超;且精度风险极高
INT1约 62 MB约 96×仍远超;需要重新训练/蒸馏,已不是原模型
把所有 LUT 都配置成 ROM 的原始容量也只有 53,200×64 bit≈0.41 MB;加上全部 BRAM 也只有约 1.0 MB 级,而且实际还要留下 LUT/DSP/BRAM 做逻辑、buffer、DMA 和控制。因此“权重 LUT-baked 常量化”在 Qwen 0.5B 上没有空间余量。

存储量可视化

Zynq 全部 BRAM
0.6MB
BRAM+LUT ROM 理想上限
~1.0MB
Qwen INT4 权重
247MB
Qwen INT8 权重
494MB

条形以 INT4 权重为 100% 归一化;BRAM 小到几乎不可见。

KV cache:短上下文也很快超出 BRAM

Qwen2.5-0.5B 使用 GQA:每层 KV 维度为 2 KV heads × 64 = 128。每个 token 的全层 K+V 元素数为:

24 layers × 2(K,V) × 128 = 6144 elements/token

上下文长度KV cache FP16/BF16KV cache INT8KV cache INT4结论
640.75 MB0.375 MB0.1875 MBINT8/INT4 可勉强用 BRAM/DDR 混合,但工程上仍要 buffer。
1281.5 MB0.75 MB0.375 MBINT8 已超过全部 BRAM。
5126 MB3 MB1.5 MB必须放 DDR。
102412 MB6 MB3 MBDDR cache + tiled attention。
819296 MB48 MB24 MBDDR 带宽和容量压力明显。
32768384 MB192 MB96 MB完整 32K 上下文在 Zynq-7020 上不现实。

5. 计算量与 DDR 带宽上限

每生成 1 token 至少要做多少 MAC?

在 batch=1、带 KV cache 的自回归生成中,每个新 token 仍需穿过所有线性层,并计算最终 vocabulary logits。短上下文下,权重矩阵向量乘是主项:

上下文估算 MAC/token主导项
16约 495M全模型线性层 + LM head
512约 516M仍以权重流为主
1024约 538Mattention cache 读开始明显
8192约 846Mattention 成为大项之一
32768约 1.9B长上下文 attention 主导

这里只估算 MAC,不含 dequant、RoPE、RMSNorm、SiLU/SwiGLU、softmax、采样、DMA 调度等额外开销。

DDR 带宽给出的硬上限

Zynq-7000 官方教程给出的 32-bit DDR 理论示例为 4264 MB/s;实测/建模场景中,四个 HP 端口可持续 1510 MB/s 的视频流量,也能在压力测试中达到约 3254 MB/s 的总读写吞吐,但会引入仲裁影响。

权重量化每 token 最少读权重1.5 GB/s 时上限4.264 GB/s 理论上限
BF16/FP16988 MB~1.5 tok/s~4.3 tok/s
INT8494 MB~3.0 tok/s~8.6 tok/s
INT4247 MB~6.1 tok/s~17.3 tok/s

这些是只读权重的理想上限。实际还要读 scale/zero-point、读写 KV cache、搬运 activation、做非线性与控制,因此现实吞吐应明显低于表格。

为什么 220 个 DSP 不能解决问题? 220 DSP @ 100 MHz 理想峰值约 22 GMAC/s,短上下文 494M MAC/token 对应约 44 tok/s 的计算上限;但 INT4 权重要喂满这些 DSP 需要约 11 GB/s 的权重流,远高于 Zynq-7020 常见 DDR 能力。所以设计很容易从“算力受限”变成“权重带宽受限”。

6. “同样思路”哪些能用、哪些不能用

可以借鉴

gateGPT 思路迁移到 Qwen 的方式
微码 sequencer用 micro-op 描述每层 Q/K/V/O、MLP、RMSNorm、RoPE、attention、logits 的执行顺序,避免巨型状态机。
固定点 golden reference先建立 bit-exact Python/C++ 参考,再导出 Verilog/HLS 常量表和测试向量。
KV cache 增量解码必须使用;否则每 token 重算整个上下文,计算量不可接受。
共享 scratchpad可用 BRAM 做 activation tile、双缓冲、partial sum buffer。
模块化 actuatormatvec、norm、RoPE、softmax、sampler、DMA 分开验证,降低复杂度。

不能照搬

gateGPT 做法Qwen 上的问题
权重/embedding/microcode 作为 LUT ROM 常量Qwen INT4 权重约 247 MB,片上 ROM 级容量约 1 MB;差距两个数量级以上。
全部 KV cache 在一个 BRAM/scratchpadQwen 128 token 的 INT8 KV 已约 0.75 MB,超过全部 BRAM。
小词表 softmax / samplerQwen 151,936 词表导致输出头和采样逻辑非常重。
Q5.11 16-bit 权重16-bit 权重约 988 MB,既放不下也会带宽过大;更现实是 W4A8/W4A16 或 W8A8。
一个小矩阵引擎就能高吞吐Qwen 每 token 读全模型权重,DDR 流式效率决定吞吐。

7. 若坚持实现,推荐架构

推荐目标:不是“全片上硬化”,而是“模型专用 DDR 流式 FPGA 推理器”

建议把目标改写为:Qwen2.5-0.5B-INT4,短上下文,batch=1,PS 负责 tokenizer/调度,PL 负责核心矩阵与 attention 的专用推理加速器。

模块实现建议注意点
权重存储量化后放 DDR;SD/QSPI 只做启动加载,不做实时权重流。512 MB DDR 勉强能放 INT4 权重 + 小 KV + 裸机运行;Linux 环境余量更紧。
矩阵向量引擎INT4 weight unpack + per-group scale + INT8/INT16 activation;DSP 或 LUT-DSP 混合。双缓冲 BRAM,AXI burst 长事务,尽量连续读权重。
RMSNorm / RoPERMSNorm 用定点倒数平方根近似;RoPE 用查表或递推旋转。误差要逐层评估,小模型量化误差容忍度比大模型低。
SwiGLUSiLU 用 LUT + 分段线性;乘法复用 DSP。中间维度 4864,buffer 与带宽要 tile 化。
AttentionKV cache 放 DDR,按层/头/上下文 tile 读;短上下文优先。32K 上下文不建议作为第一目标。
LM head流式计算 151,936 logits;可先只做 greedy argmax。这是单 token 中很重的一步;近似 top-k 会改变严格等价性。
控制PS 侧管理 prompt、position、采样、DMA descriptor;PL 侧执行微码。裸机比 Linux 更容易拿到稳定内存带宽。

建议里程碑

  1. 先实现 1 layer、hidden=896、INT8/INT4 matvec 的 bit-exact 仿真。
  2. 验证 DDR → PL 的 sustained bandwidth:单 HP、双 HP、四 HP,确认 burst 效率。
  3. 实现 RMSNorm、RoPE、SwiGLU 的定点近似,并和 PyTorch 逐层误差对齐。
  4. 先跑 Qwen block 的一个 token,不做完整采样;再接 24 层。
  5. 最后接 LM head、tokenizer、KV cache 和采样。

更现实的替代路径

  • 换更小模型:TinyStories / char-level / 10M–50M 参数级模型,更接近 gateGPT 的硬化思想。
  • 换更大 FPGA/MPSoC:Zynq UltraScale+、Versal、带 LPDDR4/HBM 的板卡,内存带宽更适合 LLM。
  • 做协处理器而非全推理:例如只加速 MatVec / MLP,PS 或外部主机负责其余部分。
  • 做蒸馏/剪枝:训练一个面向 Zynq-7020 的专用小模型,而不是强行塞原始 Qwen。

8. 可行性矩阵

目标定义片上权重外部 DDR上下文预计难度可行性
gateGPT 风格:Qwen 全权重 + KV 全在 PL32K 或短上下文超出器件容量不可行
Qwen INT4 权重 DDR 流式,短上下文 Demo128–1024高:量化、DMA、定点误差、LM head有条件可行
Qwen INT8 权重 DDR 流式短上下文容量/带宽更紧勉强,吞吐低
Qwen FP16/BF16 近原模型推理需要 ≥1GB 且带宽高短上下文过高不建议
重新训练 1–20M 参数模型,完整 RTL 硬化可部分片上可不用或少用短上下文最贴近 gateGPT

9. 关键风险与验证计划

关键风险

  • 量化精度:0.5B 模型本来容量小,W4A8/W4A16 的精度损失可能比大模型明显。
  • DDR 带宽:实际吞吐取决于 HP 端口数量、burst 长度、cache/CPU 争用、数据布局。
  • LM head:151,936 词表导致最终 logits 成为独立大瓶颈。
  • 定点非线性:RMSNorm、SiLU、softmax、RoPE 的误差会逐层累积。
  • 综合/P&R:多 DSP + 多 BRAM + AXI DMA 可能出现布线拥塞,Fmax 低于仿真预期。
  • 开发周期:完整 Verilog RTL 的验证量非常大,HLS 可以加快但资源/时序不一定最优。

建议先回答的 5 个实验问题

  1. Zynq-7020 板卡 DDR 容量是 512 MB 还是 1 GB?能否裸机保留 ≥300 MB 连续物理内存?
  2. 四 HP 端口下,真实可持续只读 bandwidth 能达到多少?至少测 1 KB64 KB1 MB burst。
  3. W4A8 或 W4A16 的 Qwen2.5-0.5B 在 CPU/GPU 参考实现上困惑度和中文问答质量是否还能接受?
  4. 一个 896×4864 INT4 matvec tile 的资源、Fmax、DSP 利用率、DDR 效率是多少?
  5. LM head 是否必须全量 151,936 logits?若引入候选词剪枝,是否接受“不再严格等价于原 Qwen”?
最终建议:如果目标是展示“Transformer 全硬化到 FPGA”的美感,建议不要选 Qwen2.5-0.5B,而是训练一个 1–20M 参数、短上下文、小词表/小 BPE 的模型;如果目标是“Zynq-7020 上跑 Qwen2.5-0.5B”,则把项目定义为 DDR 流式 INT4 推理加速器,并接受较低吞吐和短上下文。

10. 参考来源

  1. Qwen/Qwen2.5-0.5B Hugging Face model card. 载明 0.49B 参数、0.36B 非 embedding 参数、24 层、14 Q heads / 2 KV heads、32,768 上下文、RoPE/SwiGLU/RMSNorm/QKV bias/tied embeddings。https://huggingface.co/Qwen/Qwen2.5-0.5B
  2. Qwen2.5 LLM blog model card. 列出 Qwen2.5-0.5B 至 72B 系列及 0.5B 的参数、层数、heads、上下文、license。https://qwenlm.github.io/blog/qwen2.5-llm/
  3. Qwen/Qwen2.5-0.5B config commit on Hugging Face. config.json 显示 hidden_size=896、intermediate_size=4864、vocab_size=151936、num_hidden_layers=24、num_attention_heads=14、num_key_value_heads=2;model.safetensors LFS size=988097824。https://huggingface.co/Qwen/Qwen2.5-0.5B/commit/b937cc073b55e980e6f21d5f8b7a77818efcf0eb
  4. AMD Zynq 7000 SoCs product table. Z-7020:85K logic cells、4.9 Mb Block RAM、220 DSP slices;PS 支持 DDR3/DDR3L/DDR2/LPDDR2。https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html
  5. AMD UG585, PL DMA via AXI High-Performance interface. AXI_HP 提供到 OCM/DDR 的高带宽 PL slave interface,四个 64-bit wide interfaces。https://docs.amd.com/r/en-US/ug585-zynq-7000-SoC-TRM/PL-DMA-via-AXI-High-Performance-HP-Interface
  6. Xilinx/AMD Embedded Design Tutorial: Evaluating High-Performance Ports. 给出 Zynq-7000 DDR 理论带宽示例 1066M tranx/sec × 4 bytes = 4264 MB/s,并展示 HP ports 吞吐测试。https://xilinx.github.io/Embedded-Design-Tutorials/docs/2021.2/build/html/docs/User_Guides/SPA-UG/docs/6-evaluating-high-performance-ports.html
  7. fguzman82/gateGPT GitHub repository. README 描述 microGPT RTL、Q5.11 fixed point、microcode sequencer、persistent KV cache、1 block / n_embed=24 / context=16 / vocab=27,以及 80 MHz、资源利用和 tokens/s 结果。https://github.com/fguzman82/gateGPT