3、AI加速器硬件架构:神经网络处理器(NPU)基础、数据流架构、存储层次设计
好,咱们进入第三章。这一章我打算聊聊AI加速器的硬件架构。说实话,很多做雷达算法的朋友,一听到硬件就头疼。但你想啊,算法最终要落地,跑在芯片上,不懂点硬件架构,你写的网络可能根本跑不动,或者效率极低。
我个人习惯,在讲NPU之前,先让大家明白一件事:通用处理器(CPU/GPU)和专用处理器(NPU)到底差在哪?
3.1 神经网络处理器(NPU)基础
NPU,说白了就是专门为神经网络计算设计的处理器。它跟CPU最大的区别是什么?CPU是“什么都能干,但干得不够快”;NPU是“只会干几件事,但干得飞快”。
我在项目中遇到过一位同事,非要用GPU跑一个轻量级的雷达目标检测网络。结果呢?功耗高得吓人,板子烫得能煎鸡蛋。后来换了NPU,同样的网络,功耗降了80%,帧率还翻了一倍。这就是专用硬件的魅力。
NPU的核心计算单元,我总结下来主要有这几个:
- MAC阵列(乘累加单元):这是NPU的心脏。一个MAC单元一次完成“乘法+加法”操作。NPU里通常有几百甚至几千个MAC单元并行工作。
- 激活函数单元:ReLU、Sigmoid这些非线性操作,有专门的硬件模块来处理,比用软件模拟快得多。
- 池化单元:最大池化、平均池化,也是硬件直接搞定。
- 数据搬运单元(DMA):这个容易被忽略,但其实是瓶颈。数据搬得快,MAC才能吃饱。
核心观点:NPU的设计哲学就是“以计算为中心”变为“以数据搬运为中心”。你想想看,MAC算得再快,数据没喂进来,也是白搭。
3.2 数据流架构
数据流架构,嗯,这里要注意,这是NPU设计的精髓。不同的数据流方式,直接影响芯片的面积、功耗和性能。
我见过三种主流的数据流架构,咱们一个一个说:
3.2.1 权重固定(Weight Stationary)
这种架构的思路是:把权重存在片上,反复使用。输入数据流进来,跟权重做卷积。
- 优点:权重复用率高,适合权重较大的网络。
- 缺点:输入数据需要频繁搬运,对带宽要求高。
- 适用场景:雷达信号处理中的一维卷积,比如脉冲压缩后的匹配滤波。
3.2.2 输入固定(Input Stationary)
反过来,把输入数据固定在片上,权重流进来。
- 优点:输入数据复用率高,适合输入特征图较大的情况。
- 缺点:权重更新频繁,对权重存储带宽要求高。
- 适用场景:雷达图像中的二维卷积,比如SAR图像的目标检测。
3.2.3 输出固定(Output Stationary)
这种架构关注的是输出特征图的累加过程。部分和(partial sum)存在片上,不断累加。
- 优点:减少了对DRAM的写回次数,省带宽。
- 缺点:需要额外的累加器资源。
- 适用场景:深度可分离卷积,比如MobileNet这类轻量网络。
我的经验:实际项目中,很少有NPU只用一种数据流。大多数商用NPU都是混合架构。比如,我调试过一个雷达目标检测的NPU,它在第一层卷积用输入固定,后面几层用权重固定。为什么?因为第一层输入数据量大,后面权重多。灵活搭配才是王道。
3.3 存储层次设计
存储层次,说白了就是“数据怎么放,才能让MAC吃饱”。
雷达处理有个特点:数据量大,实时性要求高。一个典型的雷达数据帧,可能是1024个脉冲,每个脉冲采样2048点,这就是2M个数据点。如果每个点是16位,那就是4MB的数据。嗯,这个量级,片上SRAM根本放不下。
所以,存储层次设计就变得至关重要。我一般把它分成三层:
| 层级 | 存储介质 | 容量 | 带宽 | 延迟 |
|---|---|---|---|---|
| L1(寄存器/本地缓存) | SRAM | 几十KB | 极高(TB/s级) | 1-2个时钟周期 |
| L2(共享缓存) | SRAM | 几MB | 高(GB/s级) | 10-20个时钟周期 |
| L3(片外存储) | DRAM/HBM | 几GB | 中等(几十GB/s) | 几百个时钟周期 |
设计原则其实就一条:尽量让数据待在L1和L2,少去L3。因为去一次L3,MAC能闲着等几百个周期,太浪费了。
我曾经踩过一个坑。一个雷达测距项目,网络不大,但帧率要求高。我一开始把权重全放在L3,每次推理都从DRAM读权重。结果呢?MAC利用率不到30%。后来我把权重预取到L2,利用率直接飙到85%。
避坑指南:我曾经以为存储层次只是容量问题,后来发现带宽才是真正的瓶颈。特别是雷达的复数数据(I/Q两路),如果存储位宽设计不合理,带宽直接砍半。我建议在设计存储系统时,一定要考虑数据位宽对齐。比如,16位的I/Q数据,最好用32位总线一次搬运一对,而不是分两次搬。
3.4 实际设计中的权衡
讲完理论,咱们聊聊实际设计中的权衡。你想想看,NPU设计其实就是一场“面积、功耗、性能”的三角博弈。
- MAC阵列越大,算力越强,但面积和功耗也上去了。
- 片上缓存越大,数据复用越好,但芯片成本也高了。
- 数据流越灵活,适配性越好,但控制逻辑也越复杂。
我个人习惯,在雷达应用中,优先保证数据带宽和存储层次的合理性。因为雷达信号是流式的,数据一旦断流,整个处理链就卡住了。算力稍微弱一点,可以通过网络剪枝来弥补,但数据搬不动,那就真没辙了。
举个例子,我之前设计一个用于车载雷达的NPU,MAC阵列只放了128个,但片上缓存做到了4MB,还配了双通道DMA。为什么?因为车载雷达的实时性要求极高,数据必须源源不断地喂给MAC。128个MAC虽然不算多,但利用率高,实际吞吐量反而比256个MAC但缓存小的方案要好。
总结一下:NPU设计,不要盲目追求算力。先搞清楚你的数据流特点,再决定MAC数量、缓存大小和数据流架构。雷达处理尤其如此,数据量大、实时性高,存储层次设计往往比计算单元更重要。
好,这一章就到这里。下一章咱们聊聊具体的NPU编程模型和编译器优化,到时候我会拿一个实际的雷达网络来演示,怎么把网络映射到NPU上,怎么调优。敬请期待。