TinyStories LLM 在 $250 的 KV260 FPGA 上实现 60k tokens/s

核心结论

一个 3.16 M 参数的 INT4 LLM 可以装入 $250 AMD KV260 FPGA 上 3 MB 的片上 SRAM 中,并在实时 Web 演示中实现测得的 59,965 tokens/s(200 MHz,16 个并行流)以及可用的 19,200 tokens/s(单流,全 KV cache),这证明了对于微型模型,片上权重存储可以克服 DDR 带宽墙。


为什么片上内存至关重要

KV260 的 ARM A53 核心和可编程逻辑 (PL) 共享一个带宽限制在 ~20 GB/s 的单片外 DDR 控制器。当模型权重驻留在 DDR 中时,每个 token 的生成都会在 AXI 总线上产生昂贵的往返开销,使系统受限于内存而非计算。将整个权重矩阵存储在片上 SRAM(URAM ~18 Mb + BRAM ~5 Mb)中可以将有效带宽提升至数百 GB/s,从而消除瓶颈。这一见解反映了 Taalas、Groq 和 Cerebras 的方法,它们都分配了大量的片上内存预算以逃离内存墙。

模型适配策略

  • 模型大小 – 3.16 M 参数 × 4 bits = ~1.5 MiB,轻松处于 KV260 ~3 MiB 的片上预算范围内。
  • 权重格式 – INT4 量化在保持算术简单的同时提供了所需的密度。
  • 语料库 – TinyStories(≈2.1 M 个简单的儿童故事)为玩具聊天模型提供了足够的语言多样性。
  • 词干化变体 – 一种 Kevin 风格的预处理步骤将语料库长度缩减了约 30%(371.7 M → 260.5 M 单词),但并未减少参数数量;它仅通过减少每个 token 生成的字符数来加速生成。

架构与实现

  • 双端口 URAM – 存储权重镜像并实现“分裂大脑”设计,使两个队列可以同时读取权重。
  • BRAM – 存储激活值、暂存空间和 KV cache。
  • 自定义 GEMV – 直接使用 Verilog 实现宽字矩阵-向量乘法,避免使用任何高级综合 (HLS) 工具。
  • 并行流 – 最多 16 个独立的 token 流共享一次权重读取,每个流使用 T = 1 的注意力窗口以最大限度地减少往返。这产生了 59,965 tok/s 的聚合峰值速率。
  • 全上下文流 – 具有完整 KV cache(对所有先前 token 进行注意力计算)的单流在 ~19,200 tok/s(计数周期)和 ~21,300 tok/s(实测)下提供可用的聊天功能。

性能阶梯

阶段 配置 Tokens/s (芯片) 备注
A53 基准 仅 ARM A53 11 仅 CPU,受 DDR 限制
GPU 参考 RTX 3050 Ti (torch) 719
单流 PL Fabric 中全前向,全 KV cache 19,242 (计数) ≈ 21,300 (实测)
4-16 并行流 T = 1, 无 KV cache 59,965 (16 流聚合)

该阶梯显示了每一次优化都消除了一个特定的延迟源:将 matmul 移至 PL,消除 CPU-Fabric 握手,最后是在并行流之间聚合权重读取。

限制与可扩展性

  • 片上容量 – KV260 提供 ~3 MiB;大于 ~6.3 M 参数的模型会溢出到 DDR,重新引入带宽墙。
  • DSP 资源 – 该芯片拥有 1,248 个 DSP48E2 模块,每个模块能够执行两次 INT4×INT8 MAC。为更大的模型打包所需的 MAC 将会超过可用 DSP 的数量,从而将该架构的实际吞吐量限制在 62k–78k tok/s。
  • 可用性 – 16 流聚合速度是在注意力窗口为一个 token 的情况下实现的,会产生无意义的输出。单流、全上下文模式是唯一能产生连贯对话的配置,尽管速率约为 ~21k tok/s。

与 ASIC 及大规模解决方案的比较

  • Taalas ASIC – 将权重存储在 ROM 中,实现更高的绝对吞吐量,但缺乏制造后的重新编程能力。
  • Cerebras Wafer-Scale Engine – 每个晶圆提供 44 GB SRAM,无需 DDR 瓶颈即可支持更大的模型。
  • Groq – 每个芯片分配 ~230 MB 片上 SRAM,支持数百兆字节的模型。

KV260 证明了相同的内存墙原理适用于各种预算:即使是在 $250 的开发板上,片上权重存储也能带来数量级的加速。

社区反馈亮点

"问题不在于你的模型快。GPU 在训练和推理方面都有很好的扩展性,且技术门槛很低。FPGA 设计需要深厚的硬件专业知识。" – stevefan1999

"我没想到 2,000 个连接的扫描会保持平稳,因为它们都在共享一个流。每个用户的延迟看起来如何?" – haeseong

"从概念上讲,这是一个很酷的想法。实际上,结果看起来和 import random; print(random.choice(list(my_dict))) 一样连贯……这么小的模型有实际用途吗?" – serf

"非常酷的项目。我想知道 LLM 推理的未来会是什么样子……对于更大的模型,可能需要新兴的存储技术。" – variadix

这些评论强调了原始速度与模型质量之间的权衡、FPGA 开发的陡峭学习曲线,以及片上内存创新将如何塑造未来 LLM 推理的更广泛问题。

如何复现

完整的源代码——包括 Verilog RTL、Keviniser 预处理脚本、INT4 量化的 TinyStories 模型以及服务栈——可在 github.com/MichaelAyles/kev-gpt 获取。构建流程在 20 核 i7 上使用 Xilinx Vivado CLI;完整的综合、布局布线和比特流生成大约需要 30 分钟。

总结

将一个微型 INT4 LLM 完全存储在低成本 FPGA 的片上 SRAM 中,消除了 DDR 带宽墙,并实现了测得的 60k tokens/s 聚合吞吐量,同时在重负载下的单流、全上下文配置仍能提供约 ~21k tokens/s 的可用性能。该实验验证了核心假设:无论预算如何,片上权重存储都能显著加速符合内存预算的模型推理。

Sources

相关

  • Dispatch
  • 项目
  • Dispatch
  • Dispatch
  • Dispatch