Qwen2.5-0.5B-Instruct 在 ALINX Zynq-7020 上的 FPGA 推理架构规划

面向 XC7Z020 + PS DDR3 + QSPI Flash 的“DDR 流式权重 + PL 专用数据通路”方案。本文重点回答:数据放在哪里、AXI 总线怎么走、PL 内部怎么搭、性能大约多少、瓶颈在哪里、工程上怎么分阶段推进。

日期:2026-06-16 目标模型:Qwen2.5-0.5B-Instruct 目标板卡:ALINX Zynq-7020 / AX7020 类 结论:可做推理加速器,不是全片上硬化

1. 总体结论

核心判断:在 Zynq-7020 上继续考虑 Qwen2.5-0.5B 是可以做工程演示的,但实现形态必须定义为 “权重放 DDR3,PL 做硬化矩阵/注意力/MLP/Top-K 数据通路,PS 做加载、tokenizer、调度和采样”。它不是 gateGPT 那种把小模型几乎完整塞进片上 BRAM/LUT 的全片上硬化。

推荐目标不是追求 32K 上下文、也不是追求高吞吐服务器式推理,而是做一个 batch=1、上下文 512–2048 token、INT4/W4A16 权重量化、1–5 token/s 级别 的嵌入式 LLM 原型。若 AXI HP 与 DDR 读带宽优化得很好,短上下文下可以冲击 5 token/s 以上;若只用单 HP 口或 DDR 访问不连续,可能只有 1 token/s 左右。

≈494M
按配置估算的参数量,含 tied embedding 一份
≈243 MiB
INT4 权重 + group scale 粗略体积
≈255 MiB/token
1K 上下文时每个 decode token 的主要 DDR 读取量
1–5 tok/s
Zynq-7020 上较现实的工程目标区间

最重要的设计取舍

问题建议原因
权重放哪里?DDR3INT4 后仍约 240–270 MiB,远超 Zynq-7020 BRAM 和 32MB QSPI。
QSPI 做什么?只做启动介质放 FSBL、bitstream、U-Boot/裸机 app、配置表;不适合存完整模型,也不适合运行时流权重。
PL 做什么?重计算全部进 PLGEMV、RMSNorm、RoPE、Attention、SwiGLU、LM Head Top-K 都应在 PL 完成,避免 PS 往返。
PS 做什么?系统与语言侧控制启动加载、tokenizer、chat template、采样、UI/串口/网络、错误处理。
上下文长度?先限制 512–2048Qwen 支持 32K,但 KV cache 和 attention 读取会让 Zynq-7020 明显降速。
采样方式?PL streaming Top-K,PS 采样词表 151,936,不能在 BRAM 保存完整 logits;Top-K 流式维护最省资源。

2. 约束与关键数字

2.1 模型结构

本文按 Qwen2.5-0.5B-Instruct 配置规划。该模型是 decoder-only Transformer,使用 RoPE、SwiGLU、RMSNorm、GQA、QKV bias 与 tied word embeddings。关键配置如下:

项目数值对硬件的影响
层数24单 token 需要顺序执行 24 个 block。
hidden size896 = 7 × 128非常适合 64/128 维 tile。
intermediate size4864 = 38 × 128MLP 最大矩阵尺寸,DDR 流量主体。
attention heads14Q 维度为 14 × 64 = 896。
KV heads2GQA 显著减少 KV cache:每层每 token 只存 K/V 各 128 维。
head dim64attention dot product 较小,适合流式处理。
vocab size151,936 = 1187 × 128LM head 非常大,是隐藏瓶颈之一。
max position32,768软件上支持,硬件演示不建议直接开满。
tie_word_embeddingstrueembedding 与 LM head 共享一份权重,省存储但不省 LM head 计算。
一个有利点:Qwen2.5-0.5B 的 hidden/intermediate/vocab 都恰好是 128 的整数倍,这对 FPGA GEMV tile、AXI burst 对齐、权重打包非常友好。

2.2 参数与存储体积估算

按配置估算,单层主要矩阵参数如下:

模块矩阵尺寸参数量/层说明
Q projection896 × 896802,816输出 14 个 Q head。
K projection896 × 128114,6882 个 KV head。
V projection896 × 128114,6882 个 KV head。
O projection896 × 896802,816attention 输出回 hidden。
MLP gate/up/down3 × 896 × 486413,074,432最大权重流量来源。
每层合计14,909,440不含小量 norm/bias。
24 层 block357,826,560约 0.36B non-embedding 参数。
Embedding / tied LM head151,936 × 896136,134,656存一份,但 decode 每 token 要读完整矩阵做输出投影。
总计493,961,216与官方 0.49B 量级一致。
格式全模型权重24 层 blockEmbedding/LM head结论
BF16/FP16≈942 MiB≈682.5 MiB≈259.7 MiB几乎吃满 1GB DDR,不现实。
INT8≈471 MiB≈341.3 MiB≈129.8 MiB能放 DDR,但带宽压力较大。
INT4≈235.5 MiB≈170.6 MiB≈64.9 MiB推荐主方案。
INT4 + group scale≈243–270 MiB≈176–190 MiB≈67–75 MiB考虑 scale、padding、descriptor 后的工程体积。

2.3 板卡与器件约束

按 ALINX AX7020 类开发板估算:Zynq-7020 片上 PL 资源约为 85K logic cells、4.9Mb BRAM、220 DSP slices;ALINX AX7020 资料显示常见配置为 XC7Z020-2CLG400I、两片 4Gbit DDR3 合计 8Gbit/1GB、256Mbit/32MB QSPI。

资源量级对本项目的含义
PS DDR3通常 1GB,32-bit DDR3模型权重、KV cache、scratch、tokenizer、运行时都放这里。
QSPI Flash256Mbit = 32MB只能放启动镜像、bitstream、配置;不能放 INT4 全模型。
BRAM4.9Mb ≈ 612.5KB只能放 tile buffer、activation、norm/bias、DMA FIFO、少量表。
DSP220可做 32–128 lane 级 GEMV/attention MAC 阵列;资源很紧。
PS双核 Cortex-A9适合控制与 tokenizer,不适合承担大矩阵计算。
不要把 QSPI 当权重仓库:INT4 权重本体已经约 235.5 MiB,QSPI 只有 32 MiB。即便压缩,也无法稳定容纳完整 Qwen2.5-0.5B,更无法满足运行时每 token 数百 MiB 级读取需求。

3. 数据存储规划:哪些数据放在哪里

QSPI Flash 32MB FSBL / bitstream / U-Boot 裸机 app / 配置表 / manifest 不放完整模型权重 PS DDR3 1GB 量化权重:≈243–270 MiB KV cache:1K≈12 MiB FP16,4K≈48 MiB tokenizer / prompt / runtime / scratch PL 通过 AXI_HP 访问物理地址 PL BRAM ≈612KB activation / partial sum DMA FIFO / KV tile norm/bias/小 LUT PL 硬化推理核 GEMV / Attention / RMSNorm / SwiGLU / Top-K 只保留 tile,不保留大矩阵 PS 用 AXI-Lite 发命令,PL 自主跑完整 token 启动加载 AXI_HP burst tile buffer

3.1 推荐 DDR 逻辑布局

具体物理地址要看你使用 Linux、裸机、PetaLinux 还是 Vitis bare-metal。下面是推荐的逻辑布局;重点是给 PL 一段连续、物理地址稳定、cache 不干扰的 DDR 区域。

区域建议容量访问方说明
Boot/runtime/OS裸机:16–64 MiB;Linux:128–256 MiB+PSLinux 方便文件加载和网络,裸机更确定且省 DDR。
Quantized model region280–320 MiB 预留PL 读为主,PS 启动写入W4 权重、scale、bias、descriptor,按 layer 和矩阵顺序线性排列。
KV cache region16 MiB/1K token 预留;64 MiB 可覆盖 4K FP16PL 读写理论 FP16 KV:12 MiB/1K token;预留额外对齐与管理空间。
Activation/scratch DDR8–32 MiBPL/PS主要用于调试、batched prefill、错误回读;正常 decode activation 在 BRAM。
Tokenizer / vocab / prompt8–32 MiBPSQwen tokenizer 与 chat template 放 PS 侧处理。
Top-K / command ring<1 MiBPS/PLPL 输出 top-k token id + logit,PS 采样后写下一个 token。

3.2 BRAM 分配建议

Zynq-7020 BRAM 只有约 612KB。它的角色是缓存当前计算 tile,不是缓存模型层权重。

BRAM 用途建议量级说明
Activation/residual 双缓冲16–32KBhidden=896,int16/int32 都很小;多留给 norm 与 residual。
MLP 中间向量32–64KBgate/up/down 的 4864 维向量可完整放下,也可 tile。
Weight stream FIFO128–256KB多 HP 口时需要足够 FIFO 吸收 DDR 抖动。
KV attention tile64–128KB例如一次读 128 token 的 K/V tile。
Norm/bias/constants96–140KB所有 RMSNorm 权重约 88KB FP16;QKV bias 约 55KB FP16,可按需压缩/分批。
Top-K、softmax LUT、microcode32–64KB在线 softmax 和 streaming top-k 不需要完整 logits 缓冲。

3.3 QSPI 使用策略

内容是否建议放 QSPI理由
FSBL建议标准启动流程。
PL bitstream建议XC7Z020 bitstream 量级为数 MB,适合 QSPI。
U-Boot / 裸机推理 app可行裸机更容易放下;Linux kernel + rootfs 可能需要 SD/网络。
模型 manifest / layer descriptor建议很小,便于版本校验。
Tokenizer 文件视空间而定可放 QSPI 或 SD;PS 读入 DDR 后使用。
完整 INT4 Qwen2.5-0.5B不可能约 243–270 MiB,远超 32MB。
如果你的 ALINX 板卡实际是 512MB DDR 而不是 1GB DDR,INT4 模型仍可能放下,但要优先选择裸机或非常小的 Linux,限制上下文到 512–1024,并避免在 DDR 里保留完整 logits/scratch 大缓冲。

4. 总线与数据流设计

Zynq-7000 的关键优势是 PS 和 PL 共享 DDR。PL 侧自定义 AXI master 通过 PS 的 S_AXI_HP 端口读取 DDR 权重/KV。PS 通过 AXI-Lite/GP 端口写控制寄存器,PL 完成一个 token 或一段 prefill 后中断 PS。

PS Cortex-A9 core0/1 Tokenizer / chat template Model loader / sampler AXI-Lite driver DDR controller / QSPI / SD PL LLM Accelerator Microsequencer AXI read DMA ×2/3 GEMV MAC array Attention / Softmax RMSNorm / RoPE / SwiGLU Streaming LM Head Top-K PS DDR3 W4 weight blob Scale / bias / descriptor KV cache Tokenizer / prompt Top-K ring / logs M_AXI_GP / AXI-Lite IRQ / status HP0/HP1 权重长 burst HP2 KV read/write HP3 optional / Top-K write 启动时 PS 从 QSPI/SD/以太网把模型装入 DDR;运行时 PL 不直接从 QSPI 流权重

4.1 AXI 端口分工建议

接口方向用途建议
M_AXI_GP0/GP1 或 AXI-LitePS → PL控制寄存器、模型基地址、token 位置、启动命令只做低速控制,不传大数据。
PL → PS IRQPL → PS单 token 完成、prefill block 完成、错误状态避免每个矩阵中断;一次 token 最多一次中断。
S_AXI_HP0PL master → DDR权重流 A64-bit、长 burst、连续地址。
S_AXI_HP1PL master → DDR权重流 B / LM head用于双路预取,隐藏 DDR latency。
S_AXI_HP2PL master ↔ DDRKV cache 读写attention tile 顺序读,当前 token K/V 顺序写。
S_AXI_HP3可选scratch、batched prefill、Top-K 写回初版可不用;优化版可加入。
ACPPL ↔ PS cache coherent低容量共享数据不建议用于权重流。HP 更适合大吞吐。

4.2 读写流量模型

每个 decode token 的主流量是完整扫描模型权重:

INT4 权重本体 ≈ 235.5 MiB
Group scale / padding / descriptor ≈ 7–35 MiB
KV cache 读取:FP16 时 ≈ 12 MiB × context/1024
KV cache 写入:≈ 12 KiB/token,可忽略

因此 1K 上下文时:≈ 255 MiB/token
4K 上下文时:≈ 291 MiB/token
32K 上下文时:≈ 627 MiB/token

这意味着设计成败主要取决于 DDR 顺序读带宽,而不是 DSP 峰值算力。AXI master 必须发长 burst,权重文件必须按实际计算顺序预重排,避免随机读取。

4.3 DDR 访问原则

5. PL 内部架构设计

LLM Accelerator Top AXI-Lite Control model_base / kv_base position / context / mode start / done / irq Microsequencer layer loop ×24 matrix descriptor engine prefetch / dependency AXI DMA Scheduler HP0/1 weight read HP2 KV read/write burst align / FIFO On-chip Buffers activation / residual weight FIFO KV tile / constants Weight Unpack + Dequant INT4 packed nibble group scale / zero block floating / fixed point feed MAC lanes Tiled GEMV MAC Array 建议 64–96 lanes 起步 INT4 × INT16 → INT32 acc 支持 out_tile/in_tile QKV / MLP / LM head 复用 输出 requantize / scale Vector Unit RMSNorm RoPE Residual add SiLU/SwiGLU scale update Attention Engine GQA 14Q/2KV KV tile read online softmax context vector no score buffer Streaming LM Head + Top-K 151,936 rows stream scan,保留 K 个候选 KV Cache Manager 写当前 K/V;按 layer/token/head_dim 顺序读取历史 KV

5.1 核心复用思想

不要为每个矩阵单独做硬件。整个模型 90% 以上计算都可以复用一个高效的 tiled GEMV engine

模型操作是否复用 GEMV特殊处理
Embedding lookup否,直接读一行从 tied embedding 矩阵读 token row,dequant 成 hidden 向量。
QKV projection推荐融合为 1152×896,一次线性扫描。
O projection896×896。
MLP gate/up推荐融合为 9728×896,然后做 SwiGLU。
MLP down896×4864。
LM head151,936×896,输出不保存完整 logits,直接 streaming top-k。
Attention QK/AV部分复用可用较小 dot-product 阵列,不需要大 GEMV。

5.2 推荐 GEMV tile 参数

参数保守初版推荐版激进版
MAC lanes3264–96128+
PL clock100 MHz125–150 MHz150 MHz+
AXI HP1 个 HP 口2 个 HP 口读权重 + 1 个 KV3–4 个 HP 口并行
权重量化W4A16W4A16 / W4A8 混合INT4 packed 多 MAC/DSP
预计难度可快速验证建议目标时序与仲裁风险高

5.3 Vector Unit 设计要点

5.4 Microsequencer 而不是 PS 逐算子调度

如果每个矩阵都由 PS 发命令,一次 token 至少要触发数百次寄存器写和同步,调度开销会很明显。建议 PL 内置 microsequencer:PS 只发一次“generate one token / prefill N tokens”命令,PL 根据 descriptor 自动遍历 24 层。

Instruction example:
LOAD_EMBED token_id -> X
FOR layer = 0..23:
  RMSNORM X -> XN
  GEMV QKV[layer], XN -> Q,K,V
  ROPE Q,K,position
  KV_WRITE layer, position, K,V
  ATTEND layer, Q, KV[0:position] -> A
  GEMV O[layer], A -> Y
  ADD X,Y -> X
  RMSNORM X -> XN
  GEMV GATE_UP[layer], XN -> G,U
  SWIGLU G,U -> M
  GEMV DOWN[layer], M -> Y
  ADD X,Y -> X
FINAL_RMSNORM X -> XN
GEMV_TOPK EMBED, XN -> top_k
IRQ PS

6. 单 token 执行流程与数据流

6.1 Decode 模式:batch=1

Decode 是生成阶段的主循环。每生成一个 token,模型权重基本都要扫一遍,因此 DDR 带宽成为主导。

步骤数据来源数据去向关键硬件备注
1. token embeddingDDR embedding rowBRAM X[896]DMA + dequant只读一行,流量很小。
2. RMSNormBRAM X + norm weightBRAM XNVector Unitnorm weight 可常驻 BRAM。
3. QKV GEMVDDR QKV weightsBRAM Q/K/VGEMVQKV 融合读,K/V 输出写 KV cache。
4. RoPE + KV writeBRAM Q/K/VDDR KV cacheVector + DMA write只写当前 token 的 K/V。
5. AttentionDDR history KVBRAM attention outputAttention Engine按 tile 读历史 KV,online softmax。
6. O GEMV + residualDDR O weights + BRAM ABRAM XGEMV + Vector输出回 hidden。
7. RMSNorm + MLP gate/upDDR MLP weightsBRAM G/U/MGEMV + Vectorgate/up 融合,再做 SwiGLU。
8. Down GEMV + residualDDR down weightsBRAM XGEMV + Vector完成一层。
9. 重复 24 层DDR layer blobsBRAM final XMicrosequencerPS 不介入。
10. Final RMSNormBRAM XBRAM XNVector Unit准备 LM head。
11. LM head Top-KDDR tied embedding matrixTop-K ringGEMV + Top-K不保存 151,936 个 logits。
12. SamplingTop-K ringnext token idPSPS 做 temperature/top-k 采样。

6.2 Prefill 模式:prompt 输入阶段

如果 prompt 有 256 或 512 token,逐 token prefill 会非常慢,因为每个 token 都要重新扫权重。建议实现一个小批量 prefill 模式,batch size 取 4 或 8,把同一层同一矩阵的权重只读一次,同时处理多个 prompt token。

方案实现复杂度效果建议
逐 token prefill最慢;512-token prompt 可能数分钟级只用于 bring-up。
B=4 batched prefill权重流量/每 token 约降到 1/4,compute 利用率提高推荐第一版优化。
B=8 或 B=16更好复用权重,但 BRAM、attention causal mask、控制复杂度上升等 decode 跑稳后再做。
低成本演示时,建议限制 prompt 长度,例如 64–256 token。真正影响用户体验的不是只看 decode token/s,而是 prefill 延迟。没有 batched prefill 时,长 prompt 会显得“卡住”。

7. 量化、模型二进制格式与数值策略

7.1 推荐量化策略

部分推荐格式原因
Dense weightsINT4 group-wise,group=128尺寸压到 240–270 MiB;维度天然 128 对齐。
ActivationINT16 或 block-float 16-bit小模型对激进 W4A8 更敏感,初版先保证质量。
AccumulatorINT32GEMV 累加必须留足动态范围。
RMSNorm/Softmax16/24-bit fixed 或 FP-likenorm、softmax 对输出质量敏感,不建议过早做极低精度。
KV cacheFP16 初版;INT8 优化版FP16 简单可靠;INT8 可把 KV 空间和读取减半。
LM headINT4 初版;可混合 INT8LM head 影响 token 选择,若质量差可对 embedding/LM head 升 INT8。

7.2 权重文件格式建议

model.bin
  header
    magic, version, quant_type, group_size
    hidden=896, inter=4864, layers=24, vocab=151936
    base offsets for each region
  global constants
    final_norm, layer_norms, qkv_bias, rope constants
  embedding_tied_lm_head
    packed int4 rows [vocab][hidden]
    row/group scales
  layer[0]
    qkv_fused:  [1152][896]   packed by out_tile/in_tile
    o_proj:     [896][896]
    gate_up:    [9728][896]
    down_proj:  [896][4864]
    scales / descriptor
  ...
  layer[23]
    ...

7.3 Tile 排布

推荐以 out_tile × in_tile 为基本单元,in_tile 取 128,out_tile 取 16/32/64。每个 tile 内 INT4 权重连续打包,scale 紧随或独立连续存放。

for out_tile in output_dim / OUT_TILE:
  zero accum[OUT_TILE]
  for in_tile in input_dim / 128:
    burst read packed_weight[OUT_TILE][128]
    burst read scale[OUT_TILE]
    broadcast activation[128]
    MAC + scale accumulate
  requantize accum -> output vector / top-k
hidden=896、intermediate=4864、vocab=151936 都能被 128 整除,所以 group=128 与 AXI burst 对齐非常自然。这个模型虽然大,但维度形状对硬件并不坏。

7.4 质量风险控制

8. 性能预估

8.1 每 token 计算量

忽略 attention 随上下文增长的部分,线性层每个 decode token 约需要扫描全部参数并做一次乘加:

部分MAC/token占比
24 层 Transformer block≈357.8M MAC≈72.4%
LM head / tied embedding projection≈136.1M MAC≈27.6%
线性层合计≈494.0M MAC/token100%

Attention 额外计算随上下文长度增长。GQA 降低了 KV 存储,但 Q head 仍是 14 个:

上下文长度Attention 额外 MAC/token相对线性层KV 读取 FP16
512≈22M≈4.5%≈6 MiB
1024≈44M≈8.9%≈12 MiB
2048≈88M≈17.8%≈24 MiB
4096≈176M≈35.7%≈48 MiB
32768≈1.41B≈285%≈384 MiB

8.2 带宽主导的 token/s 估算

按 INT4 权重 + scale + FP16 KV 读取估算,1K 上下文下约 255 MiB/token,4K 上下文下约 291 MiB/token。实际 token/s 可以粗略按下式估计:

token/s ≈ sustained_DDR_read_bandwidth / bytes_per_token

场景持续 DDR 读带宽假设1K ctx 估算4K ctx 估算工程判断
保守:单 HP / 初版 DMA0.35–0.55 GB/s≈1.3–2.1 tok/s≈1.2–1.9 tok/s可 bring-up,但用户体验一般。
推荐:2 HP 权重 + 1 HP KV0.9–1.4 GB/s≈3.3–5.2 tok/s≈3.0–4.8 tok/s比较合理的目标。
激进:4 HP 调优1.8–2.5 GB/s≈6.7–9.3 tok/s≈6.2–8.6 tok/s有机会,但时序和 DDR 仲裁风险高。
32K ctx1.2 GB/s≈1.8 tok/s,且 attention compute 很重不建议作为 Zynq-7020 目标。
上表是带宽模型,不是承诺值。真实速度会被 AXI burst 效率、DDR 行切换、scale 读取、INT4 unpack、softmax 近似、PS/PL 同步、时序降频共同影响。建议先做一个“按模型权重访问模式”的 AXI benchmark;如果连续读不到 800 MB/s,完整模型前先优化 DDR/HP。

8.3 计算阵列是否够用

494M MAC/token 看起来很大,但在 INT4 权重流式推理里,Zynq-7020 更可能先被 DDR 带宽限制。

MAC 阵列理论 MAC/s494M MAC 计算时间结论
32 lanes @100MHz3.2 GMAC/s≈154 ms计算上限约 6.5 tok/s;与 DDR 初版相近。
64 lanes @125MHz8.0 GMAC/s≈62 ms计算上限约 16 tok/s;通常 DDR 更慢。
96 lanes @150MHz14.4 GMAC/s≈34 ms明显带宽受限。
128 lanes @150MHz19.2 GMAC/s≈26 ms需要更高 DDR 吞吐才有意义。

8.4 推荐性能目标

阶段目标验收指标
MVP完整生成闭环上下文 ≤512,≥0.5 tok/s,输出可读。
可演示版优化 DDR 和 Top-K上下文 1K,1–3 tok/s,短问答可用。
优化版多 HP + batched prefill上下文 1–2K,3–5 tok/s,prefill 不明显拖慢。
挑战版极致 AXI/INT4 packing短上下文 5 tok/s+,但开发成本高。

9. 瓶颈与风险分析

9.1 主要瓶颈排序

优先级瓶颈表现缓解策略
1DDR 权重流带宽每 token 约 250–300 MiB 读取,直接决定 token/sINT4、矩阵重排、长 burst、多 HP、双缓冲、减少随机访问。
2LM head 大词表单 LM head 就要读约 65 MiB INT4 权重,占总流量约 27%streaming top-k;可选 hot vocab cache/词表裁剪/混合精度,但裁剪会改变模型。
3Prefill 延迟长 prompt 逐 token 处理会非常慢batched prefill B=4/8,限制 prompt 长度。
4Attention 随上下文增长4K 后 attention compute/KV 读明显上升;32K 不适合限制上下文、KV INT8、窗口化或摘要,但会改变行为。
5量化质量0.5B 模型容量小,W4 可能让回答质量下降W4A16 起步;敏感矩阵 INT8;离线逐层误差验证。
6PL 资源与时序多 HP + 128 lanes + softmax/top-k 可能难收敛先 32/64 lanes,模块化验证,再扩。
7PS/PL cache coherencyPS 写命令/读 top-k 与 PL DMA 结果不一致non-cacheable buffer、cache flush/invalidate、ring buffer 协议。

9.2 LM head 是很容易低估的瓶颈

由于 vocab=151,936,最终输出投影矩阵为 151,936×896,即使 tied embedding 让它不额外占一份存储,生成每个 token 仍必须扫描这 136M 个权重来找下一个 token。INT4 下约 64.9 MiB;加 scale 和 padding 后可能接近 70 MiB。

如果实现时把全部 logits 写回 DDR 再交给 PS 排序,不仅浪费带宽,也会增加延迟。更好的方式是 PL 在 LM head 流式 GEMV 时维护 top-k,例如 K=32 或 K=64,只把候选 token id 和 logit 写给 PS。

9.3 不建议一开始支持完整 32K 上下文

FP16 KV cache 的空间公式:

KV_bytes = layers × context × 2(K,V) × kv_heads × head_dim × 2 bytes

上下文KV cache FP16KV cache INT8建议
512≈6 MiB≈3 MiBbring-up 目标。
1024≈12 MiB≈6 MiB推荐默认。
2048≈24 MiB≈12 MiB推荐上限。
4096≈48 MiB≈24 MiB可做优化版。
32768≈384 MiB≈192 MiBZynq-7020 不建议。

10. 实施路线图

阶段 0:PC 侧准备与量化验证

任务产物验收
下载 Qwen2.5-0.5B-Instruct,固定 transformers 版本PyTorch reference能在 PC 上生成固定测试样例。
实现 W4A16 离线量化quantized model.binPC 模拟量化输出与 FP16 输出差异可接受。
按硬件 tile 重排权重tiled binary + descriptorsPC 上用同一格式跑出正确 logits。
制作测试向量embedding/layer/logits golden data每个 PL 模块都有 golden reference。

阶段 1:AXI 与 GEMV 单算子

阶段 2:单层 Transformer block

阶段 3:24 层 decode + LM head

阶段 4:性能优化

优化项收益风险
QKV/gate-up 融合矩阵减少调度和 activation 处理需要修改权重转换器。
多 HP 并行读提升 DDR 吞吐DDR 仲裁、时序、FIFO 复杂。
B=4/8 batched prefill显著降低 prompt 首 token 延迟控制复杂度增加。
KV INT8KV 空间/读取减半attention 质量需验证。
LM head hot-vocab cache部分减少常见 token 延迟BRAM 很紧,收益有限。
混合精度敏感矩阵提升输出质量DDR 流量增加。

建议的最终架构配置

推荐版配置:
W4A16,group=128;64–96 lane GEMV;HP0/HP1 读权重,HP2 管 KV;上下文默认 1024,可选 2048;PL streaming Top-K=32;PS 负责 tokenizer 和采样。
不要优先做的事:
不要先追 32K 上下文;不要先做完整 logits 回 DDR;不要把权重从 QSPI 运行时流入 PL;不要由 PS 逐矩阵调度;不要一开始就全 W4A8 极限量化。

最终判断

Qwen2.5-0.5B 在 ALINX Zynq-7020 上可以做,但必须接受“慢速、强约束、DDR 流式”的实现边界。

比较务实的目标是:用 Qwen2.5-0.5B-Instruct,权重 INT4 放 DDR,PL 做硬化推理核,PS 做系统控制;上下文限制在 1K–2K;最终达到 1–5 token/s 的嵌入式演示效果。这个方案的技术亮点在于完整跑通现代 dense Transformer,而不是高吞吐。

如果项目目标是论文/展示/工程验证,它值得做;如果目标是实用聊天速度,Zynq-7020 会明显吃力,应考虑更高端 Zynq UltraScale+、带 PL DDR 的板卡,或换 100M 级模型。

11. 参考资料

  1. Qwen/Qwen2.5-0.5B 模型卡:0.49B 参数、0.36B non-embedding、24 层、GQA 14Q/2KV、32,768 context、RoPE/SwiGLU/RMSNorm/tied embeddings。https://huggingface.co/Qwen/Qwen2.5-0.5B
  2. Qwen/Qwen2.5-0.5B-Instruct 模型卡:instruction-tuned 版本,24 层、GQA、32K context + 8192 generation。https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct
  3. Qwen2.5-0.5B-Instruct config.json:hidden_size=896、intermediate_size=4864、num_attention_heads=14、num_key_value_heads=2、rope_theta=1000000、tie_word_embeddings=true、vocab_size=151936。https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct/blame/main/config.json
  4. ALINX AX7020 GitHub:XC7Z020-2CLG400I、两片 4Gbit DDR3 合计 8Gbit、256Mbit QSPI、Micro SD 等板卡信息。https://github.com/alinxalinx/AX7020_2023.1
  5. AMD Zynq 7000 SoC 产品页:Z-7020 资源 85K logic cells、4.9Mb Block RAM、220 DSP slices。https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html
  6. AMD UG585:AXI_HP 四个 64-bit 高性能接口可让 PL master 访问 DDR/OCM,带 FIFO,适合高带宽 burst。https://docs.amd.com/r/en-US/ug585-zynq-7000-SoC-TRM/PL-DMA-via-AXI-High-Performance-HP-Interface
  7. Xilinx/AMD Embedded Design Tutorials:Zynq-7000 HP port 性能示例,四 HP 口视频流 1510 MB/s,压力测试总读写 3254.4 MB/s。https://xilinx.github.io/Embedded-Design-Tutorials/docs/2021.1/build/html/docs/User_Guides/SPA-UG/docs/6-evaluating-high-performance-ports.html