芯片设计这几年被聊得很多,但真正能把“云端 AI 推理加速器”这个东西讲明白的文章不多。最近我把某头部云厂商自研的第二代推理加速器 M 系列从头到尾过了一遍,结合自己参与过的部署项目经验,把它的设计思路、技术取舍、性能表现一点点拆开。这篇就当成一次技术拆解记录,聊清楚“云端 AI 推理加速器”到底在解决什么问题、哪些设计决策最关键、实际落地时又会遇到哪些坑。
适合阅读这篇内容的,主要是三类人:一类是做大模型推理部署的工程师,想知道推理芯片和通用 GPU 的差异在哪;一类是做系统架构设计的同学,想看看专用加速器如何与云端基础设施配合;还有一类是对芯片行业感兴趣、想理解“云厂商为什么会自研芯片”的读者。我不打算堆参数,更想把参数背后的“为什么选这个、为什么不选那个”讲透。
1. 项目核心:云端推理加速器到底要解决什么问题
1.1 为什么自研芯片成了云厂商的必争之地
过去几年,大模型从训练走向推理服务,算力成本的重心也在慢慢转移。训练一个超大模型是一次性的投入,而推理是持续发生的:每来一个请求,模型就要从头到尾算一遍,模型响应快慢、成本高低、扩容难易,全都直接暴露在线上。当请求量上来之后,推理成本会迅速超过训练成本,成为云服务商真正头疼的账单。
采购商用芯片有很现实的问题:生态绑定紧、供货周期长、价格不透明,而且芯片的算力设计未必贴合自家业务负载。就拿在线推理来说,请求可能有长有短,模型可能有大有小,既有高吞吐的离线批处理任务,也有要求毫秒级响应的在线交互任务。通用芯片为了兼容各种场景,做了大量“覆盖面广但针对性不强”的硬件,这在推理场景里就变成了浪费——很多晶体管、很多特性实际上用不上,但该付的电费、该摊的成本一点不少。
自研推理芯片的思路很直接:只做好一件事,就是把大模型推理服务做快做省。芯片设计按自家长尾请求特征来定制,算力矩阵、内存通道、互联拓扑、软件栈全部围绕推理场景做取舍。这种“垂直整合”带来的成本杠杆,在千万级用户规模下非常明显。别看单颗芯片省下的成本有限,一旦部署规模到数万颗,每年省下来的电费和采购成本就是一笔非常可观的钱。
1.2 推理负载的三个特征,直接决定了加速器的设计方向
我刚接触推理芯片时也有过误区,觉得只要把算力堆高就行了,实际上完全不是这样。推理负载有三个特征,每一个都把硬件设计往不同方向推。
第一个特征是矩阵乘法占比很高,但不是全部。Transformer 架构里,线性层、注意力机制的 Query/Key/Value 投影、输出投影,全都可以拆成矩阵乘法,这部分占了绝大部分计算量。但模型里同样有 LayerNorm、激活函数、Softmax、残差连接这些逐元素或归约类操作。这些操作计算量不大,但抹不掉。所以推理加速器不能只做一个纯矩阵运算器,还得留一块能处理杂七杂八操作的可编程单元。
第二个特征是内存访问模式和训练完全不同。训练阶段可以大批量把数据塞进芯片,矩阵分块、数据复用都有很大的优化空间;推理阶段,尤其是自回归解码,每个请求每次只产生一个 token,权重矩阵和 KV Cache 要反复读、反复访存。这就是为什么在推理场景里,内存带宽和内存容量的优先级经常比峰值算力还高。一个简单的估算,就会让你明白这个问题有多严重。
第三个特征是在线推理的负载是“延迟敏感 + 动态波动”的。请求随时进来,长度不确定,三个用户同时进来就要并行服务,没人想要排队等半天。这对硬件的任务调度、多实例并发、抢占和资源隔离能力提出了很高要求。芯片不只是计算快,还得“响应快、抗抖动”。
这三个特征叠在一起,决定了推理加速器和通用 GPU 的设计哲学完全不同:通用 GPU 追求的是“在峰值算力下也能保持高利用率”,而专用推理加速器追求的是“在实际请求分布下能稳定地输出低延迟和高吞吐”。
2. 核心架构拆解:算力、存储、互联的三方博弈
2.1 计算单元配比:矩阵引擎为主,通用单元兜底
拿到 M 系列芯片的架构图,最直观的感受是晶体管预算分配很“偏科”。芯片里面积最大的区域是矩阵乘加单元阵列,针对 INT8、FP16 等低精度矩阵运算做了深度优化。这种设计思路和主流 GPU 完全不同:通用 GPU 会把一部分芯片面积用于各种形态的通用计算单元,而推理专用芯片把绝大部分面积都用于做矩阵运算,只在旁边保留一小块通用向量处理单元,用来跑 LayerNorm、激活函数、注意力分数计算这些非矩阵操作。
这个取舍背后的原因不复杂。矩阵运算占到模型推理计算量的 80% 以上,每多一个晶体管放在矩阵引擎上,理论上就更划算。但问题在于,矩阵引擎只是解决“算得快”,真正决定推理性能的上限还有“喂数据喂得够不够快”。这就是为什么内存子系统在自研推理芯片里的地位极其重要。
2.2 存储层次:大容量内存和高带宽内存怎么选
我拆解这款加速器时,特别注意它的内存配置。设计团队没有一味追求最高带宽的存储方案,而是选择了“大容量 + 适中带宽”的组合策略。这个选择如果只看纸面参数可能觉得不够激进,但放在真实推理场景里,其实很合理。
原因是推理服务必须把模型权重完整地放进芯片内存里。拿一个千亿参数模型来说,如果以 4-bit 量化存储,大概需要 50GB 左右;如果以 8-bit 存储,要 100GB 以上。这还没算上 KV Cache——在线服务时,每个请求的历史 token 都要缓存下来,并发一高,KV Cache 占用的存储空间可能比你想象的大得多。
如果芯片只追求极高的内存带宽但容量不足,那大模型根本装不进去,带宽再高也毫无意义。反过来,容量充足但带宽太低,也会导致 token 生成速度上不去。我算过一笔账:假设模型权重 50GB,用户每秒钟要生成 50 个 token,如果粗略按每生成一个 token 需要读一遍全部权重来估算,那至少需要 2500GB/s 的带宽,才能勉强支撑这个生成速度。虽然这个估算方式在真实系统里会更复杂,但它能帮我们理解一个底层逻辑——推理加速器永远在容量和带宽之间找平衡。M 系列的设计取舍是:容量优先,带宽够用,这样在线服务才能跑得起来。
注意:带宽需求只是一个粗略换算,真实系统中通过算子融合、数据复用、权重预取等方式大幅降低有效访存带宽需求。但“容量决定模型能不能跑,带宽决定 token 生成得快不快”这个底层约束是雷打不动的。
2.3 多芯片互联:从单卡到系统级扩展
单个芯片的容量和算力终究有限,千亿甚至万亿参数模型需要把多颗芯片连起来协同计算。这就引出了推理加速器设计里最容易被低估的部分:芯片互联。
大模型多卡推理最常用的并行方式是张量并行,把权重矩阵切成多份放在不同芯片上,每张卡计算完部分结果后需要把数据合并。这个合并过程的通信量和模型规模强相关,通信一次就是几十甚至上百 GB 的数据在集群里跑来跑去。如果互联带宽不够,芯片算得再快也白搭,整个系统的吞吐会被通信卡住。
M 系列给我的感觉是,它在互联上做了一个务实的选择:机柜内用高速无损互联,保证张量并行时通信不成为瓶颈;机柜之间则通过标准数据中心网络连接,用于处理可以并行调度的场景。这个取舍的出发点很实际——不可能把所有互联成本都堆到最高档次,否则芯片贵得没人用得起。设计团队需要精确计算“多少互联带宽够用”,这是整个系统成本曲线里非常关键的一环。
3. 软件栈:决定加速器能不能“落地干活”的那一层
3.1 编译器与算子融合:把模型翻译成硬件指令
硬件只是加速器的一半,真正决定芯片能不能用、好不好用的,是软件栈。我见过不少芯片项目,参数对标国际一流,但软件生态跟不上,最终只能躺在实验室。M 系列在软件栈上的布局,在我看来才是它真正花大力气的地方。
推理引擎接入加速器的第一层是编译器。模型通常以计算图的形式进来,编译器要做的事情是先做图优化,再映射到硬件指令。图优化里最有价值的是算子融合:把矩阵乘法、加偏置、激活函数、归一化这些可以合并的操作变成一个融合算子。这样做最直接的好处是减少中间结果写回内存的次数。
举个例子,一个 Transformer 解码层里包含数个连续操作,如果不做融合,每算完一步就要把中间结果写回全局内存,下一步再读出来。这种读取-写入-读取的循环会消耗大量显存带宽,而显存带宽恰恰是推理任务最稀缺的资源。做了融合之后,中间数据直接在片上缓存里流转,整体访存请求量能降好几倍。懂推理系统的人都知道,这比单纯把计算频率拉高有效得多。
编译器还要处理数据布局转换的问题。矩阵乘法喜欢按特定维度排列的数据,注意力模块又喜欢另一种排列方式,算子之间数据布局不一致时,编译器需要插入转换操作。转换操作本身也消耗带宽和延迟,所以高效编译器的目标就是尽量减少这种“反复横跳”,找到全局最优的数据排布方案。
3.2 量化与混合精度:用更低的精度换取更快的速度
大模型推理场景里,量化几乎是从硬件到算法全链路协同的事。M 系列在硬件层面对低精度支持得特别彻底,这不只是“能跑 INT8”,而是从矩阵引擎到数据通路都为低精度做了专门优化。
模型量化有两个层次,权重和激活。最简单的方案是权重用 8-bit、激活也用 8-bit,业内叫 W8A8;更激进一点,权重压到 4-bit,激活保持 8-bit 或 16-bit,叫 W4A8 或 W4A16。4-bit 权重的好处是模型内存占用直接减半,相同容量能装更大的模型;缺点是量化误差变大,对某些敏感层来说精度损失明显。
实际部署中,量化策略不会一刀切。有些层对量化敏感,就保留 FP16;有些不敏感的层,比如大部分线性层,可以压到 8-bit 甚至 4-bit。M 系列支持的混合精度执行方式,就是同一时间不同层用不同精度计算。这块的难点是精度切换不能太频繁,否则切换本身的开销会把省下来的性能吃掉。
我自己的体会是,量化策略和硬件设计必须一起做。如果硬件对低精度只是“兼容”而不是“原生支持”,那收益非常有限,可能出现算快了但精度崩了,或者精度保住了但速度没上去的尴尬情况。
3.3 在线推理调度:连续批处理与 KV Cache 管理
单纯把模型跑得快还不够,在线推理服务更讲究“把芯片喂饱”。用户请求不是排着队一个一个来的,而是随时涌入,长短不一,完成时间也不同。如果用传统批处理方式,一批请求必须全部结束后才能处理下一批,芯片利用率会非常难看。
所以现代推理系统普遍采用连续批处理:每一个解码步骤完成后,有请求结束就立刻插入新请求,让芯片始终处于满负荷计算状态。这个机制对推理加速器提出了额外的硬件要求——任务切换要快,多个请求的并发状态要能高效保存和恢复。M 系列在设计时就考虑了多实例并发支持,这比“单请求跑得快”的意义大得多。
KV Cache 管理也是在线推理的关键。每个请求的注意力缓存大小随序列长度动态变化,如果预先给每个请求分配固定大小的显存空间,长序列时会不够用,短序列时又会浪费。现在行业里比较成熟的做法是对 KV Cache 做分页式动态管理,按需分配页面,不够了再追加。这需要芯片内存管理机制配合,对地址转换、内存碎片处理都要有较好的支持。
更进一步,有些推理系统把请求分成两个阶段:预填充阶段要处理大量输入 token 并生成第一个输出 token,解码阶段则逐个生成后续 token。这两个阶段对硬件的资源需求完全不同,预填充是计算密集型,解码是访存密集型。M 系列这种专用加速器可以在架构层面针对这两个阶段分别优化,这是通用芯片比较难做到的。
4. 性能指标拆解:从纸面算力到真实服务能力
4.1 峰值算力与真实吞吐的巨大落差
看任何推理加速器的参数表,都会看到一组很漂亮的峰值算力数据,比如多少 Tops 的 INT8 算力、多少 TFLOPS 的 FP16 算力。但真实部署时,这些峰值数据几乎没有可能达到。这是我踩过比较深的一个坑:第一次拿到某款加速器时,看它峰值算力比上一代翻了一倍,结果跑真实模型时吞吐量只提升了 30%,当时完全想不通问题出在哪。
原因在于峰值算力的达成条件太苛刻——所有计算单元全速运转,数据永远在缓冲区等待,没有任何内存访问瓶颈。但真实推理负载里,内存访问、算子切换、调度开销、KV Cache 动态分配、并发请求调度这些全都存在,计算单元经常处于等待数据的状态,利用率能到 50% 就已经算不错了。
所以我评估一款推理加速器的真实能力时,不会只看 TOPS,而是看“端到端吞吐量”。我会固定一组输入输出长度都不同的请求混合负载,分别测吞吐曲线和延迟分布,观察随着并发数增加,吞吐能爬到多少、延迟是否会恶化。这个测试方式比任何官方宣传数据都可靠。
| 指标 | 纸面数据 | 真实负载实测 | 实际利用率 |
|---|---|---|---|
| 峰值 INT8 算力 | 800 TOPS | 420 TOPS 有效吞吐 | 约 52% |
| 内存带宽利用率 | 理论峰值 60% | 有效带宽 35% | 网络拓扑限制 |
| 单 Token 延迟 | 指标优秀 | P50 稍差 | 调度波动显著 |
上面这组数据是我整理出来的典型对比,不是某款芯片的精确参数,但趋势很有代表性——实际利用率基本都在一半上下。这说明推理加速器真正的瓶颈已经不是计算单元,而是数据搬运和协同调度。
4.2 在线推理核心指标:TTFT 和 TPOT
在线推理服务有两个核心指标:TTFT(Time to First Token,首个 token 延迟)和 TPOT(Time per Output Token,每生成一个 token 的平均耗时)。这两个指标对用户体感的决定性作用不同,对硬件资源的要求也不一样。
TTFT 主要受预填充阶段影响。用户输入一大段提示词后,系统需要把整段输入编码成上下文,这个过程计算量大,如果处理得慢,用户会觉得“转圈转了半分钟”。TPOT 则影响后续输出的流畅度,每个 token 生成快慢由解码阶段决定,Token 一个一个蹦出来,如果太慢,用户会明显感到“像打一个字卡一下”。
值得注意的是,这两个指标对硬件需求的侧重是矛盾的。预填充阶段需要高算力来快速处理大批量输入;解码阶段则受内存带宽限制——每生成一个 token 都要把权重和 KV Cache 读一遍,算得再快也没用。所以有些推理加速器设计上做了 P/D 分离,用不同实例分别跑预填充和解码阶段。M 系列在架构上对这个场景做了适配,这也是它自称面向云端在线推理为主的原因——这种场景的用户体感比离线批处理敏感得多。
4.3 能效与成本:同样功率下能出多少 token
大模型推理的成本模型里,芯片价格只是一部分,更重的部分是功耗和时间。数据中心机柜的供电和散热容量是固定的,一块芯片功耗越高,能部署的数量越少。云厂商算账时看的是“每瓦每秒能输出多少 token”,这个指标比单纯的“每芯片每秒多少 token”更本质。
推理加速器和通用 GPU 在能效比上的差距是它自研价值的一部分。通用 GPU 为训练场景设计,晶体管面积和功耗开销都高于实际推理所需。专用芯片可以把算力精度、内存通道、互联带宽都按推理特征定制,在同样功率下输出更多 token。省下来的电费,在数万颗芯片规模下累积起来,是改变成本结构的关键变量。
我测算过一个模拟场景:某在线推理服务每天处理 1 亿次请求,如果用能效比翻倍的芯片替代原来的方案,单日电力成本直接下降接近一半,带来的年度节省非常可观。这也是为什么自研推理芯片哪怕流片成本极高,云厂商依然愿意持续投入——它改变的不只是技术能力,更是商业模型的根基。
5. 设计取舍复盘:哪些选择是聪明的,哪些是妥协
5.1 不追求单点极致,用系统能力补位
拆完 M 系列的整体设计,一个比较明确的结论是:它没有盲目追求单卡算力或单卡带宽的极致,而是更强调系统层面的能力整合。单看某颗芯片的纸面指标,可能不如市面上最顶级的通用计算芯片,但它的目标不是跑分,而是在大规模云环境里稳定地跑高吞吐在线推理。
这个取舍对我很有启发。做系统的人容易陷入“单点最优”思维,觉得只要某一项指标够极致,系统就一定更快。但真实系统是一个木桶,任何一块短板都会拖住全局。自研芯片的优势恰恰在于可以对短板进行定制——不同业务的负载特征不同,芯片可以针对自家主力模型做优化。
这就像修一套供水系统,与其买一个超大功率的水泵,不如根据实际管线设计几个中等功率水泵,再优化管道减少水阻,整体效率反而更高。推理加速器的设计逻辑也是这个套路:不让任何一个环节成为瓶颈,比让某一个环节特别快更重要。
5.2 通用性收缩,面向特定负载深度优化
自研推理芯片一定会牺牲一部分通用性。M 系列的设计里看不到图形渲染单元,也没有为科学计算做的双精度浮点支持,这些晶体管全部省下来,换成了矩阵运算、内存通路和互联资源。
通用性收缩带来的风险是模型结构一旦发生变化,旧有优化可能失效。比如某一天新模型把注意力算子的矩阵结构改了,原来为旧结构写的算子库就得重写。为了对冲这个风险,M 系列在通用向量单元上做了一定程度的可编程性保留,同时维护了一个比较灵活的算子库。这种“偏科但不呆板”的设计思路,是它在可用性和适应性之间的平衡点。
对很多开发者来说,这意味着要重新学习一套编程接口和性能调优工具链,这在初期肯定是有学习成本的。但从长远看,如果专用加速器的性价比优势足够明显,这些成本是会逐渐摊薄的。
5.3 云原生与系统集成:加速器从来不是孤立存在的
真正让我觉得“这款芯片考虑得比较全”的地方,是它对云原生环境的适配。自研推理芯片不是一块独立的板卡,而是要融入整个云基础设施——加速器如何被调度、如何做故障切换、如何做多租户隔离,这些不在芯片 Datasheet 里,但难度一点不比硬件设计低。
云厂商自研芯片有一个天然优势,就是它不必去猜客户的部署环境。自家的实例规格、自己的网络拓扑、自己的调度平台,芯片从第一天开始就可以围绕这些体系来设计。传统芯片厂商交付产品时,面向的是五花八门的外部环境,很难做到这种程度的软硬件协同优化。
这种“云原生”设计思路体现在很多细节里,比如故障检测和上报机制、安全启动链路、固件热升级支持,甚至功耗和散热的动态管理策略。如果说架构设计决定了芯片的性能上限,那么这些系统集成的细节就决定了它能不能在真实业务环境里稳定达标。
6. 常见认知误区与实测经验
6.1 误区一:TOPS 高就代表快
初看推理芯片时,最容易被纸面数据带偏。TOPS 高只代表理论计算能力,真实瓶颈往往在内存带宽和访存效率上。我测试过不同的负载,同样是 8-bit 量化,矩阵占比高的网络可以达到较高利用率;一旦遇到注意力占比高的模型,由于内存访问模式分散,利用率会明显下降。评估推理芯片,务必用自己真实业务的模型和负载来做验证,不要拿厂商提供的 benchmark 和样例模型当结论。
6.2 误区二:显存容量只关乎模型能不能装下
显存容量的影响不只在“装不装得下模型”,还影响并发度和性能稳定性。大模型在线服务中,KV Cache 会占用大量显存;并发请求越多,KV Cache 占用越高。如果显存不足,系统只能降低并发度或牺牲上下文长度,导致整机吞吐下降。选型时不能只看参数量和权重占用,还要考虑在线服务实际需要的 KV Cache 余量。
6.3 误区三:硬件性能决定一切
很多人在评估加速器时会忽略软件栈成熟度,但实际上,算子库覆盖是否齐全、编译器优化是否到位、调试工具是否顺手,极大影响落地周期。我见过有的硬件指标很好看,但算子库缺关键实现,开发团队要自己汇编调优,效率极其低下。软件栈成熟度短时间很难补齐,这是选型时优先要确认的事项。
6.4 实测小技巧:吞吐量测试的负载设计
做加速器压测时,不要只用固定长度输入。真实用户请求的长度分布通常比较偏——短请求占多数,但长请求也会偶发出现。合理的测试负载要混合不同输入长度、不同输出长度、不同并发度,并分别追踪 P50 和 P99 延迟。我习惯的做法是设置 30% 短输入、50% 中等输入、20% 长输入的混合比例,这样测出来的数据更能反映真实用户体感。
其次是流量动态性。在线推理流量存在突刺,比如某个时间点流量翻倍,加速器能否保持延迟稳定,比单纯最高吞吐量更重要。压测时可以周期性地制造流量高峰,观察延迟分位数是否出现明显恶化。芯片的调度机制、内存分配策略、频率调节策略都会在这个场景下暴露问题。
6.5 避坑提醒:不要忽略散热和供电的约束
部署推理加速器时,功耗和散热比参数指标更先落地。芯片标称性能通常是在温度理想的条件下测出来的,如果机柜散热能力不足,芯片会降频,性能和延迟都会跟着恶化。我参与部署模拟项目 X 时,就遇到过机柜供电容量不足导致节点无法全部上电的问题,最终只能把部分节点分散到不同机柜。选型和规划时,从“整机柜功耗”而不是“单卡功耗”出发,是比较稳妥的做法。
6.6 分阶段推进,让加速器和业务逐步磨合
如果团队准备引入推理加速器,我的建议是分阶段推进,不要一刀切切换。第一阶段选择部分非核心业务或低延迟敏感场景做试点,重点验证算子覆盖率、兼容性和稳定性;第二阶段解决性能调优、量化策略、KV Cache 管理这些环节;第三阶段再把核心在线推理业务批量迁移,同时保留一套原有方案作为兜底。
这个节奏能帮你把风险控制在可接受的范围内。专用推理加速器确实能带来性能和成本的双重优化,但前提是软件栈打磨到位、业务场景匹配。一次性大切换一旦出现问题,排查和回退的代价远高于小步快跑的迭代。
拆完这款加速器,我最大的体会是:芯片设计里,最难的其实不是堆晶体管,而是设计者在每一个路口都做对取舍。算力、带宽、容量、互联、软件、成本,每一个维度都是互相牵制的。单看每个选择可能都有疑问,但把它放进真实的业务场景里,就能明白它的合理性。那类只盯着纸面参数的做法,在专用芯片领域基本行不通。我自己踩过几次只看峰值算力的坑之后,现在看任何推理硬件,第一反应都是问一句:真实请求分布下,它能稳定跑出多少有效吞吐?