最近不少做AI硬件方案的朋友问我同一个问题:手机SoC里的NPU、服务器上的AI加速卡、还有各家打榜的“AI芯片”,到底凭什么比CPU和GPU跑神经网络更快?答案绕不开两个词:NPU(神经网络处理器)和DSA(领域专用架构)。这篇笔记是基于我自己的学习沉淀和实践观察整理的,重点放在DSA的设计原则如何落到NPU的微架构里,以及我们评估一颗NPU时真正应该盯住哪些指标。
先亮明立场:NPU不是玄学,它本质上就是DSA思想在神经网络计算领域的一次彻底执行。理解这条主线,再去看各家芯片的白皮书,基本就能过滤掉九成PPT水分。这篇内容适合三类人:刚开始接触AI芯片的软硬件工程师、做边缘侧智能方案选型的嵌入式开发者、以及想系统理解NPU微架构的学生。
1. 为什么要造NPU:从通用CPU到领域专用架构的三个痛点
很多初学者会困惑,CPU不是也能跑卷积吗?GPU不是号称并行之王吗?为什么还得专门搞一个NPU出来?这个问题的答案,就是DSA存在的全部理由。
1.1 通用性的代价:CPU在神经网络上的“能效陷阱”
CPU的设计追求是通用性:既要跑操作系统,又要跑数据库,还要跑浏览器。为了这个“什么都能干”,芯片里塞进了分支预测器、乱序执行引擎、寄存器重命名、缓存一致性协议等大量逻辑。这些逻辑的代价是什么?晶体管开销大、功耗高,但真正到了跑神经网络的时候,它们大多派不上用场。神经网络中最核心的操作是矩阵乘加,这是一种规则、重复、数据局部性极强的运算模式。CPU越全能,它在跑这种专项计算时浪费的能量就越多。
我见过一个很直观的对比测试:在同一颗14nm工艺的CPU上跑MobileNet推理,单位功耗下能完成的帧数很低。并不是CPU算不出来,而是它把大量能量烧在了“取指令、做调度、处理异常”这些与神经网络计算无关的岗位上。用一句行话讲,通用处理器存在严重的能效瓶颈。这里的能效不只是每瓦算力,还包含面积效率:同样一片Die面积,CPU能摆放的有效计算单元密度远低于专用加速器。
1.2 GPU的启示与局限:SIMT结构并非为神经网络而生
GPU把并行性往前推了一大步,大批线程同时执行,矩阵运算的单卡峰值很高,所以很多人拿GPU跑深度学习训练。但GPU出身于图形渲染,它的硬件调度单位是SIMT(单指令多线程),天然适合“大量可分解为像素/顶点的任务”。这个模型跑到神经网络里有几个不痛快。
一是数据搬运效率:GPU的通用寄存器和L1/L2缓存为图形渲染优化,卷积运算中权重和激活值的复用模式,并不能被GPU的缓存结构完全吃透。二是精度策略:GPU早年以FP32起步,后加Tensor Core做FP16混合精度,但仍然相对保守。三是功耗:训练卡动辄300W以上,放到手机、汽车、摄像头这些功耗受限的场景里很难落地。GPU证明了并行计算的方向,但也暴露了“半通用”架构在任务专项化上的天花板。NPU要做的,不是把并行做到有多极致,而是要把“神经网络对应的数据流模式”直接变成硬件组织方式。
1.3 神经网络计算的特质:让硬件有空间去“专用”
为什么DSA选择神经网络作为目标领域?因为它有几个非常适合硬件定制的数学特质。首先是容错性:神经网络对小的数值误差并不敏感,这意味着可以用低精度的整数替代高精度浮点,大幅压缩硬件开销。其次是高度并行与可分解:卷积、全连接、Transformer里的自注意力,拆到底都是矩阵乘法加逐元素操作,天然可以空间展开成大规模阵列计算。第三是数据复用极度明显:同一份权重会被多次使用,相邻像素的卷积窗口之间有大量重叠,这个性质决定了存储层次和数据路径可以围绕“复用”来定制。
神经网络计算的这三个特质,给了架构师非常大的操作空间。DSA的核心逻辑因此变得非常直白:不再试图做一个“万能”处理器,而是围绕目标领域的计算特征,把存储、并行度、算术单元彻底重塑。
2. DSA设计的三大核心原则:存储、并行与精度怎么取舍
如果说DSA是一套方法论,那么落到NPU设计上主要有三条硬性原则。这三条原则决定了芯片微架构的走向,也是我们解读一颗NPU内部结构的重要线索。
2.1 原则一:数据流形态决定存储结构
绝大多数NPU的Datasheet都会提到“大缓存”“片上Buffer”“多级存储”,但很少解释为什么这么设计。DSA的第一原则就是:存储结构要跟着数据流走,而不是照着通用处理器的缓存去抄。
神经网络推理中的数据流有一个鲜明特征:数据反复复用。卷积核滑过输入特征图时,相邻输出像素会复用同一块输入区域;同一个权重在所有输出通道中反复被读取。如果每一笔计算都从DRAM里取数据,速度上不去、功耗更是灾难。因此NPU普遍采用多级片上存储:最靠近计算阵列的是一个极高速的寄存器级窄缓冲区,往上是一个较大的SRAM Buffer,再往上才接DRAM。
这与CPU缓存有本质区别:CPU缓存是“自动的、透明的”,靠硬件猜未来访问模式;NPU的片上缓冲区则是“可显式管理的”,由编译器或驱动直接调度数据什么时候从DRAM搬到SRAM、什么时候喂给计算阵列。正因为存储形态跟着数据流走,NPU才能实现远高于CPU的数据复用率。
2.2 原则二:抓住领域特有的并行模式,设计空间计算阵列
神经网络算法的并行度主要集中在矩阵乘加。一个M×K的操作矩阵乘以K×N的权重矩阵,展开后有无穷多个乘加可以并行执行。DSA的第二个原则就是把这种并行直接用硬件“铺开”,而不是靠大量线程去模拟。
典型实现是MAC阵列(乘累加阵列):把几十上百个乘法器和累加器排列成二维网格,每个周期每个乘加器完成一次乘法并累加。部分设计还采用脉动阵列(如Google TPU里的经典结构),让数据像流水线一样在计算单元间流动,进一步减少数据搬移。这种空间计算阵列和CPU的“取指→译码→执行”完全不同,NPU内部不反复“取指令”,而是把网络中的一层层运算预编排成数据在计算阵列里的搬运节奏。这就是为什么NPU算力账面数据看起来恐怖:一个1024×1024的MAC阵列,频率1GHz,理论定点算力就超过2TOPS。
2.3 原则三:算数精度合理下探,用位宽换吞吐
DSA最激进的策略之一,就是敢于调整数值精度。神经网络对噪声鲁棒,整数8位通常足够用于推理,部分场景甚至能用4位、2位。这带来的收益极其诱人:位宽减半,同等面积下计算单元数量翻倍;存储和带宽需求同步减半;功耗更是大幅下降。
很多初入行的人会有个误区,认为低精度就是“质量差”。实际工程中,INT8量化经过校准和量化感知训练后,精度损失可以被压到1%以内,这对绝大多数推理任务完全可接受。不同芯片对精度的支持差异也很大:有的只支持INT8,有的原生支持FP16,有的加入稀疏化支持,可以在计算时跳过零值。精度取舍不仅是算法问题,更是芯片面积、成本、功耗的顶层博弈。这一条是DSA区分于CPU/GPU的重要标志:通用芯片必须保证任何算子都能高精度运行,专用架构则可以只为核心场景优化精度策略。
把三条原则放到一起看,DSA的本质就是一句大白话:领域需要什么,硬件就变成什么。存储为复用而生,计算为并行而生,精度为效率让路。
3. NPU微架构的核心部件与关键参数推算
理解了原则,再看NPU的组成就不难了。一颗典型NPU不会太复杂,但彼此参数配合若不匹配,号称的高算力最后只能纸上谈兵。
3.1 MAC阵列:算力从哪来
NPU算力的基本单位是MAC(乘累加)。每周期完成一次乘法和一次加法,整个阵列一个周期完成的MAC次数就是阵列规模。理论算力公式可以表示为:
算力(TOPS) = MAC数量 × 2 × 时钟频率(GHz),结果除以1000得到TOPS。
这里乘“2”是因为一次MAC操作拆成一次乘法和一次加法,共计2次浮点操作或整数操作。比如一个4096个MAC的阵列,运行在1.5GHz,理论算力就是4096 × 2 × 1.5 = 12.288 TOPS。
MAC阵列的规模不是想多大就多大。阵列越大,数据喂进去的压力越大,片上存储、片上网络布线、时钟树的功耗都会上升。设计者必须在面积、功耗和算力之间找平衡。常见的做法是把MAC阵列作为二维网格组织,比如32×32、128×64,配合不同方向的输入/权重流,适应卷积和矩阵乘法的各种卷积核尺寸。针对Transformer里的大矩阵乘,部分NPU还会把阵列组织成更高宽比的形态,减少在K维度上的数据回搬。
3.2 存储层次与数据复用:真正的“隐性算力”
提到算力很多人只看TOPS,但真正影响实际吞吐的往往是数据能不能喂饱MAC阵列。这就要看存储层次设计。典型的NPU内部存储层级包括:激活值SRAM、权重SRAM、累加器缓冲。计算之前,编译器会做数据分块(Tiling),把大矩阵切成能放进片上SRAM的小块,然后再逐块计算。
这就是DSA里最吃功力的一环:编译器要合理规划数据的搬运时机和复用方式。每层计算时,权重驻留在片上SRAM反复读取,输入特征图按窗口滑动复用,部分中间结果直接留在累加器里完成累加,不需要立刻写回DRAM。好的数据复用策略可以把对外部DRAM的访问量减少一个数量级以上,实际性能提升远超单纯堆算力。我看过一些端侧NPU,标称算力只有几TOPS,但在特定模型上的实测帧率比标称几十TOPS的芯片还高,原因就在这里。
3.3 指令集与调度方式:DSA的“大脑”
NPU也要编排计算流程,但它不是靠复杂指令集,而是使用一套轻量级的控制逻辑。多数NPU使用自定义指令或微码来描述数据搬运、阵列计算、激活函数、池化等操作。编译器把深度学习模型解析成数据流图,再映射为NPU指令序列,这个过程和CPU编译器完全不同:NPU编译器更像一个“空间布局器”,它要决定哪块数据放在哪个SRAM、哪部分计算放在哪个MAC子阵列、什么时候触发DMA搬运。
这个特性也点出了NPU和GPU的另一个差异:GPU依赖大量硬件线程切换来隐藏延迟,而NPU倾向于把计算编排当作一个静态执行计划,尽量减少运行时的调度开销。因此NPU运行时对外部依赖更少,但对编译器的要求极高。很多NPU实际利用率不高,问题就出在编译器对复杂模型的支持不到位,映射出来的执行计划远非最优。
4. 实操中的设计权衡与踩坑记录
以下内容更多来自我实践和调研中的体会。做端侧推理方案时,光看算力去选NPU一定会踩坑,我把常见问题归纳成了几个纬度。
4.1 算力不是唯一标准:MAC利用率才是灵魂
很多芯片标称算力很好看,但实际一跑就有落差,最核心的指标是MAC利用率。所谓MAC利用率,就是实际运行的MAC操作数除以理论峰值MAC操作数。影响利用率的因素包括:卷积层卷积核尺寸、输入通道数、数据对齐方式、片上存储容量是否充足、编译器生成的数据搬运计划是否高效。
我在评估一颗端侧NPU时,通常会先用典型网络(比如ResNet-18、MobileNetV3)实测,观察其MAC利用率落在什么区间。优秀的编译器配合合理的存储设计能把典型CNN的利用率做到60%~85%,差一些的可能只有20%~30%。所以当你对比两颗芯片时,看起来15TOPS打10TOPS,其实跑同一个模型,后者可能更快也更省电。
4.2 精度策略的选择与验证
精度方面,我建议不能盲目跟风INT4。INT8是目前最成熟的折中方案,大部分推理框架都支持,硬件实现也简单。INT4的硬件实现虽然能压功耗,但对模型敏感度要求很高,需要大规模校准与量化感知微调,工程周期长。FP16则更适合训练场景以及大动态范围的一些激活层。
经验之谈:先把INT8验证跑通,再考虑要不要往下探。在做量化校准的时候,建议收集足够多样化的真实数据,而不是用训练集的子集,否则容易在校准集上精度尚可、泛化后掉点。还有一个容易忽略的坑:硬件里对ReLU、残差相加这类逐元素算子常常使用高精度内部累加,避免误差滚雪球,但有的低端NPU实现偷工减料,导致深层网络数值偏差逐年累积,推理结果偏差变大。识别这类问题,最简单的方法是从网络的不同层抽取中间输出做数值对比。
4.3 系统级协同不能忽略:总线、DMA与异构调度
NPU是DSA,但DSA并不等于“孤立海岛”。完整的AI系统需要CPU、DMA、DSP、GPU协同工作。NPU从一级内存或DMA通道拿数据,计算完再通过中断通知CPU取结果。这个链路里任何一个环节都可能成为瓶颈。
开发中遇到最典型的问题是总线带宽不足。假设某算法在NPU端算力很高,但需要频繁加载权重和特征图,片外DRAM带宽会成为瓶颈。这时候如果SoC厂商把NPU挂在共享总线上,而其他外设又在大量占用带宽,实际AI任务就会被拖慢。做方案评估时,我强烈建议项目晨会就确认三件事:SoC的DRAM总带宽、NPU峰值带宽、以及NPU和CPU共用资源时是否有优先级仲裁机制。忽略这三项,很容易把一颗看起来“挺能打”的NPU用废。
5. 常见误区与问题排查实录
从事AI芯片相关工作这些年,我总结出一些外面文档里不会写明的“车到山前必有路”,但实际是“坑到山前必掉轮”的地方。
5.1 “TOPS越大性价比越高”是真的吗
账面TOPS高,很大可能只是MAC阵列尺寸大或频率拉得高。实际部署要看当前模型能利用多少算力、是否受带宽限制、精度支持是否匹配。曾经对比过两颗端侧NPU:一个是高TOPS但只支持INT8、外部带宽窄的芯片;另一个是TOPS稍低但支持混合精度数据复用调度。实测下来,后者的能效反而更好。这也应验了DSA的第一性原理:架构本身与目标数据流匹配度,比峰值算力更值得看。
5.2 稀疏化研发的甜头与苦头
随着大模型普及,大家都在提稀疏化:把模型中接近零的权重或激活值跳过,让算力不白烧。原理很简单:MAC阵列只处理非零值,乘零等于白做。但在硬件实现上,稀疏化意味着复杂的数据索引、压缩格式、负载均衡。一个处理稀疏计算效率高的NPU,实际数据结构设计非常重要。
我踩过最大的坑是:编译器对稀疏的支持不佳,导致裁剪后的模型推理速度反而不如密集模型。所以判断一个NPU的稀疏能力,不要只看白皮书里“支持N:M稀疏”几个字,要看SDK里是否提供端到端的稀疏优化流程,以及是否对不规则的稀疏模式有支撑。
5.3 NPU能完全替代GPU和CPU吗
不能。即便在AI任务里,NPU也不是全能的:它对不规则的动态控制流、复杂的循环依赖、不断变化的张量形状适应力弱。GPU在训练大模型时依然拥有优势,因为训练前向反向的精度要求和灵活性要求都更高。NPU更擅长高功耗效率、低延迟的快速推理场景,尤其在端侧、边缘侧。我们在架构选型时的一个基本原则是:谁擅长什么,就让它做什么。把NPU当作加速器而非处理器,系统设计才会松弛有度。
最后分享一个我自己评估NPU方案时的做法:拿到任何一款NPU,先不急着看算力,而是找到它的SDK编译一个真实模型,对着Profiler指标看三条曲线——实际MAC利用率、外部内存带宽占用率、片上存储命中情况。这三条曲线闭合后,这颗芯片的“真实战斗力”基本不需要看PPT就能判断出来了。DSA设计原则听起来高深,落到最后,其实就是判断硬件和要跑的计算之间,是不是真的严丝合缝。