AI 现在已经能够自行开发推理硬件

Hacker News Top 工具

摘要

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-230Mint859.0 tok/s52.3 tok/s295.6 tok/s14.5 GB/s(峰值的 85%)
LFM2.5-230M4-bit,int8 head85.8 tok/s82.1 tok/s335.4 tok/s14.1 GB/s(82%)
Qwen3-0.6Bint821.6 tok/s21.3 tok/s92.1 tok/s14.4 GB/s(84%)
Qwen3-0.6B4-bit,int8 head31.3 tok/s30.7 tok/s103.4 tok/s13.9 GB/s(82%)
Qwen3.5-0.8Bint817.6 tok/s16.3 tok/s61.4 tok/s14.5 GB/s(85%)
Qwen3.5-0.8B4-bit,int8 head24.5 tok/s23.3 tok/s66.7 tok/s14.1 GB/s(83%)
Gemma 4 E2B4-bit,int8 head10.57 tok/s10.53 tok/s32.1 tok/s15.6 GB/s(92%)
Gemma 4 E2B4-bit,4-bit head12.14 tok/s12.09 tok/s29.9 tok/s15.5 GB/s(91%)
LFM2-2.6Bint86.05 tok/s6.03 tok/s21.4 tok/s16.1 GB/s(94%)
LFM2-2.6B4-bit,int8 head10.96 tok/s10.93 tok/s20.6 tok/s15.8 GB/s(93%)
SmolLM3-3Bint85.00 tok/s4.99 tok/s21.1 tok/s16.0 GB/s(94%)
SmolLM3-3B4-bit,int8 head8.74 tok/s8.72 tok/s22.8 tok/s15.7 GB/s(92%)
Phi-4-mini (3.8B)int83.99 tok/s3.98 tok/s13.8 tok/s16.0 GB/s(94%)
Phi-4-mini (3.8B)4-bit,int8 head6.56 tok/s6.55 tok/s15.0 tok/s15.8 GB/s(92%)
Qwen3.5-2Bint88.02 tok/s8.00 tok/s38.2 tok/s16.0 GB/s(94%)
Qwen3.5-2B4-bit,int8 head12.09 tok/s12.03 tok/s41.7 tok/s15.8 GB/s(92%)
Qwen3.5-4B4-bit,int8 head5.88 tok/s5.87 tok/s12.9 tok/s15.7 GB/s(92%)
Gemma 4 E4Bint8,4-bit head 且 down 0-23 层为 4-bit3.78 tok/s3.75 tok/s14.8 tok/s16.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检查卡片是否正常工作

从哪里开始阅读

  1. docs/isa.md:指令集。其他一切都建立在它之上。
  2. opentpu/kernels 和 docs/compiler.md:一个内核如何变成指令。
  3. opentpu/isasim.py:模拟器,它就是规格本身。
  4. rtl/:硬件部分,从 rtl/top/otpu_top.sv 开始。
  5. docs/lfm2.md、docs/qwen35.md、docs/llama.md、docs/benchmarks.md:完整模型,以及它们的周期都花在了哪里。
  6. 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 芯片架构

Hacker News Top

本文概述了各种 AI 芯片架构,如 GPUs、TPUs 和 LPUs,讨论了它们的设计、扩展方法以及在 AI 行业中主要公司的采用情况。

@HongyiJin258:AI 智能体正在成为 GPU 内核工程师。我们正在围绕它们重新思考编译器栈。认识一下 TIRx Harness:一个开……

X AI KOLs Timeline

MLC AI 发布 TIRx Harness,这是一个开源编译器框架,为 AI 智能体提供一个结构化环境,用于探索、调试和优化 GPU 内核。由智能体构建的 Kimi Delta Attention 内核,在前向传播上相比 FlashKDA 实现了 2.94 倍的几何平均加速,在反向传播上相比 FLA 实现了 6.84 倍的加速。

TPU推理外部化全速推进(35分钟阅读)

TLDR AI

SemiAnalysis报告称,Google的TPUv7 Ironwood芯片在推理任务中,每美元性能比NVIDIA的B200/B300高出50%,标志着TPU外部化在更广泛行业应用中取得重大进展。