060、NPU的LSTM与GRU:循环神经网络的硬件加速
去年秋天,我在调试一块搭载自研NPU的AIoT芯片时,遇到了一个诡异的时序问题。模型在PC端跑FP32推理,LSTM层的输出完全正确,但部署到NPU上后,序列长度超过32个时间步就开始出现数值漂移,到第64步时,某些通道的输出直接变成了NaN。我盯着逻辑分析仪抓出来的控制信号波形,发现NPU的片上SRAM在连续写入隐藏状态时,地址回绕逻辑出了bug——硬件工程师把LSTM的循环状态当成了普通卷积的中间特征图来处理,压根没考虑时间步之间的依赖关系。
这个坑让我意识到,很多做嵌入式AI的工程师,对NPU如何处理循环神经网络的理解,还停留在“把RNN展开成前馈网络”的层面。实际上,现代NPU对LSTM和GRU的加速,远不止简单的循环展开,而是涉及数据流重构、算子融合、状态缓存等一系列硬件层面的精巧设计。
循环神经网络的硬件痛点
先说说为什么通用处理器跑RNN这么慢。LSTM的核心计算是四个门控的矩阵乘法和逐元素操作,每个时间步都要重复执行。在CPU上,这意味着频繁的指令发射和内存访问——每个时间步都要从DDR加载权重矩阵,计算完又把隐藏状态写回。更糟糕的是,时间步之间的数据依赖让流水线频繁停顿,CPU的分支预测器面对这种固定模式的循环也毫无办法。
GPU虽然能通过大规模并行加速矩阵乘法,但RNN的序列依赖性限制了并行度。你没法像处理卷积那样,把整个序列的输入一次性塞进张量核心。每个时间步的计算结果,必须等前一个时间步完成才能开始。这就是所谓的“循环依赖瓶颈”。
NPU的解决思路很直接:既然循环依赖无法消除,那就把循环的控制逻辑和状