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