群发资讯网

推理芯片系列文章五:一颗推理芯片里到底有什么

上一篇讲的是 token 工厂:谁接单、谁排队、谁先读上下文、谁一个字一个字往外吐——正式说法是调度、KV Cache、Prefill、Decode 和多卡通信。那些压力是从服务端往芯片上压的。这一篇把镜头推进芯片内部,看它们最后落在哪些硬件单元上。

推理芯片最显眼的数字通常是 TOPS 或 FLOPS。可以把它理解成发动机在理想条件下能转多快。真开上路,还得看油路、变速箱、散热和道路:权重能不能及时送到,KV 放不放得下,Softmax 和 MoE 路由会不会拖慢,编译器能不能把模型拆成硬件吃得下的块。

一颗推理芯片不是一片矩阵乘法器。它是一座不停处理 token 的小工厂:有人算,有人临时存,有人搬数据,有人排队。任何一环堵住,用户手机上的速度和账单都会变。

一、先拆一层 Transformer

图|Transformer 算子怎样落到硬件:矩阵单元只负责其中一部分

一层 Transformer 写在纸上是一堆公式,落到芯片上就是几类活。大矩阵负责主计算,Attention 负责翻历史上下文,Norm 和激活函数把数值整理干净,MoE 路由把 token 分给不同专家。名字都叫“模型计算”,吃的硬件资源完全不一样。

大矩阵。Q、K、V 投影、Attention 输出投影、MLP 和 MoE 专家,主要由矩阵乘法组成。规则、规模大,适合交给高密度矩阵引擎,厂商也习惯把最多晶体管和最亮的峰值参数放在这里。

一层输入张量记作 X[B,S,H],权重 W[H,O],投影本质是把 B×S 行输入乘一遍权重。Prefill 的 S 可能是几千,甚至更长,矩阵有足够多的行;Decode 每条序列通常只有一个新 token,等于 S=1,只能靠并发 B 把矩阵撑宽。同一套矩阵单元遇上这两种形状,利用率可以差出一个量级。所以架构设计得拿真实的 B、S、H、O 分布去做 trace,只拿一个方阵跑峰值,等于没测。

Attention。它不止两次矩阵乘。缩放、掩码、Softmax、数据重排、KV Cache 读写都在里面。Prefill 时 Q、K、V 盖住整段输入;Decode 时每轮只有一个新 Q,却要把全部历史 K 和 V 读一遍。两阶段的矩阵形状和数据复用是两回事。

向量和标量。RMSNorm、LayerNorm、激活、残差、位置编码、量化与反量化,更吃向量单元。采样、停止条件、索引、分支和一部分控制逻辑,更适合标量核或固件。

MoE 路由。router 先给每个 token 选专家,再把 token 分发到对应计算单元或另一块芯片。理论上只激活少数专家能省 FLOPs,实际还要做 top-k、排序、scatter、all-to-all、专家计算和 combine。负载一不均,部分专家排队,其他专家闲着。

一颗只擅长规则大矩阵、不擅长数据重排和跨片通信的芯片,做 MoE 推理不一定称手。

二、先判断在等算还是在等数据

图|Roofline 先判断算力墙还是带宽墙

Roofline 翻成中文是屋顶线。它不问芯片有多少 TOPS,先问一句更接近现场的话:这件活是在等计算,还是在等数据搬过来。

天花板有两块。一块是计算峰值,乘法器一秒最多做多少活;一块是带宽,数据从 HBM 搬进来最快能有多快。真实速度只能取两者里低的那个。算力再高,数据送不过来,乘法器就在那儿等。

所以评估架构,先算算术强度:

算术强度 = 完成的计算量 ÷ 从内存搬运的字节数

意思是每搬一字节,能顺手做多少次计算。Roofline 给出的上界这样读:

可达到性能 ≤ min(计算峰值,算术强度 × 可持续内存带宽)

Prefill 容易靠近计算上限。它一次处理多个 token,权重载入后能在更多 token 上复用,矩阵形状也大,算术强度高。batch 和序列足够大时,矩阵单元先成为限制。

小批量 Decode 容易撞带宽墙。每轮读一大堆权重,只出几个 token,复用率低,算术强度掉下来。这时候继续加矩阵峰值、不加 HBM 带宽,新增的算力大部分时间在等数据。

拿 70B 稠密模型算一笔。4 bit 权重,光权重约 35 GB;可持续 HBM 带宽按 3 TB/s 算。每轮 Decode 都要读一遍全部权重,单并发、忽略 KV 和其他开销时:

3,000 GB/s ÷ 35 GB ≈ 85.7 token/s

一轮同时给 16 条序列出 token,同一遍权重读取摊到 16 个 token 上,理想上界才到约 1,371 token/s。KV 读写、内核空洞、量化元数据、跨卡通信、采样,还要再扣。

这个例子不预测任何一张卡的成绩,它只说明一件事:矩阵 TOPS 根本没进这条一阶上界。小批量 Decode 撞上带宽墙以后,多加乘法器不会自动多出 token。

Roofline 也不是最终性能。它没算内核启动、布局转换、NoC 拥塞、同步、分支、跨卡通信和软件空洞。但它能先排掉一类错误:已经受带宽限制的负载,不能按新增 TOPS 的比例去推 token 增长。

三、矩阵单元的功夫在复用

图|一个 tile 在芯片里怎样走

矩阵单元的效率来自复用。数据搬进阵列,最好多用几次,而不是算一下就扔。阵列形状、tile 大小、累加路径、数据流,决定同一堆乘法器到底能不能吃满。

脉动阵列和 Tensor Core 这类结构,把大量乘加单元排成规则阵列,权重或激活沿着阵列流动,在多个处理单元之间重复使用。目的不只是并行,更主要是别每次运算都从远端存储重新取数。

阵列形状得匹配矩阵。能整齐切分的矩阵,利用率高;矩阵太窄、维度不整齐、动态形状多,边缘单元大量空着。Decode 的小矩阵、MoE 的小专家 batch、各种长尾算子,都在往下拉阵列利用率。

累加比乘法难伺候。低精度乘法密度高,但部分和通常要用更高精度累加,还要处理缩放因子、溢出、舍入和异常值。参数表写“支持 FP8”不够用,得追问输入、权重、激活、通信、累加分别是什么格式。

一个 tile 在芯片里是这么走的:编译器把大矩阵切成 M×K 和 K×N 的小块,DMA 把输入块和权重块搬进片上 SRAM,地址生成器按阵列要的次序送数,阵列算出的部分和留在寄存器或累加 SRAM,走完 K 维再做缩放、bias、激活,写回。

K 太大,部分和要跨多轮累加;M 或 N 除不尽 tile,边缘 tile 就有 padding 和空的 lane;SRAM 装不下双缓冲,加载和计算就没法重叠。阵列尺寸、SRAM 容量、端口数、DMA 带宽,是一组联立约束,改一个牵一串。

Google 第一代 TPU 那篇论文常被引用,很少有人真去记 65,536 个 8 bit MAC。它讲清的是另一件事:阵列再大,也要有足够近的片上存储和足够顺的数据流来喂它。

这也是编译器得早早进架构定义的原因。硬件团队只说“SRAM 很大、TOPS 很高”,编译器仍然不知道哪些 tile 能留片上、哪些地址能合并、哪些融合会破坏双缓冲。更靠谱的做法是把真实模型运行记录拆成约束:常见矩阵形状、KV 长度、MoE 专家负载、可接受的 padding 比例、每层通信量、允许的数值格式。

最后落到 RTL 的不是一句“支持 Transformer”,是一堆很具体的东西:队列要多深,DMA 有几条通道,SRAM 分几个 bank,NoC 每个端点要多少带宽,指令语义怎么暴露给编译器。

四、SRAM 不是越大越好

图|数据离计算越远,代价越高

数据离计算越远,访问越慢,每字节能耗越高。一颗芯片的存储大致这么排:寄存器 → 本地 SRAM → 共享 SRAM 或 L2 → HBM → 主机内存 → 远端存储。

SRAM 是离计算最近的临时工作台,能放当前 tile、部分和、热点权重、激活、KV 片段。编译器靠分块让数据在片上多用几次,再写回 HBM。

它也很贵。单位容量占的芯片面积远大于 DRAM,还要摊漏电、布线和 bank 组织的成本。面积给了 SRAM,矩阵单元就少一块。所以架构设计不是“SRAM 越大越好”,而是决定哪几类数据值得留在片上、留多久。

双缓冲是用来藏等待的:一块在算,另一块预取下一批。加载时间不超过计算时间,搬运就能被盖住一部分。带宽太低、tile 太大、访问不连续,下一批还是来不及,计算单元就停下来等。

SRAM 也不是一整块均匀存储。它分成多个 bank 并行读写,多个访问落到同一个 bank 就冲突;端口不够时,总容量够也取不出足够数据。编译器的张量布局、步长、padding,必须配合 bank 数和地址映射来定。

FlashAttention 的思路可以说得很朴素:别把一张巨大的 Attention 中间表写回 HBM 再读回来,切成小块,在 SRAM 里边算边处理,少走远路。它没有把注意力近似掉,只是把数据搬运次数降下来。

五、NoC 是片内的路网

矩阵单元、SRAM、缓存、HBM 控制器、I/O 之间,要靠片上网络连起来。道路总宽度当然重要,更关键的是高峰期每个路口会不会堵,某个端点能不能拿到它需要的带宽。

NoC 扛的不只是点对点传输:权重和激活广播、部分和归约、tile 搬运、MoE token 分发、内存请求和返回,全走这条路。

拓扑各有代价。crossbar 路径直接,面积和功耗随端点数快速涨;ring 简单,远距离要多跳;mesh 好扩展,但会出热点和路由拥塞;分层 fabric 把局部和全局通信分开,控制复杂度也跟着上去。

总带宽不等于每个端点可用的带宽。多个计算簇同时访同一颗 HBM 控制器、同一个 SRAM bank、同一个路由节点,链路就要争。参数表上那个 NoC 总带宽,不能当成任意算子的持续带宽。

NoC 还得管流量分类和死锁。权重广播、KV 读取、归约结果、控制消息,重要性并不一样。大包长期占着链路,延迟敏感的同步消息会被饿死。工程上用虚拟通道、优先级、信用式流控、无死锁路由,把不同依赖隔开。

Eyeriss 是个卷积加速器,但它给了推理芯片一个通用提醒:数据怎么复用,网络就得怎么配合。Transformer 换了算子,这条原则没变。

六、低精度不是把比特砍小

权重、激活、KV Cache 和通信格式,可能需要不同精度;模型质量要能过回归;硬件、编译器、算子要真的支持。纸面上省了比特,线上未必省成本。

权重可以用 INT4,激活用 FP8,累加用 FP16 或 FP32,KV 再用另一种量化格式。每种都要缩放、校准、控误差。格式之间转换没有融合,读写和延迟一起涨。

硬件支持不等于模型能用。有些层、异常值、任务对精度敏感。软件得决定哪些算子降精度、哪些保高精度,然后做完整回归。关键算子大多回退高精度,低精度那个峰值就兑现不出来。

MoE 还要多看一层:专家并行传输的 token 激活量不量化、什么时候反量化,同时影响网络带宽、算力和精度。

缩放粒度也是变量。每张量一个 scale 便宜,但容易被异常值拖累;每通道、每组、更细的粒度能降误差,元数据、访存和转换跟着涨。硬件只在某种 tile 上支持低精度,真实矩阵尺寸对不上,理论吞吐一样落不了地。

DeepSeek-V3 报告里有个细节值得记:低精度不是把所有数字统一压小。输入、缩放、累加、通信各有各的处理方式,还要让通信和计算尽量重叠。芯片只标一个“FP8 TOPS”,读者仍然不知道真实模型能跑成什么样。

七、模型怎样变成芯片指令

图|模型怎样变成芯片指令:软件在架构定义时就必须进入

硬件不认 PyTorch。完整链路通常是:捕获模型图 → 高层算子优化 → 分解与融合 → 并行切分 → 张量布局 → 内存规划 → 中低层 IR → 指令选择与调度 → 运行时执行。

融合是把矩阵、bias、激活、量化塞进一个内核,少几次写回 HBM。布局是同一个张量换排列,换的是连续访问、向量化、bank conflict 和通信,转换本身也要付钱。自动调优是因为不同形状要不同 tile、线程和流水,只能靠搜索。

还有一类活静态化不了:采样、分支、动态 batch、MoE 路由。运行时必须和编译结果配合,图外的动态逻辑只能靠固件和调度顶住。

所以软件生态不是芯片做完再补。编译器在架构定义的时候,就得知道阵列、SRAM、NoC、DMA 和互联怎么工作。

从模型 trace 到 RTL,至少六步:建立工作负载模型,记下算子形状、数据类型、依赖、访存和 SLA;选数据流与并行方式,定阵列、向量单元、SRAM、NoC、HBM 端口的比例;写周期级或事务级性能模型,查每个队列、链路、存储 bank 会不会堵;定义 ISA、命令队列、DMA 描述符、中断、虚拟内存和错误上报;用 SystemVerilog 这类语言实现 RTL,靠形式验证、仿真、仿真加速和 FPGA 原型铺功能与并发角落;综合、时序收敛、功耗分析之后,回头调流水级、缓存深度和物理位置。

这条链会往回迭代。后端发现一条全局总线在目标频率下收敛不了,微架构就得改成分层网络;编译器填不满一个超大阵列,硬件也可能改成几个较小的阵列。软硬协同发生在这些可测的接口和反馈里,不在 PPT 上。

顺着这个逻辑,还能看清单个架构的取舍:固定功能电路能效高,但模型变得快。几年前不重要的一类算子,可能因为新的 Attention、MoE、投机解码或者状态空间模型,突然进了关键路径。现代推理芯片一般是组合拳:高密度矩阵引擎、可编程向量单元、标量控制核、DMA 与地址生成器、压缩解压或集体通信引擎、固件安全与功耗管理。

专用化程度越高,稳定负载上的能效潜力越大;模型一变,失配的风险也越大。这笔账没有标准答案,取决于客户多久换一次模型。

八、算不出 TOPS 的那部分面积

芯片上有一大块面积,不直接算乘法,却决定它能不能交给客户长期跑。

RAS 说的是可靠性、可用性、可维护性。出错的时候要能发现、能隔离、能告诉运维系统,不能整台服务器悄悄算错。

ECC 是纠错码。内存和缓存偶尔会有 bit 翻转,小错误尽量纠回来,大错误报出来。推理服务里,一个错误不止影响一张卡,可能影响一批用户请求。

虚拟化和安全。云厂商不会把一张卡永远独占给一个用户,多租户共享时,权重、缓存、请求、日志都要隔开。这些模块不涨 TOPS,但决定客户敢不敢把模型和数据放上去。安全启动、密钥管理、固件签名、远程证明,都算这类能力。

DFT 是“为了测试而设计”。芯片内部太复杂,工厂没法靠肉眼找坏点,扫描链、自测试电路、调试接口要提前埋进去。BIST 是芯片自己做体检,JTAG 是常见的测试入口,冗余设计是部分单元有缺陷时拿备用资源顶上。缺这些,实验室能点亮,量产稳不住。

功耗和热管理。推理芯片不是跑一次 benchmark 就结束,它要在机房里连续跑几个月,温度和电压一直在变。传感器盯温度和电压,时钟门控让闲置区域少耗电,电压频率调节在负载变化时调速。降频听着不好,总比宕机好。真正的生产能力,是在散热上限内持续输出。

九、怎么判断一款架构适不适合推理

别只问峰值算力多少。下面九项,每一项都对应线上真实的成本。

核对项

真正要问出来的东西

目标负载

模型版本、输入输出长度分布、并发上限、SLA 各自是什么

两阶段瓶颈

Prefill 和 Decode 撞的是计算墙还是带宽墙

矩阵与带宽配比

峰值算力与可持续 HBM 带宽是不是同一个量级

SRAM 分配

哪几类数据留片上、复用几次、装不装得下双缓冲

非矩阵算子

Softmax、Norm、路由、采样跑在哪个单元上

MoE 与长上下文

专家并行的通信量、长上下文的 KV 与互联接不接得住

编译器覆盖

真实模型里多少算子走原生路径、多少掉回慢路径

测试口径

精度、SLA、软件版本、长度分布是否固定并公开

持续输出

功耗、温度、故障状态下会不会掉速、会不会算错

还要按算子要一份时间占比。GEMM 只占 45%,剩下的时间在 Attention、Norm、路由、布局转换和通信上,那矩阵引擎快一倍,端到端也快不到两倍。Amdahl 在这里很朴素:没被加速的部分,会变成新的上限。

十、结论

推理芯片架构的核心不是往里塞更多乘法器,是让有限的面积、功耗和带宽围绕目标负载配好比例。

矩阵单元负责算,SRAM 负责复用,NoC 负责搬,HBM 负责容量,编译器负责把模型变成可执行的数据流,RAS 和测试单元负责让它进得了生产。

一颗芯片的账面参数,只说明它在理想条件下能跑多快。真实负载压上去以后,最先堵住的那一环,才决定它值多少钱。