上个月我接到一个挺实际的活儿:公司内部那个基于开源模型搭建的LLM问答服务,高峰期延迟从800毫秒一路飙到两秒多,用户已经到后台骂过一轮了。按老思路,加两张GPU卡最省事,但预算审批卡得很严,领导直接问我:有没有比堆GPU更“聪明”的方案?市面上那些标着“AI硬件加速器”的设备和板卡,到底能不能解决问题?
顺着这个问题,我把近期关于LLM硬件加速的路线都过了一遍,也实际测了几种方案。这里先给个结论:AI硬件加速器从来不是一个单一产品,而是一类针对性极强的协处理器和优化路径的集合,包括GPU、NPU、定制ASIC,也包括框架层面的量化、稀疏化、KV Cache优化。真正要落地,你得先明白LLM的计算和访存特性,再决定买什么卡、调什么参、配什么推理引擎。这篇文章就把我从选型到测试的完整思路写下来,给做AI基础设施、运维和算法工程的同学一个参考。
1. 一次扩容评估引发的思考:AI硬件加速器不是一个名词,是一族方案
1.1 问题的起点:加GPU为什么不一定划算
最开始我也是按老办法算了一次账:公司现有4张A系列推理卡,64并发时显存已经顶到80%以上,如果要把并发翻到128,显存和算力都得加,再加4张卡,硬件成本大概翻一倍,功耗也上来接近一倍。问题是,这台机器上跑的模型权重才不到10GB,但由于每个用户的上下文长度不一样,KV Cache的显存占用是动态增长的,一个1万token的会话,KV Cache占用的显存可能比模型本身还大。继续加通用GPU,花钱买的是通用算力和巨大显存,其中相当一部分是被缓存结构吃掉的,根本没有砸在计算上。
这也是我开始研究专用加速器的原因。市面上的AI硬件加速器,从形态上看有PCIe卡、M.2模块、整机服务器,从芯片类型上看有GPU、NPU、DPU,本质其实都是为某个“计算模式”做定制优化。LLM这类负载的计算模式很特殊,它的瓶颈往往不在峰值算力,而在访问带宽、显存容量、数据搬移效率上。通用GPU那种“单芯片堆很多CUDA核心”的设计,在跑纯稠密矩阵乘的时候效率高,但一遇到LLM这种“权重吃显存、缓存吃带宽”的负载,性价比就开始往下走。
1.2 为什么“多买两张显卡”常常不是最优解
为了把这件事说透,我列了一张对比表,把我评估过的几类硬件方向列在一起:
| 方案类型 | 典型代表 | 核心优势 | 主要局限 |
|---|---|---|---|
| 通用GPU | 数据中心的训练/推理卡 | 生态成熟,软件栈齐全 | 功耗高,价格高,显存利用率受KV Cache影响大 |
| 专用推理卡 | 各家推理加速卡、NPU | 单位功耗算力高,显存带宽大 | 大模型适配需要专用编译和算子库 |
| FPGA | 可重构加速卡 | 灵活,适合定制量化位宽 | 开发成本高,片上存储通常偏小,运行效率不如ASIC |
| 端侧NPU | 手机、边缘盒子里的AI单元 | 低功耗,数据不出端 | 算力有限,大模型需要极深入压缩 |
为什么我一开始没直接换专用推理卡?因为LLM服务不是单跑一个算子,它包含tokenizer、attention计算、Feed-Forward网络、采样器、KV Cache读写和调度逻辑。专用推理卡的算子库如果跟不上,你就算买了,也会发现很多算子是CPU fallback,跑起来比GPU还糟心。这里就涉及一个关键认知:AI硬件加速器的价值,不是由芯片峰值性能单方面决定的,而是由“芯片+编译栈+推理引擎”这个整体决定的。这也是文章后面重点展开的内容。
1.3 把硬件的价值拆开看:算力、显存、带宽、互联
在和多家加速器厂商的工程师聊过之后,我发现他们评估一个LLM负载能不能跑得动,几乎都围绕四个指标:
- 峰值算力(TOPS/TFLOPS):决定理论计算上限,但对LLM来说往往不是最稀缺的资源。
- 显存容量(GB):决定能不能装下模型权重和KV Cache,容量不够时只有两条路,换更大的卡或者做量化。
- 显存带宽(GB/s):这是LLM推理里最关键的指标,权重和KV Cache在一次次推理中被反复读取,带宽直接卡住吞吐。
- 片间互联带宽(GB/s):模型并行或专家并行时,数据要在多颗芯片之间交换,互联带宽不够,加卡反而更慢。
四个指标不是独立的。比如你选了一个峰值算力很高的加速器,但如果显存只有64GB、带宽也一般,跑一个70B模型时要么塞不下,要么每次读取权重都耗时巨大,实际性能会很难看。
2. 算力账、访存账和KV Cache账:LLM负载为什么让人睡不着
2.1 先拆解一次Transformer前向到底在算什么
任何讨论LLM硬件的文章都绕不开Transformer。但我见过的资料大多讲得太粗,我还是用自己理解的方式拆一下:一次前向过程,主要两部分。
第一部分是Self-Attention(自注意力),做的事情简单说就是三个矩阵乘——查询和键算相似度,然后对值做加权。如果把序列长度写为s,模型维度写为d,这部分计算量大约正比于s²d,注意那个平方。序列越长,计算量增长得越快。
第二部分是Feed-Forward Network(前馈网络),它对每个token独立做两次大矩阵乘,计算量正比于sd²,和序列长度是线性关系。2000token的上下文时,前馈网络的计算量通常高于注意力;等上下文冲到8000、16000,注意力部分会迅速追平甚至反超。
硬件加速器对待这两部分的态度完全不同。前馈网络是典型的稠密矩阵乘,GPU爱死这种负载了,只要矩阵够大,效率能拉到80%以上。而注意力的核心是“小矩阵在内存里来回搬”,单次计算量小,但数据搬运频繁,这时候显存带宽而不是峰值算力在起作用。
2.2 prefill和decode:两个阶段的瓶颈不一样
LLM推理还有一个特别容易被忽视的特征——它不是一个连续等量计算的流水线,而是分成两个截然不同的阶段。
prefill(预填充):你输入一整段Prompt,模型一次把整段token的中间状态算出来。这个阶段是密集计算,时间主要花在把所有Prompt并行处理上,硬件快不快,看的是TB级别的算力和矩阵效率。
decode(解码):模型逐token生成输出,每生成一个token,都把整个权重矩阵重新读一遍,再结合KV Cache算下一个。这个过程在计算量上小得多,但极依赖“把几百GB权重从头到尾刷一遍”的访存速度。
我记得第一次用性能分析工具去看模型时,发现decode阶段的GPU算力利用率不到10%,显存带宽却拉到90%以上。那一刻才真正理解为什么行业里都说“LLM推理是memory-bound负载”。如果你只盯着理论算力选加速器,方向就错了。
2.3 算一笔带KV Cache的账
这里给大家一个用过的估算公式,方便评估自己的场景。一次decode阶段,把模型权重全部读一遍的时间可以近似为:
耗时 ≈ 模型权重体积(GB) / 显存带宽(GB/s)
假设模型权重是13GB,用A系列GPU带宽在2TB/s左右,那么一次权重读入的时间是6.5毫秒。这还没算KV Cache读取和计算时间。如果换成一台带宽只有200GB/s的加速卡,这个时间直接变成65毫秒,单用户延迟立刻爆掉。
所以当你看到某些加速卡的TOPS很高但带宽很低时,就要警惕:这东西也许适合做训练,也许适合做图像模型,但跑LLM decode很可能力不从心。反过来,很多面向LLM设计的推理加速器,会把带宽做得很激进,有的甚至放弃一部分峰值算力,换取更大的片上SRAM和更高带宽的HBM,这就是针对LLM负载做的取舍。
3. 主流加速路径的实际体验:量化、稀疏化、KV Cache压缩
3.1 低精度计算:FP16、FP8、INT8、INT4怎么选
我最早做硬件选型时,花了很多时间在量化方案上。核心思路其实一句话:把权重精度降下来,体积变小,带宽压力直接下降。
FP16(2字节)是基础精度;FP8(1字节)能把模型体积减半;INT8(1字节)和FP8类似,但对数值范围处理不同——FP8适合动态范围大的参数,INT8适合分布均匀的权重;INT4(半字节)能把体积再砍一刀,但模型精度的风险就显出来了。
| 精度 | 每参数字节数 | 相对体积 | 典型硬件支持 | 适合场景 |
|---|---|---|---|---|
| FP16/BF16 | 2 | 1x | 几乎所有AI加速器 | 基准配置 |
| FP8 | 1 | 0.5x | 新代GPU/推理卡 | 服务端高吞吐 |
| INT8 | 1 | 0.5x | 多数NPU/ASIC | 中低风险压缩 |
| INT4(GPTQ/AWQ等) | 0.5 | 0.25x | 部分定制卡,需算子适配 | 端侧与内存受限 |
实测下来,7B到13B这个量级的模型,用INT8权重配合量化感知或训练后量化,质量下降通常可控。等到了INT4,就得看具体任务了——生成代码和写散文的容错能力完全不一样。我在代码生成场景里跑了INT4,碰到复杂语义逻辑时错误率明显上浮,后来还是退回INT8。
3.2 稀疏化与MoE:硬件层面的“挑软柿子捏”
如果你跑的是一个MoE(混合专家)架构的模型,整个负载的特性会跟稠密Transformer差很多。大部分token在每一层里只激活少数几个专家,理论计算量大幅下降,但实现起来需要一套能把“哪个专家在哪颗卡上”记清楚的路由逻辑。传统GPU上跑MoE,麻烦在于专家并行时,token要频繁从一颗芯片跳到另一颗,互联带宽就成了瓶颈。专门为MoE优化的加速器,会在片上缓存路由表,并且把专家尽量安排在同一个物理域里,敲定跳转路径。实际测试里,MoE模型在适配好的加速器上,吞吐可以做得很高,但如果芯片本身的调度单元和外部交换机不给力,这个收益会被通信全部吃回去。
稀疏化另一个方向是权重剪枝。比如50%结构化剪枝后,稠密矩阵乘可以用稀疏算子跑。但要提醒的是,很多加速器嘴上说支持稀疏计算,实际库函数只对特定稀疏模式有效率,不是所有零都能跳过。做硬件选型前,先拿自己的模型跑一遍稀疏算子测速,别信白皮书。
3.3 KV Cache压缩:被严重低估的加速器功能
KV Cache的问题直接决定并发上限。一个长对话的KV Cache可能占掉好几GB显存,这就意味着同一条卡上能服务的并发用户数量急剧下降。硬件加速器如果想提升并发能力,最直接的办法就是内置高效KV Cache管理,常见做法包括:
- 连续式KV Cache存储:把KV块按token顺序连续存放,不像传统做法按层和头去切分,这样减少碎片化空间浪费。
- 块式分配与重复数据去重:多个系统提示词共享相同的缓存块,省掉重复占用的显存。
- KV Cache量化:把缓存的数值精度降低到INT8或FP8,显存占用直接砍半。
这些优化在纯GPU方案里也要靠vLLM这类框架的PagedAttention做,但专用加速器会把它们做到硬件调度层面,效果更稳定。我测试过其中一款推理卡,它宣称“显存有效利用率比同容量GPU高出80%”,实际上就是在KV Cache管理上做得很细,让同样的物理显存塞下了更多并发会话。
3.4 每台加速器都有自己的脾气:算子是照妖镜
这里必须插一段我踩过的坑:买回来的加速卡,官方给的demo跑得飞快,一上我们自己的模型就崩了。
原因永远是算子覆盖不完整。LLM服务里,除了常规矩阵乘,还有大量特殊算子——RoPE位置编码、FlashAttention中的一个fused kernel、grouped query attention的reshape、softmax的online实现。这些算子如果加速器没有原生实现,推理框架就会回退到CPU,性能一落千丈。评估加速器时,不要只看benchmark里的大矩阵乘数据,一定要把目标模型里每个算子在部署工具链里的支持情况列一遍,缺哪个,能手动自定义算子解决也行,得让工程师评估工作量。
4. 硬件最终要靠软件喂饱:推理引擎与编译优化的配合
4.1 PagedAttention这类技术,干的是什么活
上一节已经提到KV Cache管理,一次真正让GPU显存利用率提升的软件创新,就是字节跳动和UCSD联合提出的PagedAttention,也是vLLM推理引擎的基石。
它的思路借鉴操作系统里的分页机制。传统KV Cache是按照完整对话块预先分配的,显存碎片严重,实际利用率可能只有60%左右。PagedAttention把KV Cache切成固定大小的块,按需分配,放置到不连续的内存页里。这让显存碎片几乎消失,同时允许跨请求共享公共前缀,像系统提示词这种内容就不需要每人为它单独缓存一份。
对硬件加速器来说,PagedAttention这种按块读KV Cache的模式对存储控制器提出了很高要求。你在选专用加速器时,要确认它的运行时是否对接了vLLM或TensorRT-LLM,并原生支持页式KV分配,如果没有,显存能有效利用的空间会大打折扣。
4.2 算子融合与静态图:为什么CPU“捣浆糊”不行
LLM模型图里有几十上百个算子。如果不做融合,每个算子都要启动一次kernel、把中间结果写到显存、再读回来。这些操作的性能开销虽然每个都不大,但累积起来占比相当可观。推理引擎和编译器会做“算子融合”,把相邻的线性、归一化、激活函数合并成一个kernel,减少中间数据的搬移。
我用TensorRT-LLM做过一次融合前后对比:把一组7个可以合并的算子做fuse之后,单次推理耗时下降了18%,并且显存访问量大幅减少。对硬件加速器来讲,它的编译栈是不是做足了这个功夫,几乎决定了它能不能把芯片吃透。建议在选型时直接要求厂家提供目标模型的计算图优化报告,看看有多少算子被融合,多少个还是逐算子执行的状态。
4.3 调度和并发:伺候生成式服务的脾气
同样一张卡,给的batch size是1和连续动态batch,吞吐天差地别。生成式服务有一大特点:每个请求的生成进度完全不同。有的prompt已经在输出第80个token,有的还在prefill阶段。如果调度器不支持连续批处理,每来一个请求就得等当前batch整体做完,卡上的空窗期会非常明显。
很多推理加速卡会专门优化这个调度逻辑。它们支持抢占式的“prefill/decode插入”,在decode间隙插入新请求的prefill计算,把本来浪费的算力补上。实际操作里,我对比过开启连续批处理后,卡上最终吞吐提升了两倍多。这件事提醒我们,硬件加速器够不够好,调度软件的能力必须放在第一优先级去考察。
5. 我实测的几款硬件方案和几个结论
5.1 测试怎么做的
因为公司规模不算大,我们没有上来就买昂贵设备,而是用云服务商提供的几类加速实例加上本地的一张推理卡做了横向测试。模型用同一个开源7B和13B版本,精度保持INT8,词表、温控参数都一样。评价口径是三条:单用户首token延迟、稳定并发下的吞吐(token/s)、单位成本吞吐。
在实际敲定时,我不会只看总吞吐,因为不同场景的倾向完全不同:做内部员工服务,首token延迟最重要;做批量离线生成,成本吞吐更重要。
5.2 测试结果与原理解释
我把测试结果列成一张简表,同时标注原因:
| 方案 | 单用户首token延迟 | 64并发吞吐 | 单位成本吞吐 | 关键观察 |
|---|---|---|---|---|
| 通用GPU A(显存带宽大) | 低 | 高 | 中 | 最稳定,生态最成熟 |
| 通用GPU B(算力高但带宽一般) | 中 | 中 | 中 | decode阶段瓶颈明显 |
| 专用推理卡C | 中低 | 很高 | 高 | 配合部署栈后优势显著 |
| 端侧NPU(模拟深度压缩) | 高 | 极低 | 低 | 只适合低并发、低时延需求不敏感的场景 |
那个“专用推理卡C”让我印象最深:单卡并发吞吐能做到两张GPU大概80%的量,但功耗只有40%,单位成本算下来差了一截。不过它也有明显前提——模型算子全部踩在它支持的范围内,且推理引擎必须用它的专有版本。我们换过一个算子集更复杂的模型后,优势就缩小了。所以结论是:专不专用,取决于你手里模型的算子长得乖不乖。
5.3 选型的决策树:什么时候该换专用加速器
我后来给自己整理了一套决策逻辑,分享给大家做个参考:
- 先看模型体积和显存关系。如果模型权重加KV Cache已经顶到卡容量的95%,优先考虑做量化和KV Cache压缩,不一定急着换硬件。
- 再看decode阶段带宽利用率。用工具跑一轮压测,如果算力利用率低而带宽利用率高,说明瓶颈确实是访存,换带宽更强的卡是合理动作。
- 然后看负载形态。如果请求量平稳、上下文长度中等,专用推理卡的收益通常可观;如果请求长短差异极大、模型一直在变,建议还是保留通用GPU的灵活性。
- 最后看团队能力。如果你们有能力维护自定义算子库和编译栈,专用加速器才值得上;做不到就别欠技术债。
这套逻辑帮我避开了几次冲动的采购。有一次厂商拿来一台很便宜的加速器,白皮书数据很漂亮,但我用上面第一条和第三条一卡,发现自己模型做INT4量化后效果不能接受,而且负载波动巨大,就放弃了。
6. 端侧与云侧的分工:LLM加速器不只在机房
6.1 端侧加速器要解决的另一类问题
聊完服务器端的加速,再聊聊端侧。最近很多手机、PC、边缘盒子都开始内置NPU,宣传里都写着“端侧跑LLM”。这个趋势对整个行业的影响被远远低估。
端侧设备和数据中心设备是两个物种。数据中心卡可以塞200W功耗、几百GB/s带宽的HBM,端侧芯片功耗被限制在10W以内,连散热都挤不出来。所以端侧加速的核心动作是“把模型压缩到能塞进片上内存”,这比任何硬件算力都关键。我见过一个2B模型量化到INT4之后大约1GB,能够塞进中高端手机NPU的可用内存,跑一个不到10token/s的推理,响应延迟在千毫秒级,不惊艳,但对“离线可用”这个需求来说已经是质变。
6.2 混合部署的真实需求:什么时候值得把模型推上端侧
云侧部署和端侧部署不是互替关系,而是一种分工。我目前给团队定的原则很朴素:
- 需要最新知识、超大上下文、复杂工具调用的任务,放云侧。
- 要求毫秒级响应、网络差、数据不能出设备的任务,放端侧。
- 常见开场白和固定话术,甚至可以完全在端侧缓存,减少云端调用成本。
这种“云+端异构”组合,才是大多数实际项目真正能用上的加速方案。因为纯端侧能力受限,纯云侧又贵又怕断网,两边混着一拉,用户体验和成本就平衡了。
7. 我的几点实操体会
如果让我总结这段踩坑经历,第一句话是:别把“AI硬件加速器”当成一键加速的魔法棒,它是一个需要你用负载特性去匹配的体系。
多测、多对比、用真实模型跑压测,比任何厂商benchmark都有说服力。测试的时候设好同样的量化精度、同样的上下文长度、同样的并发模型,否则数据根本没意义。第二,研究KV Cache管理的时间性价比极高。对LLM推理来说,显存管理优化往往比换更贵的卡更见效。第三,如果你的业务还在快速演进,阶段性地租云资源测试专用加速实例比直接采购硬件安全得多。
最后一个小技巧:在用新加速器前,先在目标模型上开启性能剖析,记录每个算子的耗时分布,把这个分布图和新技术栈的算子支持清单对比。哪块的算子耗时占比大、又处于不支持列表里,就优先攻它。很多时候,一个独立算子的适配能解决整个加速器“跑不起来”的魔咒。
现在我们的LLM服务已经稳定运行在混合加速架构上,高峰期延迟回落到500毫秒以内,成本比最初的全GPU方案降了40%。我不觉得这就是终点,大模型技术还在变,MoE、超长上下文、多模态都会改变硬件负载特征,但把“算力、带宽、显存、调度”这四个词刻在脑子里,后面再怎么变,你也能很快找到适合自己场景的硬件加速器。