AI 现在已经能够自行开发推理硬件
摘要
openTPU 是一个由 AI 智能体自主设计的开源 AI 加速器,包含完整的 SystemVerilog 硬件设计、自定义 ISA、比特精确仿真器以及编译器工具链,能够在一张 Xilinx Kintex-7 FPGA 板卡上运行十个真实的 LLM。该项目探索了自主 AI 智能体在设计运行自身推理的硬件方面究竟能走多远。
查看缓存全文
缓存时间: 2026/10/06 17:52
FeSens/openTPU
Source: https://github.com/FeSens/openTPU
openTPU
一个开源的 AI 加速器,由 AI 开发。
openTPU 将 auto-arch-tournament (https://github.com/FeSens/auto-arch-tournament) 的经验带到了 AI 加速器领域。它提出了两个问题:AI 智能体在硬件设计上能走多远?它们能否造出一颗运行自身推理的芯片?
otpu-chat 在 FPGA 卡上运行 LFM2.5-230M,otpu-smi 在旁监控卡片状态
otpu-chat 在 FPGA 卡上运行 LFM2.5-230M(左),otpu-smi 显示卡片的利用率和 DRAM 带宽(右)。
一个学习的好地方
openTPU 同时也是一个学习项目。整个加速器都集中在一个小型 monorepo 中,你可以从头读到尾:硬件设计(SystemVerilog)、指令集、一个位精确的模拟器、一种内核语言及其编译器,以及驱动真实 PCIe 卡的主机端软件。如果你想理解一个 AI 加速器是如何工作的——从 Python 里的矩阵乘法一直到底层的导线——这是一个很好的起点。
结果
该设计在 Inspur YPCB-00338 卡(Xilinx Kintex-7 xc7k480t,两条 DDR3 通道)上,用真实权重运行十个现代模型,且卡片输出的 token 与模拟器逐位一致。
| 模型 | 权重 | 解码,设备 | 解码,墙钟 | 预填充,设备 | 解码时 DRAM 带宽 |
|---|---|---|---|---|---|
| LFM2.5-230M | int8 | 59.0 tok/s | 52.3 tok/s | 295.6 tok/s | 14.5 GB/s(峰值的 85%) |
| LFM2.5-230M | 4-bit,int8 head | 85.8 tok/s | 82.1 tok/s | 335.4 tok/s | 14.1 GB/s(82%) |
| Qwen3-0.6B | int8 | 21.6 tok/s | 21.3 tok/s | 92.1 tok/s | 14.4 GB/s(84%) |
| Qwen3-0.6B | 4-bit,int8 head | 31.3 tok/s | 30.7 tok/s | 103.4 tok/s | 13.9 GB/s(82%) |
| Qwen3.5-0.8B | int8 | 17.6 tok/s | 16.3 tok/s | 61.4 tok/s | 14.5 GB/s(85%) |
| Qwen3.5-0.8B | 4-bit,int8 head | 24.5 tok/s | 23.3 tok/s | 66.7 tok/s | 14.1 GB/s(83%) |
| Gemma 4 E2B | 4-bit,int8 head | 10.57 tok/s | 10.53 tok/s | 32.1 tok/s | 15.6 GB/s(92%) |
| Gemma 4 E2B | 4-bit,4-bit head | 12.14 tok/s | 12.09 tok/s | 29.9 tok/s | 15.5 GB/s(91%) |
| LFM2-2.6B | int8 | 6.05 tok/s | 6.03 tok/s | 21.4 tok/s | 16.1 GB/s(94%) |
| LFM2-2.6B | 4-bit,int8 head | 10.96 tok/s | 10.93 tok/s | 20.6 tok/s | 15.8 GB/s(93%) |
| SmolLM3-3B | int8 | 5.00 tok/s | 4.99 tok/s | 21.1 tok/s | 16.0 GB/s(94%) |
| SmolLM3-3B | 4-bit,int8 head | 8.74 tok/s | 8.72 tok/s | 22.8 tok/s | 15.7 GB/s(92%) |
| Phi-4-mini (3.8B) | int8 | 3.99 tok/s | 3.98 tok/s | 13.8 tok/s | 16.0 GB/s(94%) |
| Phi-4-mini (3.8B) | 4-bit,int8 head | 6.56 tok/s | 6.55 tok/s | 15.0 tok/s | 15.8 GB/s(92%) |
| Qwen3.5-2B | int8 | 8.02 tok/s | 8.00 tok/s | 38.2 tok/s | 16.0 GB/s(94%) |
| Qwen3.5-2B | 4-bit,int8 head | 12.09 tok/s | 12.03 tok/s | 41.7 tok/s | 15.8 GB/s(92%) |
| Qwen3.5-4B | 4-bit,int8 head | 5.88 tok/s | 5.87 tok/s | 12.9 tok/s | 15.7 GB/s(92%) |
| Gemma 4 E4B | int8,4-bit head 且 down 0-23 层为 4-bit | 3.78 tok/s | 3.75 tok/s | 14.8 tok/s | 16.0 GB/s(94%) |
在卡片上实测:前三个模型于 2026-09-29 使用生产镜像 deploy_champ_e698dcd7 测得。LFM2-2.6B、SmolLM3-3B 和 Phi-4-mini 于 2026-09-30 测得,Qwen3.5-2B、4B 和 Gemma 4 于 2026-10-01 测得,使用 Build B,deploy_fused133c_79c5707a,此后一直用于生产。Build B 解码 LFM2-2.6B、SmolLM3 和 Phi-4-mini 比 e698dcd7 快 8-9%(Gemma 4 E2B 快 10%),DRAM 利用率达 91-94% 而非 82-87%。Qwen3.5-4B 的 int8 镜像超过 4 GiB。
- 镜像:main e698dcd,运行频率 133.33 MHz,所有模型共用同一个 bitstream。其中包含由存储核心内部一个小 CPU 校准的 LiteDRAM 控制器、一个四列脉动矩阵单元,以及流引擎(docs/stream.md)。DDR3-1066,峰值 17.1 GB/s。
- 主机:卡片插在 opentpu(Intel Core i7-4790)中。
- 方法,
tools/qual/perf.py:解码为在 512 token 提示词之后贪心生成 64 个 token,主机端 argmax 参与循环(非流式)。“设备”只统计加速器运行的周期;“墙钟”则加上主机端时间。预填充为 512 token 提示词,仅在设备端计时。 - DRAM 流量来自卡片运行时自身的计数器。
- Gemma 4 E2B 将其逐层嵌入表保留在卡上(镜像 3.5-3.6 GiB;docs/gemma4.md);用 int8 会放不下。无论使用哪种 head,它在三条提示词上都与 Hugging Face 的贪心 token 一致。E4B 的表(2.95 GB)留在主机端,每生成一个 token 就向卡内拷贝一行 11 KB 数据;其镜像为 3.96 GiB,其中 head 和前 24 层的 down 投影采用 4-bit(docs/gemma4_e4b.md)。在卡片自己的解码循环中(由卡挑选每个 token),Gemma 4 解码更快:E2B 11.01 / 12.73 tok/s(int8 / 4-bit head),E4B 3.83 tok/s,均在设备端计时。
- 每种配置都与模拟器逐 token 一致,逐位置对比,并使用驻留的解码程序。更多细节见 docs/board.md。
在卡片运行时流式回传 logits 的情况下(tools/decode_profile.py,96 个 token),4-bit 解码更快,如下为设备 / 墙钟 tok/s:
- LFM2:89.5 / 84.5;
- Qwen3:33.7 / 33.3;
- Qwen3.5:24.6 / 24.2;
- LFM2-2.6B:11.07 / 11.02(Build B);
- SmolLM3-3B:8.92 / 8.89(Build B);
- Phi-4-mini:6.69 / 6.67(Build B)。
此前的生产镜像 se-cand3 使用 Xilinx MIG 构建,矩阵单元为两列,时钟 120.755 MHz。以相同方法测量,新镜像:
- 解码: 在每种配置下都与 se-cand3 相差不超过 2.3%。解码受限于 DRAM,LiteDRAM 读取带宽达到 DDR3 峰值的 82-85%,与 MIG 相当。
- 预填充: 快 1.3 倍(Qwen3.5)到 2.0 倍(LFM2 4-bit)。
- 校准: 镜像启动时,核心内部的 CPU 在 12 秒内完成两条 DDR3 通道的校准,无需主机参与。
更早期的镜像及其数据见 docs/board.md 第 5 节。
比卡片 4 GiB 容量更大的混合专家(MoE)模型,可从主机存储流式加载专家权重(docs/offload.md 第 10 节)。卡片对每个 token 做路由并计算所有专家,并将专家按层保存在其 DRAM 的槽位中。主机只负责从池文件中拷贝缺失的专家到这些槽位,速率与链路一致(第 10.1 节)。于 2026-10-01 使用 Build B(79c5707a)实测,由卡片自己的解码循环挑选每个 token,4-bit 专家,int8 head:
- LFM2.5-8B-A1B(85 亿参数,17 亿激活):160 个 token 上 10.6 tok/s。98.5% 的专家命中槽位,每个 token 流式加载 5.2 MB。
- Qwen3.5-35B-A3B(347 亿参数,30 亿激活):3.95 tok/s,使用 Hugging Face 的 16 个贪心 token 对比。专家命中率 62%,每个 token 流式加载 153 MB,PCIe 链路速率为 1.41 GB/s(第 10.3 节)。
- 两者都与模拟器逐位一致。
4-bit 权重(docs/quant.md)采用带两级块缩放的 FP4 数值,每个权重 4.25 bit,同时将 LM head 保持为 int8 以保证精度。它们使每个 token 的字节数减少约三分之一,解码速度提升 40%(Qwen3.5)到 45%(Qwen3、LFM2),同时在困惑度上有可测量的代价,docs/quant.md 中按模型报告。
主机几乎不参与其中。对 LFM2 和 Qwen3 而言,卡片运行一个只编译一次的解码程序:该程序从寄存器读取位置,查出自己的嵌入和 RoPE 行,并在卡片仍在运行时将 logits 流式回传:主机端每个 token 增加 0.17 到 0.30 毫秒(在 opentpu 上为 0.45 到 1.3 毫秒)。 Qwen3.5 的解码方式相同;其预填充仍在主机端提前为每个 chunk 编译好程序,然后交给卡片。
工作原理
`` Kernels in ol mlp, attention, full model layers | @ol.jit Language + compiler layouts, affine loop addressing, fusion | ISA 8 x 32-bit words per instruction | ISA simulator <======> RTL same bits, checked by the tests (Python) (SystemVerilog) | Vivado bitstream FPGA card Kintex-7 xc7k480t | PCIe Host otpu-chat, otpu-smi, otpu-lens
这台机器刻意做得简单。一个序列器每周期向若干单元发出一条指令:DMA 负责搬运数据,矩阵单元对从 DRAM 流式读入的 int8 权重做乘法,向量单元执行 fp32 运算,量化器再把结果转回 int8。没有缓存,也没有隐藏的调度:每一次数据移动都是一条指令,因此一次 trace 能精确显示周期花在了哪里。[docs/isa.md](docs/isa.md) 描述了完整的指令集。
一个内核看起来像这样:
```python
from opentpu import language as ol
@ol.jit
def mlp(h, gamma, w_gate, w_up, w_down, out, eps): # 简化版;参见 kernels/mlp.py
x = ol.load(h)
xs = ol.quantize(rmsnorm(x, ol.load(gamma), eps))
g = ol.dot(xs, w_gate)
u = ol.dot(xs, w_up)
a = ol.all_gather(silu(g) * u)
y = ol.all_gather(ol.dot(a, w_down))
if ol.program_id() == 0:
ol.store(out, x + y)
由于每一次数据移动都是一条指令,运行 trace 就能解释其速度表现。Lens 是性能分析器,它从 RTL、模拟器或卡片上录制一次运行,并在浏览器中打开,展示 roofline 图、时间线和逐指令表格(docs/lens.md)。
Lens 在布局图上回放 Qwen3 的解码步
Lens 正在回放 Qwen3 解码步的一部分。颜色表示每个单元在每个周期的活动状态:繁忙、等待 DRAM,或等待另一条指令。
动手试试
除卡片外,其余部分都能在笔记本电脑上运行。
pip install -e .
pip install pytest torch transformers
python3 -m pytest -q # RTL 测试还需要 Verilator 5
hf download LiquidAI/LFM2.5-230M --local-dir models/LFM2.5-230M
otpu-chat --model lfm2 --backend isa # 在模拟器上聊天
如果有卡片,先在 boards/ypcb-00338 中执行 make bit 构建 bitstream,通过 JTAG 加载,然后运行 sudo otpu-setup,再用 otpu-chat --backend board。docs/board.md 详细讲解了上板调试流程。
| 命令 | 功能 |
|---|---|
otpu-chat | 与 Qwen3-0.6B、LFM2.5-230M(--model lfm2)、Qwen3.5-0.8B(--model qwen35)、LFM2-2.6B(lfm2-2.6b)、SmolLM3-3B(smollm3)、Phi-4-mini(phi4-mini)或 Qwen3.5-2B / 4B(qwen35-2b,qwen35-4b)对话 |
otpu-smi | 温度、功耗、DRAM 带宽和各单元利用率 |
otpu-lens | 录制一次运行并在性能分析器中打开 |
otpu-selftest、otpu-diag | 检查卡片是否正常工作 |
从哪里开始阅读
- docs/isa.md:指令集。其他一切都建立在它之上。
opentpu/kernels和 docs/compiler.md:一个内核如何变成指令。opentpu/isasim.py:模拟器,它就是规格本身。rtl/:硬件部分,从rtl/top/otpu_top.sv开始。- docs/lfm2.md、docs/qwen35.md、docs/llama.md、docs/benchmarks.md:完整模型,以及它们的周期都花在了哪里。
- docs/board.md:实体卡片,从时钟到 PCIe。
下一步计划
- DRAM 的最后几个百分点。 解码受限于 DRAM 效率:读取带宽为 DDR3-1066 峰值的 82 到 85%。针对 LiteDRAM 路径效率的优化工作正在进行中。
- 时序裕量与面积。 该设计在 133.33 MHz 时序收敛——这是 128 字节端口与两条 DDR3 通道速率匹配的时钟——但裕量很紧(WNS +0.032 ns)。一连串 Vivado 运行的竞赛在持续改善其裕量和面积。解码受限于 DRAM,所以更快的时钟主要有助于预填充。
- 更快的预填充。 四列脉动矩阵单元已进入生产镜像;预填充目前仍受限于矩阵单元的乘法速率。
贡献
欢迎提交 Issue 和 Pull Request,而且大部分工作只需要 Python 和 Verilator,不需要 FPGA。对 ISA、模拟器或 RTL 的修改必须保证 python3 -m pytest -q 通过,性能声明应说明测量方法。
许可证
Apache License 2.0。见 LICENSE。
相似文章
AI 芯片架构
本文概述了各种 AI 芯片架构,如 GPUs、TPUs 和 LPUs,讨论了它们的设计、扩展方法以及在 AI 行业中主要公司的采用情况。
@HongyiJin258:AI 智能体正在成为 GPU 内核工程师。我们正在围绕它们重新思考编译器栈。认识一下 TIRx Harness:一个开……
MLC AI 发布 TIRx Harness,这是一个开源编译器框架,为 AI 智能体提供一个结构化环境,用于探索、调试和优化 GPU 内核。由智能体构建的 Kimi Delta Attention 内核,在前向传播上相比 FlashKDA 实现了 2.94 倍的几何平均加速,在反向传播上相比 FLA 实现了 6.84 倍的加速。
我们推出了两款专为智能体时代打造的专用 TPU。
谷歌宣布推出两款新型专用 TPU 芯片:TPU 8i 和 TPU 8t,分别旨在优化 AI 智能体的推理能力以及大模型的训练效率。
TPU推理外部化全速推进(35分钟阅读)
SemiAnalysis报告称,Google的TPUv7 Ironwood芯片在推理任务中,每美元性能比NVIDIA的B200/B300高出50%,标志着TPU外部化在更广泛行业应用中取得重大进展。
第八代TPU:面向智能体时代的双芯片设计
Google发布第八代TPU:TPU 8t用于训练,TPU 8i用于推理,专为大规模、高能效AI智能体工作负载打造,将于今年晚些时候推出。