资讯动态

NPU与TPU深度解析:模型部署提速的算力基石与实战避坑指南

发布时间:2026/10/16 12:30:09 来源:尧图企业网站定制
做模型部署的人早晚会遇到这样的场景模型在开发机上跑得飞快一放到边缘设备上就掉了半条命或者训练阶段还算顺利一上线做推理就算把GPU的占用率拉满整体吞吐还是不够看。我开始认真研究NPU/TPU硬件加速不是出于对芯片的好奇而是被线上服务的延迟逼的。这套东西到底为什么会快它在真实项目里有哪些坑这篇就当是第19章的正文聊一聊NPU和TPU这些专用AI加速芯片的算力来源以及在接入实际部署时的经验教训。如果你也在做AI模型的推理加速、端侧部署、云侧高并发服务或者刚接触硬件加速想知道从哪儿下手这篇文章应该能给你一些参考。我尽量把原理讲得通俗把坑讲得具体不绕弯子。1. 为什么GPU不再够用从通用加速到专用加速的必然1.1 一个跑不动的模型引发的思考前阵子帮某团队解决一个实际项目目标检测模型模型文件大概80MB输入分辨率960x540在开发机上用一块入门级显卡跑单帧延迟25毫秒一切看起来都还行。结果部署到客户现场的工控机上问题就来了——现场机器没有独立显卡CPU还是几年前的低功耗版本。同一个模型在CPU上跑单帧延迟直接飙到500毫秒以上。500毫秒是什么概念视频流每秒25帧的话处理速度连一帧都跟不上整个业务链路等于瘫痪。当时第一反应是换轻量模型但重新标注数据、重新训练、回归测试没个两三周下不来而且客户还担心精度下降。后来平台上有一块空闲的NPU加速卡IT同事说你的模型我帮你转成这个芯片的格式你看看能不能跑。折腾了两天转完格式、做完量化单帧延迟压到9毫秒功耗还比原来CPU方案低了将近一个数量级。那次之后我就意识到模型部署的下一站大概率就是NPU/TPU这类专用硬件。这篇文章我想解决三个问题第一NPU/TPU凭什么比GPU更快以及快在什么地方第二真正把模型部署到这类芯片上要经历哪些环节第三那些芯片手册和厂商示例代码里不会告诉你的事故现场。1.2 GPU的瓶颈在哪里SIMT架构和访存的天花板很多人会想GPU不是已经很快了吗上千个核心并行计算训练大模型都是用GPU集群跑的为什么还需要新的专用芯片这个问题的答案不在算得快不快而在算得值不值。先看GPU的架构本质GPU走的是SIMT路线或者说单指令多线程。它的设计初衷是图形渲染要对海量顶点、像素做并行处理所以芯片上有大量流处理器CUDA核心之类的概念每个流处理器都能独立执行线程。这种架构的优势是通用性极强图像处理能跑、科学计算能跑、神经网络也能跑。但代价就是浪费。怎么个浪费法一个GPU芯片的面积要分给计算核心、线程调度器、一级二级缓存、寄存器堆、各种控制逻辑。真正在做浮点乘加的ALU面积占比其实不高大概百分之二三十。而一个神经网络模型尤其是推理阶段90%以上的计算量集中在矩阵乘法上形态非常固定。用GPU这种什么活都能干的通用并行架构去跑固定形态的矩阵乘法等于让一个全科医生天天只做阑尾手术他的知识面和设备冗余并没有都产生收益。再说访存。GPU的计算单元访问片上存储要走多级缓存硬件不知道下一个时间片要算哪个数据块所有数据搬运基本都是猜的——靠缓存命中率。矩阵乘法这种数据复用极高的运算在GPU上需要反复从显存读权重和输入每一次搬运都在烧功耗。某入门级显卡跑FP32推理时整卡功耗可以到120W但其中有大半并没有转化为有效算力而是耗在了数据搬运和线程调度上。正是这两点——晶体管利用率低、数据搬运开销大给了NPU/TPU存在的空间。专用芯片不需要照顾什么活都能干的通用性只需要把最常用的一两种运算做到极致剩下的晶体管全部省下来堆计算阵列。1.3 NPU/TPU的定位为张量计算而生的专用架构NPU和TPU这两个名字经常被放在一起说但它们的来源和侧重点其实不太一样。NPU的全称是Neural Processing Unit泛指各种神经网络处理器很多芯片厂商都在做形态各不相同有集成在手机SoC里的低功耗版本也有做成PCIe加速卡放在服务器里的高吞吐版本。TPU全称是Tensor Processing Unit最早来自某科技巨头的云侧AI加速芯片专门针对其机器学习框架做深度优化后来也迭代了几代架构理念被业界广泛借鉴。尽管名字和厂商不同这类芯片的共同点非常明确用大规模、确定性的乘加阵列去处理卷积和矩阵运算精简指令集把不必要的控制逻辑砍掉把片上存储做成层次化结构由编译器显式管理数据调度。打个比方CPU是全科医生什么病都能看但效率一般GPU是大型综合医院科室多、吞吐量大但导诊、挂号、分诊流程繁琐有很多间接开销NPU/TPU则是一条专用的手术流水线只做一类手术流程固定、仪器专用单台手术的效率高到惊人。你用流水线做阑尾切除它可能不如综合医院擅长处理疑难杂症但只要是阑尾手术速度就是碾压级。这只做一类手术的背后就是专用硬件相对通用硬件的效率差距。2. 深入芯片内部NPU/TPU的两大加速引擎2.1 算力从哪里来矩阵运算单元的密度优势网上看芯片宣传动不动就是几百TOPS的算力很多人对TOPS没概念。1 TOPS是每秒一万亿次运算操作。一块几百TOPS的NPU芯片每一秒要执行几十万亿次乘加。这数字看起来很吓人但拆开看原理并不复杂芯片上有成千上万个乘加单元MAC每个单元在一个时钟周期内完成一次乘法加一次加法所有单元并行工作乘起来就是巨大的算力。为什么同类芯片面积下NPU/TPU的算力能做到GPU的几倍核心在于密度。GPU每个流处理器里要包含线程ID管理、分支处理、寄存器文件访问、乱序调度等逻辑这些都在跟计算单元抢晶体管。NPU把这些全部砍掉指令执行方式极其简单——一条指令驱动一个巨大的乘加阵列不需要考虑万一某个线程走了不同分支。这里有个关键点推理阶段广泛使用INT8整数运算。一个INT8乘加器占用的芯片面积大概是FP16乘加器的四分之一所以同样晶体管预算下INT8算力标称值可以做到FP16的两倍到四倍。很多NPU标称算力是INT8几款端侧芯片甚至可以做到INT4。当年某款云侧TPU发布时用INT8算力数据对比同期的GPU FP16算力账面数字直接翻了几倍但要注意单位不同不能只看数字大小就下结论。设计专用芯片的逻辑就是一个选择题你的业务90%以上是矩阵乘法你的数据精度用INT8就够那为什么还要把芯片面积浪费在FP32的通用计算单元上干脆全堆INT8乘加器这不就是天然的算力倍增器吗。2.2 脉动阵列如何工作数据在硬件里流动起来很多NPU/TPU内部最核心的结构是脉动阵列Systolic Array。这名词听着玄乎其实理解起来不难。普通计算单元的工作方式是这样的从内存读一个数A再读一个数B做乘法结果写回内存然后读C、读D再做一次乘法。数据在内存和计算单元之间往返每一趟都有延迟和功耗。脉动阵列完全换了一个思路把成百上千个计算单元排成一个规则的二维网格数据不从内存反复搬运而是在这个网格里流动——每个计算单元从相邻单元接收数据完成一次乘加再把结果传给下一个单元。数据像零件在流水线上流动工人站在原地反复处理经过手边的零件不用每次弯腰去地上捡。这套结构为什么适合矩阵乘法矩阵乘法CA×B本质上是一堆乘累加操作。只需要把矩阵A的一行和矩阵B的一列的数据喂进阵列让它们按节奏流动每个计算单元持续做收到一个输入、取一个权重、乘一下、加上之前的部分和、传给下一个这样的固定动作。整个阵列同步脉动一条指令启动几万个乘加单元同时运作。早期某款TPU的脉动阵列规模做到256×256意味着单周期能处理六万多个乘加这是GPU架构难以想象的密度。脉动阵列还有个大杀器属性数据从片外DRAM读进片上之后可以反复被不同的计算单元使用被反复使用的次数越多单位运算对应的访存成本就越低。Transformer类模型就是靠大矩阵乘法和注意力机制吃饭的权重和中间激活都有极高的复用率所以这类模型在NPU/TPU上的加速效果特别显著这也是这几年AI芯片跟大模型互相成就的原因。2.3 片上存储与数据复用把搬运成本降到最低如果一个芯片只是堆计算单元但没有足够快的内存投喂再强的阵列也会饿死。所以NPU/TPU的存储层次设计非常讲究普遍采用主存—全局SRAM—局部缓冲区/寄存器—计算阵列的层级结构。跟GPU最大的区别是GPU的缓存由硬件自动管理程序员不需要关心数据怎么在各级缓存里流转但代价是硬件只能靠猜来预取数据NPU/TPU不一样它把存储调度的主权交给了编译器——在编译阶段编译器会分析计算图决定哪块数据放在哪一级存储、什么时刻从主存搬进SRAM、哪一批数据传到哪个计算单元全部提前编排好。这种显式存储管理听起来复杂但好处是运行时的确定性极高不会出现缓存未命中导致的性能抖动。编译器在切分数据时通常会遵循几种经典的数据复用策略Input Stationary输入固定输入数据固定在计算阵列中权重复用输入数据适合卷积核在输入特征图上滑动的情况。Output Stationary输出固定部分和留在计算单元内不急着写回内存累加完毕后一次性写出大幅减少中间结果的往返。Weight Stationary权重固定权重在片上驻留输入数据流经阵列适合全连接层或者连续多次使用同一权重的情况。实际芯片很少只用单一策略编译器会根据算子形态自动选择组合。理解这一点对后端性能调优很重要很多为什么我的模型在NPU上跑不满算力的问题本质就是数据复用没做好权重每次都从DDR加载访存带宽直接锁死了性能上限。3. 从芯片到实际部署编译、量化与框架集成3.1 AI编译器做了什么把模型翻译成硬件指令说实话我第一次把训练好的模型扔给NPU工具链的时候天真的以为就像装个驱动那样转个格式就能跑。结果编译日志刷出几十个warning加两个error我才意识到NPU/TPU和GPU在软件栈上有本质区别。GPU有通用API图形API或并行计算API框架只要调用这些API就能在任意GPU上跑驱动负责把计算任务分发给几千个并行核心。NPU/TPU则是专用指令集专用编译器的路线没有标准通用API可用每个厂商提供的工具链都不一样但整体工作流其实是相似的前端解析、图优化、算子映射、存储规划、指令生成。拿一个典型的部署流程举例训练好的模型先导出成开放神经网络交换格式ONNX这是跨框架的通用中间表示。然后NPU厂商提供的编译器接管第一步把ONNX解析成内部计算图第二步做图优化包括算子融合——把卷积、批归一化、激活函数合并成单个算子减少中间张量落内存的次数再如常量折叠把能在编译期算出来的算子提前算完。这些优化做完计算图的节点数可能直接缩减一半。接着是算子映射计算图里的每个算子编译器要去芯片的算子库Operator Library里找对应的底层实现。如果找不到就想办法拆成几个支持的算子组合实在拆不了只能回退到CPU执行。这一阶段是部署时最容易出问题的地方后面第四章专门细说。最后是做存储规划和指令生成把张量切成适合片上SRAM的小块安排DMA传输时序生成芯片能执行的指令文件。3.2 部署流程实操从模型导出到量化再到推理调用纸上谈兵没有用我把从零到部署的一整套流程走一遍。下面是一个以实际项目为背景的通用步骤适配大多数NPU/TPU工具链细节以你用到的芯片具体SDK为准。第一步导出通用模型文件。训练好的模型先转成ONNX这种通用格式。导出时要固定输入shape动态shape在专用芯片上是大忌——编译器需要在编译期确定所有张量的尺寸才能安排存储布局。第二步模型转换与编译。使用芯片厂商提供的转换工具把ONNX模型输入进去工具会输出一个芯片专用的离线模型文件。转换时重点关注工具日志里的算子支持情况。第一次转换时几乎必然会遇到几个不支持的算子先别慌逐个处理优先改写源模型把不支持的算子替换成等价的基础算子组合如果实在绕不开有些工具支持回退到CPU可以在配置里把某些算子的执行设备指定为CPU代价是这些算子的执行路径变成CPU和NPU之间的数据同步点性能会有损失。第三步量化。推理阶段强烈建议INT8量化。硬件跑INT8通常比FP16快50%到100%功耗也更低。量化的第一选择是训练后量化PTQ用一小批校准数据跑一遍模型统计每层激活的数值范围然后计算缩放因子。PTQ操作简单多数模型精度损失能控制在1%以内。如果PTQ不达标就要上量化感知训练QAT在训练阶段就对量化误差建模通常能找回大部分精度但需要重新训练周期长一些。第四步编译生成最终模型文件在目标设备上加载运行。运行时通过厂商SDK调用NPU/TPU。通用推理接口的代码逻辑大同小异下面的伪代码展示了核心流程// 假设厂商SDK提供的核心接口实际函数名以你的平台为准 Context ctx CreateContext(); Model model LoadModel(ctx, model_int8.nb); // 加载编译好的模型 // 准备输入数据先从CPU内存拷到设备内存 Tensor input AllocateTensor(model, input, {1, 3, 640, 640}); CopyHostToDevice(input, host_image_data, input_size); // 创建推理任务可配置异步方式 Worker worker CreateInferenceWorker(model, ctx); Task task worker.Submit(input); // 异步提交 // 等待结果 WaitForTask(task); Tensor output GetOutputTensor(task); CopyDeviceToHost(host_output, output, output_size);这一步有几个细节容易踩输入数据的预处理归一化、通道顺序NHWC/NCHW要在CPU还是NPU上做不同芯片要求不一样建议提前查文档有些SDK要求预热一次循环调用才会把权重真正加载到NPU的片上内存正式压测前先跑两轮。3.3 真实性能对比不同硬件方案的实测数据理论讲再多不如看一组实际对比数据。下面这张表来自某模拟项目X的实测记录硬件型号均已模糊化处理但趋势很能说明问题。测试模型是前面提到的80MB检测模型输入分辨率960×540INT8量化后权重约20MBbatch1延迟取50次平均。平台方案精度类型单帧延迟稳态功耗备注某8核桌面CPUFP32约510 ms45W基线方案不可用某入门级GPUFP32约25 ms120W精度最好功耗高某入门级GPUINT8约14 ms100W延迟尚可某端侧NPU卡INT8约9 ms4W功耗突出需工具链转换某云侧TPUINT8约3 ms按量计费吞吐优秀适合服务化这组数据告诉我们两件事第一NPU/TPU的加速效果是实打实的尤其是功耗比端侧NPU用4W做到了GPU 100W才能做到的事第二硬件选型没有最好只有最合适。如果模型里自定义算子特别多NPU的算子库支持不全转换成本会高到让人想放弃如果业务本身对延迟不敏感、但算子形态天天变GPU反而是性价比最高的保底选择。4. 那些文档里不会写的问题我踩过的NPU/TPU的坑4.1 理论TOPS和实际吞吐之间隔着一条带宽鸿沟芯片宣传页上的TOPS是峰值算力很多人看了就以为模型编译出来一定能跑这么快。实测下来能跑到峰值20%到30%已经算优化得不错了剩下那70%去哪了三种情况最常见。第一种是算子边界损耗。脉动阵列再猛也只能加速矩阵类算子如果计算图里有Reshape、Split、Concat这些操作数据需要在内存里搬来搬去搬运期间计算阵列只能空转。有些模型从头到尾看矩阵算子占比很高但拆分到单个算子级别非矩阵算子也有不少最终有效算力被拉低。第二种是访存带宽瓶颈。模型量化后权重虽然在减小但一个20MB的模型放在芯片上如果片上SRAM只有几MB权重不可能一次性全部驻留。每跑一两层算子编译器就得从DDR重新拉一批权重。这个时候DDR带宽是多少性能上限就被钉死在哪里算力再高也是摆设。某次我跑一个语义分割模型理论计算量对应0.5毫秒实际延迟12毫秒瓶颈就在这里。第三种是启动开销。batch1的在线推理场景每一次推理都有固定开销把输入拷到设备端、DMA启动、任务同步。这个开销在小模型上可能占一半延迟。针对访存瓶颈实战中比较有效的优化手段有几个一是尽量增大batch让权重加载的固定成本被摊薄二是做模型裁剪把权重压到片的SRAM能装下的程度三是算子融合减少中间张量落内存的次数。你可能会想这些优化是不是编译器自动就做了理论上是但编译器对算子的融合策略有时很保守手工调整计算图的算子组合方式往往能带来额外收益。4.2 算子不支持的通用解法分解、替代与重训练算子不支持是NPU/TPU部署里最折磨人的事。我整理一下实际开发中碰到过的问题和对应的处理思路你可能也会遇到类似情况。GELU激活函数某框架的GELU在目标NPU算子库里没有原生实现。第一次转换直接报unsupported op整个人就懵了。后来冷静下来把GELU拆成数学表达式用tanh近似实现0.5x(1tanh(...))编译通过了。但要注意数学展开后可能引入额外的中间算子精度和性能都要重新测。另一种做法是用多项式近似牺牲一点精度换速度反正推理阶段通常能接受。动态shape问题NPU对输入shape极度敏感很多模型里有基于输入尺寸动态计算的Reshape、循环、Slice这些在编译期无法确定张量尺寸直接不支持。通用解法是把动态部分改成定长mask比如把循环展开成固定次数超出的部分用0填充掩码掉。这对精度影响不大但需要动模型结构而且mask操作本身会增加计算量。Attention算子的兼容性Transformer火了之后很多NPU都支持标准的Attention算子但FlashAttention、分页注意力这类变体支持情况参差不齐。某次在云侧TPU上跑一个长文本模型标准Attention的复杂度和显存占用都超预算FlashAttention加速方案又不被工具链支持。最后退而求其次把注意力计算拆成几个标准的矩阵乘法Softmax组合虽然性能没到理想状态好歹能跑起来了。一条经验拿到新硬件的第一件事不是跑模型而是去看它的算子列表把模型里每个算子过一遍心里有个底。等到编译报错再逐个人工排查非常痛。4.3 量化精度的陷阱精度下降到底是谁的锅模型量化到INT8之后精度掉了1%团队第一反应往往是抱怨NPU精度差。我一开始也这么想后来多排查了几次才发现真正的问题大多出在量化策略上芯片本身没做错什么。第一次踩坑是PTQ的校准数据选得不好。我用了一百张和测试集场景差异很大的图片做校准结果某些激活层的数值范围估计严重不准量化后激活被截断精度直接掉3%。后来改用从真实业务流里抽取的样本做校准精度损失降到0.5%以内。这提醒我校准集必须能代表真实数据分布别图省事随便抓几张图。第二次是离群值问题。某些层的激活值绝大部分集中在很小的范围但偶尔出现几个特别大的离群点直接把缩放因子拉大导致正常数值的量化精度严重下降。处理方案是针对敏感层单独配置量化参数有的层用per-channel量化替代per-tensor有的层把离群值裁剪掉有的层干脆保持FP16。现在很多量化工具都能输出每一层的量化损失日志按损失排序优先处理排名靠前的层比全模型蒙着眼调高效得多。第三个坑是INT8累加溢出。有些芯片的MAC单元内部用INT32累加器看起来不会溢出但某些芯片的中间结果如果超出INT16范围会在累加过程中截断导致精度异常。解决办法相对简单把大的tensor切小让部分和的数值范围变小或者使用混合精度敏感层走FP16路径。关于量化有个心法值得记住先看日志再动手调参不要一上来就猜。厂商给的量化分析工具基本都会标出每一层的损失按图索骥精准打击效率会高很多。最后再分享一点个人体会。说实话我一开始对NPU/TPU是有抵触的总觉得专用硬件限制多、工具链不成熟、算子支持残缺。但真正把一两个项目完整走下来之后我的看法变了不少前期的编译转换和量化调优确实扎心可一旦算子适配完成、量化收敛后面的稳定性和功耗表现是通用GPU给不了的。端侧设备上4W的功耗跑出GPU 100W的性能这是架构设计的胜利也是专用取代通用的直接体现。如果你也准备上手我给的建议很朴素先别纠结谁的算力更高这种纸面对比直接拿一块生态成熟、文档齐全的NPU板卡把你已经跑通的模型完整走一遍部署流程。把编译错误一个个解决掉把量化精度一点点调回来这个过程学到的东西比看一百遍芯片架构图都管用。硬件加速从来不是芯片自己的事而是芯片编译器算子库业务场景四件事一起决定的结果。这四个环节里任何一个掉链子纸面TOPS都跟你没关系。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑