TinyStories LLM 在 $250 的 KV260 FPGA 上達到 60k tokens/s

重點摘要

一個 3.16 M 參數的 INT4 LLM 可以放入 $250 AMD KV260 FPGA 的 3 MB 片上 SRAM 中,並在實時網頁演示中測得 59,965 tokens/s(200 MHz,16 個並行流)以及 19,200 tokens/s 的可用速度(單流,完整 KV cache),證明了對於微型模型而言,片上權重儲存可以克服 DDR 頻寬牆。


為什麼片上記憶體至關重要

KV260 的 ARM A53 核心與可程式邏輯 (PL) 共用單一離線 DDR 控制器,頻寬限制在 ~20 GB/s。當模型權重儲存在 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 words),但並未減少參數數量;它僅透過減少每個 token 的字元數來加速生成。

架構與實現

  • 雙埠 URAM – 存放權重圖像,並實現「分裂大腦」設計,讓兩組數據同時讀取權重。
  • BRAM – 儲存激活值 (activations)、暫存空間與 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 流總計)

此階梯顯示每一次優化都消除了特定的延遲來源:將矩陣乘法移至 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,支援數百 MB 等級的模型。

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