FPGA学号3
做过类似项目,分享点经验。
定点化这块,除了常规的量化感知训练,有个细节:TC-ResNet的深度可分离卷积(如果用了的话)要特别注意。深度卷积和逐点卷积的激活分布可能不同,缩放因子最好分开统计。我们当时用8bit量化,发现深度卷积那部分对精度更敏感,给它单独调了缩放因子,比全局统一效果好。
硬件友好型改造,关键是减少计算和存储。TC-ResNet本身算轻量,但还可以剪枝。在量化后,做一遍细粒度剪枝,把接近零的权重直接置零,存储时可以用稀疏编码压缩,这样能省BRAM。不过稀疏化会增加控制逻辑复杂度,资源紧张的话可以先不做,优先保证时序收敛。
利用时间冗余性,我们的做法是:语音帧每帧间隔10ms,但模型推理可能不需要每帧都从头算。可以设计一个“增量计算”机制。比如,第一层卷积在时间轴上是局部连接,相邻帧输入特征变化小,那么卷积输出变化也小。可以只计算变化部分?但实现起来复杂。更实用的复用方法是:把多个帧组成一个批次,但延迟会增大。在ZYNQ上,我们是用双缓冲,当一帧在计算时,下一帧数据正在搬运,计算单元不停,这样利用率就上去了。
资源分配上,ZYNQ-7010的BRAM可能先成瓶颈,因为要存权重和激活中间值。把权重放在PS的DDR,通过AXI总线流式加载,但这样带宽有限。最好把常用权重缓存到PL的BRAM,所以得分析哪些层复用率高。
开源项目:GitHub上搜“zynq-kws”或“fpga-keyword-spotting”,有几个用CNN的,虽然模型不同,但量化流水线设计可以参考。另外,MIT的论文“Hello Edge: Keyword spotting on Microcontrollers”有量化细节,虽然针对MCU,但思想通用。
最后提醒,先做仿真验证量化后的模型精度(用Python模拟定点运算),再写RTL,避免硬件做完了才发现唤醒率不达标。
