参考 gateGPT 的 RTL / 微码 / 固定点 / KV-cache 思路,评估是否能把 Qwen2.5-0.5B 小模型做成类似“模型烧进 FPGA”的实现。结论区分“全片上硬化”和“外部 DDR 流式加速”两种含义。
如果“硬化”指权重、embedding、KV cache、执行引擎全部在 Zynq-7020 的 PL 片上资源内,结论是基本不可能。仅 Qwen2.5-0.5B 的 INT4 权重就约 247 MB,而 Zynq-7020 的 BRAM 只有约 0.6 MB,即使把所有 LUT 都当 ROM 也远远不够。
如果接受权重放 DDR、PL 只实现高度定制的 Transformer 推理流水线,那么可以做成模型专用 FPGA 加速器,但不再是 gateGPT 那种“权重 LUT-baked / 小模型全在片上”的形态。实际吞吐大概率在低个位数到数 token/s 量级,受 DDR 带宽强约束。
可借鉴的是微码调度、固定点整数参考、KV cache、共享 scratchpad、逐 token 增量解码;不可照搬的是把所有权重作为 ROM 常量烧进 FPGA。Qwen 的词表、层数、隐藏维度、MLP 和上下文长度比 gateGPT 大几个数量级。
| 项目 | 数值 / 说明 |
|---|---|
| 参数量 | 0.49B,非 embedding 参数 0.36B |
| 层数 | 24 Transformer decoder blocks |
| 隐藏维度 | 896 |
| MLP intermediate | 4864,SwiGLU 结构通常需要 gate/up/down 三个投影 |
| Attention | 14 个 query heads,2 个 KV heads,head_dim=64 |
| 词表 | 151,936,tied word embeddings |
| 上下文 | 32,768 tokens |
| 原始权重文件 | HF LFS 中 model.safetensors 约 988,097,824 bytes |
| 资源 | Z-7020 | 对本问题的含义 |
|---|---|---|
| Logic Cells | 85K | 足以做控制、DMA、小型矩阵引擎,不足以容纳大模型常量。 |
| LUT | 53,200 | 即使每个 LUT 当 64-bit ROM,也只有约 0.41 MB 原始容量。 |
| BRAM | 4.9 Mb,约 0.6 MB | 只能放 tile buffer、少量查表和局部 scratchpad。 |
| DSP slices | 220 | 算力不是唯一瓶颈;权重流入带宽更致命。 |
| PS-PL 高性能接口 | 4 个 64-bit AXI_HP | 可做 DDR burst streaming,但需要优秀 DMA 和仲裁设计。 |
| DDR 理论带宽示例 | 1066 MT/s × 4 B = 4264 MB/s | 实际可达带宽低于理论上限,并受 CPU/其它 master 争用影响。 |
| 项目 | gateGPT | 为什么重要 |
|---|---|---|
| 模型 | 1 个 Transformer block,n_embed=24,4 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 LUT,62 DSP,2 RAMB36,80 MHz | Zynq-7020 可以容纳类似 tiny model,但 Qwen 的权重和计算量大约多 5e4 级。 |
| 吞吐 | 约 53.8k–69.2k tok/s,取决于上下文位置 | 该吞吐来自极小模型,不能外推到 Qwen。 |
来源见 [S7]。
| 维度 | gateGPT | Qwen2.5-0.5B | 倍率 |
|---|---|---|---|
| 层数 | 1 | 24 | 24× |
| hidden size | 24 | 896 | 37.3× |
| MLP hidden / intermediate | 96 | 4864 | 50.7× |
| vocab | 27 | 151,936 | 5627× |
| context | 16 | 32,768 | 2048× |
| 粗略参数量 | 约 8.6k–11k | 约 494M | 约 45k–57k× |
最容易被低估的是词表:gateGPT 的输出头是 24×27=648 MAC;Qwen 的 tied LM head 是 896×151,936≈136M MAC。仅输出层就已经比 gateGPT 整个模型大很多。
| 组成 | 估算参数 | 说明 |
|---|---|---|
| Embedding / tied LM head | 151,936 × 896 = 136,134,656 | 权重共享,但推理时输出 logits 仍要读/算这张矩阵。 |
| 每层 attention 投影 | 约 1,836,160 | Q/O 为 896×896,K/V 为 896×128,外加 QKV bias。 |
| 每层 MLP | 3 × 896 × 4864 = 13,074,432 | SwiGLU 的 gate/up/down 投影是主项。 |
| 每层合计 | 约 14.91M | 含 norm/gain 和少量 bias。 |
| 24 层 block | 约 357.9M | 接近官方非 embedding 参数 0.36B。 |
| 总计 | 约 494.0M | 与官方 0.49B 相符。 |
| 权重量化 | 权重体积,不含 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× | 仍远超;需要重新训练/蒸馏,已不是原模型 |
条形以 INT4 权重为 100% 归一化;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/BF16 | KV cache INT8 | KV cache INT4 | 结论 |
|---|---|---|---|---|
| 64 | 0.75 MB | 0.375 MB | 0.1875 MB | INT8/INT4 可勉强用 BRAM/DDR 混合,但工程上仍要 buffer。 |
| 128 | 1.5 MB | 0.75 MB | 0.375 MB | INT8 已超过全部 BRAM。 |
| 512 | 6 MB | 3 MB | 1.5 MB | 必须放 DDR。 |
| 1024 | 12 MB | 6 MB | 3 MB | DDR cache + tiled attention。 |
| 8192 | 96 MB | 48 MB | 24 MB | DDR 带宽和容量压力明显。 |
| 32768 | 384 MB | 192 MB | 96 MB | 完整 32K 上下文在 Zynq-7020 上不现实。 |
在 batch=1、带 KV cache 的自回归生成中,每个新 token 仍需穿过所有线性层,并计算最终 vocabulary logits。短上下文下,权重矩阵向量乘是主项:
| 上下文 | 估算 MAC/token | 主导项 |
|---|---|---|
| 16 | 约 495M | 全模型线性层 + LM head |
| 512 | 约 516M | 仍以权重流为主 |
| 1024 | 约 538M | attention cache 读开始明显 |
| 8192 | 约 846M | attention 成为大项之一 |
| 32768 | 约 1.9B | 长上下文 attention 主导 |
这里只估算 MAC,不含 dequant、RoPE、RMSNorm、SiLU/SwiGLU、softmax、采样、DMA 调度等额外开销。
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/FP16 | 988 MB | ~1.5 tok/s | ~4.3 tok/s |
| INT8 | 494 MB | ~3.0 tok/s | ~8.6 tok/s |
| INT4 | 247 MB | ~6.1 tok/s | ~17.3 tok/s |
这些是只读权重的理想上限。实际还要读 scale/zero-point、读写 KV cache、搬运 activation、做非线性与控制,因此现实吞吐应明显低于表格。
| 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。 |
| 模块化 actuator | matvec、norm、RoPE、softmax、sampler、DMA 分开验证,降低复杂度。 |
| gateGPT 做法 | Qwen 上的问题 |
|---|---|
| 权重/embedding/microcode 作为 LUT ROM 常量 | Qwen INT4 权重约 247 MB,片上 ROM 级容量约 1 MB;差距两个数量级以上。 |
| 全部 KV cache 在一个 BRAM/scratchpad | Qwen 128 token 的 INT8 KV 已约 0.75 MB,超过全部 BRAM。 |
| 小词表 softmax / sampler | Qwen 151,936 词表导致输出头和采样逻辑非常重。 |
| Q5.11 16-bit 权重 | 16-bit 权重约 988 MB,既放不下也会带宽过大;更现实是 W4A8/W4A16 或 W8A8。 |
| 一个小矩阵引擎就能高吞吐 | Qwen 每 token 读全模型权重,DDR 流式效率决定吞吐。 |
建议把目标改写为: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 / RoPE | RMSNorm 用定点倒数平方根近似;RoPE 用查表或递推旋转。 | 误差要逐层评估,小模型量化误差容忍度比大模型低。 |
| SwiGLU | SiLU 用 LUT + 分段线性;乘法复用 DSP。 | 中间维度 4864,buffer 与带宽要 tile 化。 |
| Attention | KV cache 放 DDR,按层/头/上下文 tile 读;短上下文优先。 | 32K 上下文不建议作为第一目标。 |
| LM head | 流式计算 151,936 logits;可先只做 greedy argmax。 | 这是单 token 中很重的一步;近似 top-k 会改变严格等价性。 |
| 控制 | PS 侧管理 prompt、position、采样、DMA descriptor;PL 侧执行微码。 | 裸机比 Linux 更容易拿到稳定内存带宽。 |
| 目标定义 | 片上权重 | 外部 DDR | 上下文 | 预计难度 | 可行性 |
|---|---|---|---|---|---|
| gateGPT 风格:Qwen 全权重 + KV 全在 PL | 是 | 否 | 32K 或短上下文 | 超出器件容量 | 不可行 |
| Qwen INT4 权重 DDR 流式,短上下文 Demo | 否 | 是 | 128–1024 | 高:量化、DMA、定点误差、LM head | 有条件可行 |
| Qwen INT8 权重 DDR 流式 | 否 | 是 | 短上下文 | 容量/带宽更紧 | 勉强,吞吐低 |
| Qwen FP16/BF16 近原模型推理 | 否 | 需要 ≥1GB 且带宽高 | 短上下文 | 过高 | 不建议 |
| 重新训练 1–20M 参数模型,完整 RTL 硬化 | 可部分片上 | 可不用或少用 | 短上下文 | 中 | 最贴近 gateGPT |