十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

暗硅与机器学习加速器:如何在功耗墙内榨出算力

暗硅与机器学习加速器:如何在功耗墙内榨出算力 1. 暗硅问题功耗墙正在偷偷关掉你芯片上的核心如果你跟一个搞芯片架构的人聊到最近十年的处理器设计几乎绕不开一个有点反常识的现象晶体管越做越多但真正能同时干活的晶体管比例越来越低。这不是工艺不行而是功耗撑不住。我最早对这个问题有体感是在做嵌入式AI加速方案选型的时候。当时在评估一款边缘侧的NPU芯片标称算力有4 TOPS跑INT8卷积看起来很猛。但真正把整个SoC装进一个5W散热功耗的设备里发现CPU、GPU、ISP、NPU根本不能同时满载——一旦NPU拉满跑人脸检测CPU这边稍微跑点逻辑整颗芯片的温度就直奔85度然后触发降频。那一刻我意识到的不是“这芯片散热差”而是一个更深层的行业规律芯片设计的瓶颈早就不是面积而是功耗。这就是暗硅Dark Silicon问题的现实样本。这个概念最早被正式提出是2011年前后一批来自UCSD等学校的研究者在ISCA上发了一篇文章预测随着制程节点继续微缩晶体管密度会按照摩尔定律持续翻倍但供电和散热能力跟不上导致芯片上很大比例的晶体管在任意时刻必须处于断电状态。他们当时估算在22nm节点以后在某些功耗约束下芯片上超过50%的晶体管不能同时工作。这些“被关掉”的区域就是暗硅。为什么不该点亮的晶体管越来越多道理其实很朴素。你把晶体管的尺寸缩小一半同样面积的芯片上能塞进去的晶体管数量变成四倍但功耗密度并不会同比例下降——漏电流、开关功耗、互连功耗都在那里。功耗密度一旦超过散热系统能带走的极限芯片就会热失控。所以芯片设计者只能把晶体管当作“轮流上岗”的资源池这块区域跑图形那块区域就跑不了AINPU满载CPU就得靠边站。于是暗硅变成了一个很有意思的设计约束你不是没有面积你是有面积但没有功耗预算去点亮它。问题一下子从“怎么把更多晶体管塞进去”变成了“塞进去的这些晶体管到底该用来做什么”。而机器学习加速器之所以在暗硅时代成为一个核心方案正是因为它恰好站在了这个问题的答案位置上。2. 为什么机器学习加速器恰好是“暗硅的解药”我一直觉得“机器学习加速器作为暗硅解决方案”这个提法翻译成人话就是反正芯片上有大面积晶体管闲着也是闲着不如做成专干深度学习这活的模块等有任务的时候再点亮它。这个思路能成立靠的是三个非常硬的条件。2.1 功耗受限但面积充裕暗硅区域是天然的“预留位”假设你有一颗28nm的SoC面积大约100平方毫米预算功耗在3W左右。按照当今的工艺和IP选择如果全部用通用CPU核心填满这块面积每个核心的功耗都相当可观3W预算根本不够同时点亮所有核心。这时候你面临两个选择要么少放CPU浪费面积要么放一堆CPU但同一时间只能用一部分——那剩下的部分就是暗硅。但如果把这块面积的一部分做成专用加速器情况就完全不同了。专用加速器的核心特征是它只为一种计算模式设计。跑CNN卷积时它的能效比通用CPU高一个数量级以上——单位算力对应功耗低得多。同样是完成一个目标算力专用加速器所需的功耗预算比通用核心小很多这导致同样3W的预算下你可以在暗硅区域内“合法地”点亮一个不小的加速器。更关键的是机器学习工作负载本身是间歇性出现的。你不可能永远在跑人脸识别或语音唤醒大多数时间里这块加速器保持完全关断状态对整体功耗预算几乎没有贡献。而一旦检测到特定任务控制逻辑把它唤醒它就能在极短的时间内完成运算然后再次休眠。加速器成了暗硅区域的“特权租户”——平时不出租一旦干活就干得又快又省电。2.2 深度学习计算模式的天然红利并行、容错、规律不得不承认深度学习这种负载太适合做成专用硬件了。它跟我们以前遇到的通用计算负载有本质区别并行度极高卷积、矩阵乘、全连接本质都是一堆乘累加MAC操作成千上万个神经元输入之间没有数据依赖。这让它将晶体管做成一排排简单的乘累加单元不需要复杂的分支预测、乱序执行、缓存一致性协议。容错性强神经网络对单个计算节点的精度要求并不苛刻。你用INT8甚至INT4来做推理准确率损失很小。这让加速器可以采用更激进的低精度计算单位功耗下的算力可以成倍提升。访存模式非常规律卷积的输入特征图是固定尺寸、按滑动窗口扫描的权重的复用模式几乎不会变化。这种规律性让硬件设计者可以精准安排数据流水线用很少的动态调度逻辑就达到很高的利用率。这三点的效果叠加让专用加速器的能效比远超通用CPU。一个典型的数字对比是在28nm工艺下CPU跑卷积的能效大约只有几十GOPS/W而设计得当的NPU在相同工艺下能跑到几百甚至上千GOPS/WINT8。十几倍的能效差距意味着你在暗硅区域里放一个NPU等于在同样的功耗预算下凭空多出了数倍于CPU性能的算力。2.3 暗硅不只是“放置硬件”更是“管理硬件”需要强调的是把加速器当作暗硅解决方案绝不只是物理上把NPU宏单元摆到芯片上那么简单。它背后是一个复杂的运行时管理系统。我在实际做SoC级能效优化时最大的工作量反而不是加速器本身而是如何动态决策“现在该点亮哪块计算区域”。这其实是在暗硅框架下处理名为“功耗预算调度”的问题。CPU、GPU、NPU、DSP这些计算单元共享同一个功耗上限系统需要根据当前负载类型来决定给谁加频、给谁降频、给谁完全断电。机器学习加速器的工作负载通常是异步到达的可能上一秒在刷网页CPU密集型下一秒切到拍照场景ISPNPU密集型。一个设计良好的调度器需要在几十微秒内完成功耗预算的重新分配否则就会出现“NPU醒了但CPU不给数据”或者“全部模块半速运行”的尴尬场景。所以严格来说“机器学习加速器作为暗硅解决方案”包含两层含义第一层是架构层面的把专用加速器塞进原本用不上的晶体管区域第二层是系统层面的通过动态管理让这些加速器只在任务到来时短时间点亮从而在功耗预算内实现“暗硅变亮硅”。3. 加速器如何在功耗预算内“偷”出性能量化、稀疏与数据复用如果说前两章回答了“为什么是加速器”那这一章要回答的问题是把晶体管做成加速器之后靠哪些具体手段让它在有限的功耗预算内榨出算力。我拆解几个最核心、也最影响实际落地的技术手段。3.1 低精度量化用比特数换能效量化是机器学习加速器最直接、最有效的“节能器”。这事儿的原理不复杂一个8位整数乘法器的功耗通常比一个32位浮点乘法器低一个数量级而如果把数据通路、寄存器堆、片上SRAM全都压缩到INT8整个加速器的面积和功耗都会显著下降。我在实际项目里常用的一个经验是模型从FP32切到INT8推理精度损失一般在0.5%2%的范围内对绝大多数任务完全可接受而加速器能效通常能翻3~4倍。如果是使用INT4、INT2这类极端量化能效提升更大但需要做精细的量化感知训练Quantization-Aware Training否则精度崩得很快。当前主流的NPU设计基本都支持混合精度敏感层用INT16保持精度非敏感层用INT8/INT4侧重能效。这里有个容易踩的坑量化不只是改计算精度还得改数据搬运格式。你计算单元已经用INT8了但如果片上缓冲和主存DDR之间的数据总线还是按FP32的位宽来设计那访存带宽就被浪费了。好的加速器设计会把整个数据通路从取指到权重读取到累加器统一到量化位宽之下这样才能真正把功耗省下来。我在做一次NN加速器评估时遇到过一个有趣的现象同样的模型在A芯片上量化到INT8后性能提升显著但在B芯片上提升很小——后来一查B芯片的片上总线位宽没有跟着量化位宽走DRAM带宽成了瓶颈算力再快也在等数据。3.2 稀疏化跳过为零的“假想敌”神经网络里有大量参数和中间激活值是零——尤其在ReLU激活函数之后大约50%甚至更多的激活值直接变成0。如果硬件能“跳过”这些零值计算那么同等功耗预算下的有效算力几乎翻倍。稀疏化有两种实现路线权重稀疏和激活稀疏。权重稀疏是训练时把小的权重裁剪归零硬件侧做权重压缩只存储非零权重配合一个索引表在运行时查找对应输入。激活稀疏则是运行时动态跳过那些ReLU后为0的通道。我在实际项目里做过一组对比实验在一个基于稀疏化的NPU上对一个人脸识别模型做60%权重稀疏化之后推理延迟降低了接近40%功耗则下降了近三分之一而准确率损失控制在1%以内。但稀疏化的硬件设计比量化复杂得多数据在内存里的分布变得不规律需要额外的索引逻辑如果稀疏度不够高这些索引本身的存储和计算开销反而会吃掉性能。所以今天的加速器很少全稀疏更多是“部分结构化稀疏”比如只在通道维度上做剪枝让硬件可以用规则的方式跳过整个通道而不用在单个权重级别做复杂判断。3.3 数据复用把数据留在片内少访存业内有个很经典的说法功耗的大头不在计算在数据搬运。一个FP32乘法大概消耗几pJ但从DRAM读取一个32位数据需要几百pJ差了不止一个数量级。所以加速器设计的核心策略就是让数据尽可能地在片上多复用几轮减少对主存的访问。以卷积为例一个3x3卷积核在特征图上滑动时同一个输入像素会被多次使用到。设计良好的加速器会采用脉动阵列Systolic Array或片上行缓存Row Buffer把输入数据暂存在SRAM里配合数据流水线让它被乘累加单元反复读取。Google TPU的脉动阵列是这个思路的典型代表——权重和输入流按固定节奏在阵列中流动每个乘累加单元只跟相邻单元通信数据搬运距离极短功耗也因此大幅度降低。在实际操作中一个重要的调优维度是分块大小Tiling。你必须根据加速器的片上SRAM容量来切分特征图和权重块太大放不下块太小片上复用效率就低频繁搬运数据会显著拉升功耗和延迟。3.4 动态电压频率调节DVFS的巧妙配合最后一条也是实际系统中最常用、但很少被单列出来的手段DVFS与加速器的协同调度。加速器不是每时每刻都需要全速运行的。比如在语音唤醒场景下每几百毫秒才有一个推理任务每个推理任务只需几十毫秒完成。这时候如果你让NPU一直跑在1GHz功耗就是白白浪费的。我的做法是把加速器的工作模式分成三档全速跑重负载、慢速跑轻负载、关断不干活时彻底断电。调度器根据待处理任务的队列深度来动态切换。这个策略的效果非常显著——我们在一个端侧项目里把语音唤醒模块的平均功耗从300mW降到了80mW靠的就是“平时关掉、进来音频帧才唤醒、算完立刻回去睡”这个策略。当然你需要考虑唤醒延迟从关断状态到能执行第一条指令通常需要微秒级别的流水线启动时间。对于语音唤醒这种任务完全够用但对实时性要求极苛刻的场景可能就需要保持“低频待机”而不是“彻底关断”这本身就是一种功耗和延迟之间的工程取舍。4. 从TPU到NPU真实芯片如何分配暗硅区域聊完技术手段我把视角从学术层面的设计原理拉回现实的产品。过去十年很多商业芯片实际上已经在践行“机器学习加速器作为暗硅解决方案”这个理念。理解这些真实案例对你判断自己项目里的加速器选型会很有帮助。4.1 Google TPU典型的“暗硅专属区域”TPU的设计背景是Google的数据中心里有大量面向搜索排序和深度学习的推理请求。这些请求对算力的需求很大如果用CPU跑服务器的功耗和散热成本会飙升而数据中心机器上CPU的利用率在很多时段并不高如果专门为AI在服务器里加插一块PCIe加速卡就等于把这块PCIe区域变成了“只在推理请求到达时才点亮的暗硅”。TPU的设计哲学完全是为这个场景服务的芯片上堆了大量脉动阵列乘累加单元而没有复杂的缓存一致性协议甚至不需要支持虚拟内存。它只能干矩阵乘这类深度学习核心操作但在这些操作上的能效远超CPU和GPU。数据中心服务器平时该跑业务跑业务当有推理请求时请求被路由到TPU卡上TPU在几毫秒内完成计算并把结果返回然后继续闲置。这个分配模型并非逐周期切换而是在整块加速卡的维度上实现了“按需点亮暗硅”。4.2 手机SoC异构“暗硅调度”的极致战场手机SoC是我认为暗硅调度策略最成熟、也最值得研究的平台。以高通、苹果、联发科的旗舰芯片为例它们普遍集成了CPU大中小核、GPU、NPU或叫AI引擎、DSP、ISP等大量计算单元芯片面积和功耗预算都极其紧张。手机的工作负载特性决定了不可能所有模块同时点亮。你点亮NPU做实时人像虚化GPU就要让出功耗你长时间玩大型游戏NPU索性彻底关断把功耗预算全让给GPU。为了管理这种动态切换现代手机SoC里都有一个功耗管理微控制器以毫秒级精度监控各模块的硬件计数器和相应状态动态调节各模块的电压频率甚至完全断电。在这个体系里NPU被当作一个“战术性暗硅加速器”它的物理位置在芯片上占据适当面积但功耗预算的授予权在系统手里。值得注意的是手机厂商正越来越多地让NPU参与到“总功耗控制”里而不仅仅是充当独立的AI计算单元。比如在视频通话里NPU跑人像分割网络同时ISP根据NPU输出的掩膜调节对焦和AE——这不会让所有模块同时满负荷运转而是让“功耗敏感模块ISP”“感知模块NPU”等多方联动从系统层面分摊本应由单一模块承担的计算压力。4.3 NVIDIA GPU从通用计算到专用张量核心GPU的演进路径也有代表性。在早期GPU的主要矛盾是通用计算和图形渲染互相挤占功耗。Ampere架构开始大规模引入Tensor Core之后GPU实际上变成了一个“可重构的暗硅管理大师”同一块芯片上既可以激活大量CUDA核心做通用计算也可以关闭部分CUDA核心、转而密集执行Tensor Core做AI训练。实践上有一个有意思的现象在训练一个中等规模的Transformer模型时我观察到GPU的Tensor Core利用率可以到百分之七八十但同一个GPU做通用数据预处理时Tensor Core完全闲置。这意味着芯片上实际有很多区域始终处于暗硅状态只是在不同阶段被点亮了不同部分。NVIDIA通过CUDA编程模型让开发者能明确指定“用哪个模块”本质上就是让软件来做暗硅区域的“点亮决策”。5. 暗硅没有消失加速器方案的边界与后遗症走到这一章我不得不泼一点冷水。机器学习加速器确实是暗硅问题的一个好答案但它不是万能答案。在实际的芯片设计项目中我遇到不少团队把NPU当成救世主最后却发现暗硅问题只是转换了形态并没有消失。我想把几个最具代表性的边界问题和后遗症说清楚。5.1 暗硅预算的分配困境要什么加速器都放不等于都放得下一个很容易被忽视的事实是机器学习加速器的类型也在不断分化。有面向CNN的NPU、有面向Transformer的加速器、有面向点云处理的专用单元、还有面向图神经网络GNN的加速器——每一种都针对不同的数据流模式做了专门优化它们之间互不通用。你不可能把所有种类的加速器都塞进一个SoC因为每个加速器即使在休眠状态下也会占用面积和漏电功耗这本身就是暗硅的组成部分。我在与硬件团队合作时最常见的争论就是“到底该放通用NPU还是专用加速器”。如果放通用NPU它什么网络都能跑但效率一定不如专用加速器如果放专用加速器效率倒是高但一旦下一代算法换了个网络结构这个加速器可能就变成了永久暗硅。目前的产业共识逐渐倾向于“通用NPU少量可配置扩展单元”的组合通用NPU跑主流网络扩展单元针对特定算子比如稀疏Transformer解码做优化同时保留一定的配置能力以避免硬件过时导致整块区域长期闲置。5.2 控制逻辑和片上网络容易被低估的功耗放大器加速器本质上是“专精计算”的代表但它并不是孤立的一块。要让一个NPU工作周围必须有指令发布逻辑、多级缓存控制器、与主存之间的NoC片上网络路由、电源门控和电压调节电路。这些支持逻辑在加速器运行时也在消耗功耗而且它们的功耗并不跟计算单元的利用率线性挂钩——即使乘累加单元满了控制逻辑的功耗可能已经占到整个NPU的20%甚至更高。我在一次功耗分解测试中把NPU的功耗拆开看乘累加阵列占55%SRAM读写占25%互连和控制逻辑占15%其他占5%。如果你的加速器工作负载主要是小批量、短任务那么控制逻辑和流水线启动/排空产生的功耗占比会进一步上升。这提醒我们加速器不是越大越好也不是越快越好而是要跟目标工作负载的“主控比”匹配。很多场景下一个小而简洁的NPU反而比一个大而复杂的NPU更实用因为它的“暗硅后台开销”更低。5.3 编程模型与软件栈暗硅需要“软件唤醒”而非“硬件自启”硬件把加速器放到芯片上只是第一步真正决定它能不能被用起来的是软件栈。我见过不少项目加速器的标称算力很高但因为驱动不成熟、算子库缺失开发者在应用里根本调不起来——这块高算力区域变成了名副其实的永久暗硅。这个问题的复杂性在于算法结构日新月异新的算子层出不穷。硬件加速器必须跟编译器、运行时环境配合才能在模型变更时仍保持高效。一个健康的加速器软件栈至少包含算子库支持常见卷积、归一化、激活、图编译优化器负责算子融合、内存规划、量化插入、运行时调度器负责在应用程序里动态加载模型和分发任务。三者缺一不可。我在评估一个NPU SDK时会重点看这几个部分的质量而不仅仅是看它的Paper spec算力数字。有时候“软件不成熟”比“硬件算力不足”更加致命因为前者意味着你再怎么优化硬件配置都无法激活那块暗硅区域的计算能力。5.4 功耗墙不会消失加速器只是局部缓解最后得回到一个物理常识功耗墙不因为有了加速器就消失它只是把“通用计算全部点亮”这件事变成了“通用计算部分点亮专用加速器按需点亮”。如果芯片里同时有CPU、GPU、NPU并且它们满负荷运行整颗芯片的功耗一样会超出预算。因此系统级的功耗管理器仍然是不可省略的核心组件。我做的项目里加速器落地最关键的一步不是调通算子而是跟系统功耗管理框架对接NPU怎么上报自己的功耗估算值功耗管理器如何在多个计算单元之间仲裁这些问题的复杂程度往往远超加速器本身的设计。6. 一个被低估的现实问题暗硅加速器的“冷启动”成本在工程实践中有一个细节很少被论文提及却在真实系统里至关重要——加速器的冷启动成本。所谓冷启动就是从加速器处于休眠状态到它能够稳定执行第一条指令之间那些看似琐碎的额外开销。暗硅的核心理念是“平时关着用时点亮”但“用时点亮”这个动作本身是有成本代价的。具体来说包括电源门控开关的延迟和瞬态电流、PLL和时钟树的稳定时间、片上SRAM的初始化、权重和激活数据从DDR加载到片上缓冲的时间甚至还包括通信总线从低功耗状态唤醒的时间。这些时间加在一起可能从几百纳秒到几百微秒不等。对于传统的数据中心场景这个成本不算什么但对于实时性要求极高的边缘设备比如自动驾驶的感知管线、工业机器人的控制回路几十微秒的唤醒延迟可能就会错过一个控制周期。我在做端侧视觉加速时遇到过一个很实际的痛苦把NPU的电源门控打开之后第一帧推理的延迟通常明显高于后续帧——除了常见的时间消耗在权重加载上还有很大一部分是时钟稳定和流水线排空造成的。为了规避这个问题我会在调度器里加入一个“预热”机制在预测到即将有推理任务时提前几十微秒把NPU切入低速工作状态让时钟和电源稳下来等真正的任务数据到位后再安全升频。这个机制让我在不牺牲太多待机功耗的前提下把首帧延迟降到了完全可接受的范围。这块的启示是暗硅解决方案在架构上说得通但在系统设计里你需要把“暗→亮”的切换成本算进整体预算。如果你的工作负载是持续到达的流式任务也许保持加速器常开反而更优如果是稀疏的异步任务那么关闭和唤醒的策略就值得仔细调优。7. 我的实战心得把“暗硅思维”落到自己的芯片项目里前面聊了这么多架构层面的东西最后我想把角度收回到具体设计决策上。毕竟对于真正在做项目的工程师来说“机器学习加速器作为暗硅解决方案”不是一个论文标题而是一系列需要拍板的工程选择。第一个建议是先测量再设计。在决定要不要在芯片里放一个NPU、放多大的NPU之前尽量拿到目标工作负载的功耗和延迟 profiling 数据。如果没有真实数据哪怕用模拟器或者FPGA原型估一下也算数。我见过太多团队凭“感觉”定义算力指标结果要么算力浪费要么面积超支。暗硅问题的本质是功耗预算而功耗数据只能来自测量或者足够精细的仿真。第二个建议是给加速器留出软件调优空间。这块我在第5章提过但值得再说一遍。硬件加速器一旦流片其结构就固定在硅片上了但算法在变、算子在变。与其把硬件设计极致地贴合某一种网络结构不如在指令集、数据格式、张量排布这几个维度上留出弹性。我见过的最成功的边缘NPU项目不是那些spec最漂亮的而是那些编译器团队能三个月迭代一个新算子支持的——这种“软件可演进性”才是长期保持加速器区域始终“亮着”的核心。第三个建议是别忽视暗硅区域的“税”。每一个加速器宏单元都占用面积、漏电和功耗每一条给它供电的电源轨都要占用封装引脚和PCB面积每一片为了协调它在SoC上运行的逻辑都会增加验证工作量。这些几乎等同于“虽然这块区域是暗的但你还是要为它交税”。所以加速器数量不在多而在精——如果你的工作负载只有两三个网络形态需要加速那就只做两个针对性强的加速器比做一个“万能但复杂”的加速器更稳。说实话暗硅问题并不存在一个完美的终结解。制程节点继续微缩功耗密度继续上升晶体管继续增多——这个缺口会一直存在。机器学习加速器为什么能成为一个主流答案根本上是因为它顺应了两个趋势一是AI工作负载在快速普及加速器能创造明确的价值二是专用硬件的能效优势大到可以覆盖“灵活性不足”这个短板。只要这两点没有反转加速器作为暗硅解决方案的地位就不会被替代。但作为工程实践者我更愿意把“暗硅思维”理解为一种设计哲学不要试图让所有晶体管在每一个瞬间都在工作而是让每一块晶体管在最需要它的那个瞬间能拿出最高效的表现。这个思路放之四海而皆准。
返回列表