ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

神经网络协同处理器如何降低视觉处理功耗:架构、优化与实测经验

神经网络协同处理器如何降低视觉处理功耗:架构、优化与实测经验 视觉处理这件事功耗从来都是绕不过去的坎。我在边缘设备上跑过不少视觉模型从最早的树莓派加USB摄像头到后来用FPGA做卷积加速再到最近折腾低功耗MCU上的轻量级推理每一次最头疼的都不是能不能跑通而是跑起来之后电够不够用。神经网络协同处理器这个概念说白了就是专门给神经网络推理配一个副手让主处理器不用事必躬亲从而把整体功耗压下来。这篇内容我想从实际工程角度把这件事拆开讲清楚它到底怎么省电、省在哪、设计时要注意什么、实测中会遇到哪些坑。适合正在做边缘视觉方案选型、FPGA加速器设计、或者低功耗嵌入式AI部署的朋友参考不管你是刚接触这个方向还是已经踩过几轮坑应该都能找到有用的东西。1. 视觉处理为什么成了功耗大户1.1 从数据搬运看功耗的真实来源很多人一提到视觉处理功耗第一反应是计算量大。这个判断对但不完整。我在做功耗拆解的时候发现真正吃掉功耗的大头往往不是乘加运算本身而是数据搬运。一个典型的卷积层假设输入特征图是224×224×3第一层卷积核3×3×64光是输入数据的读取量就相当可观。如果主处理器和内存之间的带宽有限每次运算都要来回搬数据那功耗就全耗在总线和内存控制器上了。在28nm工艺下一次32位浮点乘加运算的能耗大约在3到5皮焦耳量级而一次片外DRAM访问的能耗可以到100皮焦耳以上差了二三十倍。这个数量级差异意味着哪怕你把计算单元优化到极致只要数据搬运路径没优化整体功耗就下不来。神经网络协同处理器的核心思路之一就是把数据搬运局部化——让权重和中间特征图尽量待在片上缓存里减少对主存和主总线的依赖。1.2 主处理器兼职做推理的代价早期很多方案是让主CPU或者主DSP直接跑神经网络推理。这样做的好处是架构简单不用额外加芯片。但问题在于通用处理器为了兼顾各种任务流水线深、分支预测复杂、缓存层级多这些设计在跑控制逻辑时很高效但跑神经网络这种高度规则的计算时大量能耗浪费在了指令译码、分支判断和缓存一致性维护上。我实测过一个对比同样的MobileNetV2推理任务在Cortex-A53上跑和在专用NPU上跑帧率差不多的情况下NPU方案的功耗只有CPU方案的三分之一左右。差距不是来自算力而是来自专业分工。协同处理器把神经网络推理的调度、数据流控制、乘加阵列管理都固化下来省掉了通用处理器那些万能但费电的机制。1.3 视觉任务的功耗分布特征视觉处理有个特点它的功耗分布和任务阶段强相关。图像采集阶段传感器和接口功耗占主导预处理阶段色彩空间转换、缩放、去噪这些操作功耗相对固定推理阶段功耗随模型复杂度和输入分辨率剧烈变化后处理阶段非极大值抑制、坐标变换这些又回到通用计算。协同处理器主要瞄准的是推理阶段。但要注意如果预处理和后处理仍然由主处理器承担那整体功耗的下降幅度会被稀释。我在设计时一般会把预处理也部分卸载到协同处理器上比如让它在数据进入乘加阵列之前先做定点量化和归一化这样主处理器只需要负责最外层的任务调度和结果解析。2. 协同处理器的架构选择与省电逻辑2.1 紧耦合与松耦合的取舍协同处理器和主处理器的连接方式直接决定了省电效果。松耦合方案通常是协同处理器挂在系统总线上通过DMA搬运数据主处理器通过寄存器配置启动推理。这种方式实现简单但每次推理前后都有总线握手和DMA配置开销对于小模型高频调用的场景不划算。紧耦合方案是把协同处理器做成主处理器的一个协处理单元共享部分缓存或者通过专用通道直连。这样数据交换延迟低、能耗小但设计复杂度高而且协同处理器的可编程性会受限。我的经验是如果视觉任务是持续视频流处理紧耦合更合适如果是间歇性图像分类松耦合的灵活性优势更明显。2.2 乘加阵列的规模与功耗平衡乘加阵列是协同处理器的算力核心但阵列越大功耗越高而且不是线性增长。因为阵列大了之后权重广播网络、部分和累加网络、时钟树的功耗都会上升。我做过一组对比测试在同样的28nm工艺下64×64的乘加阵列相比32×32阵列峰值算力翻了四倍但功耗翻了将近五倍能效比反而下降了。所以阵列规模要匹配目标模型的典型层尺寸。如果主要跑的是3×3卷积那阵列的行列数最好能整除常见的通道数避免出现大量空闲周期。我一般会先统计目标模型各层的通道数分布取一个出现频率最高的值作为阵列维度的参考再留一定的可重构空间。2.3 数据复用策略对功耗的影响卷积神经网络有个很好的特性权重复用和输入复用。协同处理器如果能把这两类复用做到位就能大幅减少数据搬运。常见的做法是设计行缓存和权重缓存让输入特征图的一行在多个输出通道计算中重复使用权重在多个空间位置重复使用。这里有个容易忽略的细节复用策略要和数据排布格式匹配。如果特征图是按通道优先存储的那行缓存的命中率会受影响。我在项目里一般会要求软件端把特征图转成通道块状排布让协同处理器一次能取到多个通道的连续数据这样缓存的局部性更好搬运次数能降下来三成左右。2.4 时钟门控与电压频率调节的配合协同处理器不是每时每刻都在满负荷工作。视觉任务有帧间间隔推理有层间依赖这些空隙都是省电的机会。时钟门控可以在没有有效计算时关掉部分模块的时钟电压频率调节则可以在低负载时降频降压。但这两者要配合好。我见过一些设计时钟门控做得很激进结果每次唤醒都要重新填充流水线反而增加了动态功耗。我的做法是设置一个负载阈值只有当空闲周期超过一定数量时才触发深度门控否则只做浅层门控。电压频率调节也是类似切换频率本身有开销频繁切换不划算一般按帧或者按任务阶段来调。3. 从模型到硬件的功耗优化链路3.1 量化精度与功耗的量化关系把浮点模型量化成定点是降低协同处理器功耗最直接的手段之一。32位浮点乘加单元的面积和功耗大概是8位定点乘加单元的四到六倍。而且定点数据位宽小了之后片上缓存能存更多数据搬运次数也跟着降。但量化不是越激进越好。我试过把某个检测模型直接量化到4位结果精度掉得没法用只能回退到8位。比较稳妥的路径是先做8位量化观察精度损失如果损失在可接受范围内就定下来如果损失偏大就对敏感层保留更高位宽其他层继续用8位。这种混合精度方案在协同处理器上实现起来需要在数据通路里加位宽转换逻辑会增加一点面积但功耗收益通常能覆盖这部分开销。3.2 稀疏化与零值跳过机制神经网络里有很多接近零的激活值和权重尤其是经过ReLU之后。协同处理器如果能在硬件层面识别零值并跳过对应的乘加运算就能省下可观的动态功耗。实现方式一般是在乘加阵列的输入端口加零值检测如果某个输入为零就门控掉对应的计算单元。这个机制的收益取决于模型的稀疏度。我测过几个常见模型ReLU之后的激活稀疏度大概在50%到70%之间权重稀疏度低一些经过剪枝后能到30%到50%。如果协同处理器能同时利用这两类稀疏性理论上的计算量能减少一半以上。但要注意零值跳过会带来控制逻辑的复杂度如果控制开销太大省下来的计算功耗可能又被控制逻辑吃回去了。3.3 层融合减少中间数据落盘视觉模型里有很多连续的小层比如卷积后面接批归一化再接激活函数。如果每层都单独执行中间结果就要写回缓存再读出来搬运功耗很可观。协同处理器如果支持层融合把这几层的计算合并成一个流水线中间结果直接在片上传递就能省掉这部分搬运。层融合对协同处理器的可重构性要求比较高因为不同模型的层组合不一样。我的做法是设计一套微码或者配置字让协同处理器能根据模型描述动态组合计算单元。这样虽然增加了配置存储的开销但相比省下来的搬运功耗还是划算的。3.4 内存层级设计与带宽匹配协同处理器的内存层级一般包括寄存器堆、片上SRAM、可能还有片外DRAM。寄存器堆最快最省电但容量小SRAM居中DRAM最慢最费电。设计的关键是让数据尽量在高层级停留减少向低层级的溢出。我通常会根据目标模型的最大特征图尺寸来定SRAM容量。如果SRAM能装下整个特征图那中间数据就不用往DRAM写功耗能降一大截。如果装不下就要设计分块策略让每一块的计算在SRAM内完成后再换出。分块的大小要匹配乘加阵列的吞吐率避免出现计算等数据或者数据等计算的情况。4. 实测中的功耗表现与调优经验4.1 功耗测量方案的选择测协同处理器的功耗不能只看芯片手册上的典型值。实际功耗和输入数据、模型结构、工作频率都相关。我一般会用几种方式交叉验证一是用功耗分析工具做RTL级仿真得到相对准确的动态功耗分布二是在FPGA原型上跑真实模型用外接功耗仪测整板功耗三是流片后用片上传感器读实时功耗。FPGA原型测出来的功耗和最终ASIC有差距因为FPGA的静态功耗和互连功耗占比高但用来做不同方案之间的相对比较是够用的。片上传感器的好处是能反映真实工作场景但精度和采样率有限适合做趋势观察。4.2 不同工况下的功耗波动视觉处理设备的功耗会随工况变化。我做过一组测试同样的协同处理器在室内正常光照下跑人脸检测和在夜间低照度下跑同样的任务功耗差了将近20%。原因是低照度下图像噪声大预处理阶段的去噪算法迭代次数增加而且推理时激活值的分布也有变化影响了零值跳过的效率。温度也有影响。夏季高温环境下芯片漏电增加静态功耗上升。我在一个户外项目里遇到过正午阳光直射时设备功耗比清晨高了15%左右后来加了散热片和动态频率调节才稳住。所以做功耗预算时不能只按常温典型值算要留出工况波动的余量。4.3 协同处理器与主处理器的功耗分配协同处理器降低了推理功耗但主处理器的功耗不一定同步下降。如果主处理器仍然要负责图像采集、预处理调度、结果后处理它的负载可能只是从重计算变成了重控制功耗下降幅度有限。我在优化时会看整体功耗而不是只盯协同处理器。有时候把预处理也卸载过去或者让主处理器在协同处理器工作期间进入低功耗等待模式整体收益会更明显。关键是找到任务划分的平衡点让两个处理器都工作在各自的高效区间。4.4 常见功耗异常与排查思路实测中最常见的功耗异常是待机功耗偏高。协同处理器在空闲时如果时钟没有完全关断或者缓存没有进入保持模式静态功耗会一直存在。我排查这类问题时会先看时钟树的门控配置再看电源域划分是否合理最后检查是否有模块在空闲时仍然被使能。另一个常见问题是峰值功耗超标。这通常发生在模型切换或者输入分辨率突变的时候协同处理器的数据通路突然满载瞬时电流拉高。解决办法一般是在任务调度上加平滑或者设计分级启动机制让计算单元逐步进入满负荷状态。5. 协同处理器方案的选型与落地建议5.1 自研还是采用现成IP如果团队有足够的数字设计能力和时间预算自研协同处理器能更好地匹配自己的模型和场景。但自研的风险在于架构设计一旦定型后期模型迭代时可能不够灵活。我见过一些团队为了追求极致的能效比把架构做得非常专用结果换了一个模型之后协同处理器的利用率大幅下降。采用现成IP的好处是省时省力而且IP厂商通常会提供配套的编译器和驱动。但现成IP的架构是通用的可能在某些特定层上效率不是最优。我的建议是如果视觉任务是核心业务且模型相对稳定可以考虑自研如果只是辅助功能或者模型还在快速迭代先用现成IP跑通再说。5.2 软件工具链的配套成本协同处理器的功耗优势很大程度上依赖软件能不能把模型高效映射到硬件上。如果编译器不够聪明生成了大量低效的调度和数据搬运硬件再省电也白搭。我在评估方案时会重点看工具链是否支持层融合、是否支持混合精度、是否能自动做内存分配优化。工具链的成熟度往往比硬件参数更重要。一个能效比稍低但工具链完善的方案实际落地效果可能比一个参数漂亮但工具链难用的方案好得多。因为前者能让团队把精力放在应用开发上后者可能光调通模型就要花几个月。5.3 功耗与精度的联合调优降低功耗和保持精度之间需要权衡。量化、剪枝、稀疏化这些手段都能省电但都会影响精度。我的做法是建立一个评估流程先确定精度的最低可接受线然后在这个约束下逐步尝试各种功耗优化手段每做一步就测一次精度和功耗找到性价比最高的组合。这个流程听起来简单但实际操作中要注意测试集的代表性。如果测试集和实际场景分布不一致优化后的模型可能在实验室里精度达标到了现场就崩了。我一般会留一部分现场采集的数据作为验证集确保优化方向不跑偏。5.4 面向未来的可扩展性考虑视觉模型在持续演进今天优化的架构可能明年就不够用了。协同处理器的设计要留一定的可扩展空间比如支持更多的算子类型、更大的片上缓存、更灵活的数据位宽。这些预留会增加一些面积和功耗但相比后期重新设计的成本还是值得的。我在项目里会预留一个可配置的算子库把常用的卷积、池化、激活、归一化都做成可参数化的模块。这样新模型出来时先看能不能用现有算子组合出来如果不能再考虑加新算子。这种渐进式的扩展策略比一开始就追求大而全要务实得多。6. 几个容易踩的坑和我的应对方式6.1 忽视数据排布转换的功耗很多人在评估协同处理器功耗时只算推理本身忘了数据排布转换的开销。如果主处理器输出的特征图格式和协同处理器期望的格式不一致就需要额外的转换步骤这个步骤可能涉及大量的数据搬移。我在一个项目里就吃过这个亏推理功耗降了40%但格式转换功耗增加了15%整体收益打了折扣。后来把格式转换也集成到协同处理器的输入通路里才把这块开销压下去。6.2 过度追求峰值能效比峰值能效比是在满负荷下测出来的但实际视觉任务很少一直满负荷。更多时候是间歇性推理中间有大量空闲。如果协同处理器在低负载下的能效比很差那整体功耗表现就不会好。我在选型时会特别关注低负载下的功耗曲线看看它在10%、30%、50%负载时的能效表现而不是只看100%负载的那个数字。6.3 忽略接口功耗协同处理器和主处理器、和内存之间的接口也是功耗来源。高速接口的功耗可能比计算单元还高。我在设计时会尽量用窄接口加高频率而不是宽接口加低频率因为宽接口的引脚多、驱动功耗大。另外如果数据可以压缩后再传输也能省不少接口功耗。6.4 功耗测试环境不一致不同团队测出来的功耗数据经常对不上原因往往是测试环境不一致。输入数据不同、温度不同、供电电压不同、甚至测试时间长短不同都会影响结果。我在做功耗对比时会固定一套测试条件同样的输入视频、同样的环境温度、同样的供电、同样的预热时间。只有条件一致数据才有可比性。7. 写在最后的一点个人体会折腾了这么多轮视觉处理的功耗优化我最大的感受是协同处理器不是万能药它只是把功耗问题从通用计算转移到了专用计算上。真正要降功耗得从模型、硬件、软件、场景四个层面一起下手。模型层面做量化和剪枝硬件层面做专用架构和内存优化软件层面做高效映射和调度场景层面做工况适配和动态调节。缺了任何一环效果都会打折扣。另外功耗优化是个持续过程不是一次性的任务。模型在变、场景在变、硬件也在迭代今天的最优解明天可能就不是了。我现在的习惯是每上一个新模型或者新场景都重新跑一遍功耗评估看看有没有新的优化空间。这个习惯帮我避免了好几次想当然的错误。如果你也在做类似的事情建议把功耗评估做成流程化、自动化的东西别靠人肉记忆和临时测试那样迟早会漏掉关键细节。
返回列表