降低 AI 能耗的 11 种方法

来源:众壹云 发布日期:2021-07-20 09:13

随着机器学习行业的发展,重点已经从仅仅解决问题扩展到更好地解决问题。

“更好”通常意味着准确性或速度,但随着数据中心能源预算的激增和机器学习的边缘化,能源消耗已经取代准确性和速度成为一个关键问题。有许多神经网络方法可以减少能源消耗。

“每个人都在寻找实现神经网络的替代方法,这些方法的功耗要低得多,” Cadence定制 IC 和 PCB 部门软件工程组总监 Elias Fallon 说。

其他人同意。Synopsys数字设计组研发、AI 和 ML 解决方案总监 Venki Venkatesh 表示:“谷歌本身担心神经网络创建和训练过程中的能力。”

每个关于神经网络的决定都会对能源产生影响。模型本身影响功率,实现硬件的选择也是如此。虽然性能和功率历来相互对立,但许多低能耗选择也可以提高速度。较低能量的实现可能更容易影响准确性。

我们经常谈论“电力消耗”,好像电力是可以消耗的东西。但功率是能量消耗率。“对于制造这些东西的芯片供应商来说,功率非常重要。他们需要正确地设计电源轨和电压,”Cadence 的 Tensilica AI 产品产品营销总监 Suhas Mitra 说。“但对于 IP 选择来说,更重要的是更低的能量。”

换句话说,如果限制是热量,那么功率是最重要的。如果限制是电池寿命,那么重要的是能耗,而不是功率。

“能量饱和会变成功率饱和,因为一旦芯片超过几百瓦,你就无法冷却它们,”Lightmatter 的首席执行官尼克哈里斯说。“然后就变成了,'我不能用晶体管来做计算工作。'”

更少的计算和更少的数据意味着更少的能源消耗。这推动了许多降低能源使用的架构方法和特定策略。此外,更少的数据移动意味着更低的能耗。这些想法可以独立运作,也可以堆叠在一起以节省更多。

1. 较小的模型。在所有其他条件相同的情况下,较小的模型将具有更少的层和更少的过滤器,因此需要更少的计算和更少的内存。

Synopsys ARC 处理器研发总监 Fergus Casey 表示:“我们已经看到在相同数据集上工作的图形之间的计算存在一个数量级的差异。“有时,针对较低计算要求而优化的图形甚至不会降低结果的准确性。”

不幸的是,在这里简单地选择一个较小的网络进行训练可能不是一个好的解决方案。在奥卡姆剃刀可以发挥巨大作用的领域,当前趋向于更大模型的趋势指向了挑战。如果较小的模型总是足够的,那么就不需要大模型了。然而,它们不断变大。

这是由于需要更高的准确性和更复杂的决策。在更广泛的训练样本中做得更好可能需要更大的模型。在样本领域内处理更多细微差别(区分那只看起来像猫的狗和一只看起来像狗的猫)也可能需要更多的重量。

正如我们将看到的,有一些想法可以在战术基础上缩小模型,但如果 MobileNet 足以应付一切,那么我们就不需要 YOLO。相反,当计算平台和能源需要时,会选择较小的模型,并将准确性作为潜在的权衡。

2. 移动较少的数据。鉴于人们普遍承认撞击内存墙的影响,这可能是最明显的能量缓解措施。这里的解决方案本质上是高度架构的。

虽然先前的方法建议减少数据,但内存墙与其说是减少数据,不如说是减少数据的移动和缩短距离。对于给定的数据量,架构可能是一个决定性因素。

最坏的情况是单个 CPU 处理整个网络。对于每个计算数据,必须再次获取、操作和存储以备后用。还必须为给定的一组操作数提取和解码指令。开销占主导地位,损害了功率和性能。

在频谱的另一端是权重保持驻留并且激活在芯片内逐步向前移动的架构。通过使芯片足够大以包含整个模型,重量可以加载一次并留在原地。通过在每个过滤器级的输出端放置一小块 SRAM,激活可以流向附近的单元进行进一步计算,而不必一直回到 DRAM 并在以后再次被带出。

然而,保持重量固定只是一种选择。“对于传统卷积而言,权重平稳可能最有效,但非批量全连接层在输入平稳或输出平稳模式下效率更高,”凯西说。后者是指生成一个单一的、几乎最终的结果,而不是存储和稍后组合一系列部分结果。

在这个领域,电力和消耗的能源之间的区别可能会有很大差异。理论上,如果计算全部通过消耗 x 能量的单个核心进行,那么 y 计算消耗的能量将是 x 乘以 y。

如果使用足够的内核来构建相同内核的阵列以并行处理所有计算,那么您将有 y 个内核执行 1 个计算,而不是 1 个内核执行 y 个计算。消耗的能量应该是相同的,但并行版本在更短的时间内消耗能量的事实使它具有更高的功率。

另一种提高局部性的方法是尽可能多地靠近数据源进行计算。Fraunhofer IIS自适应系统工程部高级系统集成组组长兼高效电子部门负责人 Andy Heinig用传感器融合示例说明了这一点。“对于不同的任务,将数据处理拆分到不同的地方是非常重要的,”他说。“第一个处理步骤应该直接在传感器上进行,然后在边缘节点上进行进一步处理,该节点汇总了来自不同传感器的信息。”

在像汽车这样的应用中,传感器分布广泛,因此可能需要一些计算中心来将所有传感器折叠起来。“有些决策只能在中央处理器上完成,因为只有来自所有可用的传感器,”Heinig 补充道。最小化中央计算意味着从车辆远端馈送的数据更少。

通常,有效的编译器可以通过谨慎使用缓存、FIFO 和/或 DMA 操作来优化数据移动。

在所有其他条件相同的情况下,这种架构选择不应影响准确性。

3. 减少计算——在可能的情况下。对于给定的模型,可能有一些方法可以用更少的操作来计算结果。卷积的一个流行示例是Winograd方法。

“使用卷积的 Winograd 变换可以显着减少大型张量运算所需的计算数量,从而显着降低过程中的功耗,” Arm机器学习部门产品营销副总裁 Steve Roddy 说。

卷积矩阵乘法的直接方法的规模约为 n 3,而 Winograd 将其减少到 n 2。特别是,它以额外的“弱”计算(加法)为代价减少了“强”计算(乘法)的数量。

激活函数的选择也很重要。“依赖 tanh 作为激活函数的小模型可能不如使用简单 ReLU 的稍大模型有效,”Casey 指出。

执行模型的选择也很重要。与直接为底层硬件编译的模型相比,使用解释型方法(如 TensorFlow Lite 或其他等效方法)可能会消耗更多能量。

4. 批处理有帮助——在可能的情况下。对于某些应用程序,例如处理静态图像或帧的集合,可以通过增加批量大小来提高效率。这意味着处理资源的给定配置——内核代码和权重——可以在更多样本上分摊,从而减少数据和指令提取。

但这仅适用于某些应用程序。并且它通常仅适用于数据中心实施,其中正在对已经驻留的大量样本执行操作。

边缘应用程序通常一次接收一个数据包。根据定义,它们必须先完成对单个数据包的处理,然后才能开始处理下一个数据包。因此,这种技术不适用于一些最常使用它的实现——小型电池供电的边缘设备。

批处理也不影响准确性。从大量数据中同时获得的结果应该与一次完成一个完整样本的相同处理没有什么不同。

5. 数据格式很重要。通过在计算中使用最精确的数字将获得最高的精度。这就是训练通常涉及浮点数的原因。

但是浮点电路比整数电路消耗更多的能量。用更多位表示的整数比用更小的位宽表示的整数使用更多的能量。

量化为整数很常见,但并不普遍。在它完成的地方,许多公司似乎都在使用 8 位整数。但研究人员也在研究更小的整数——4 位、2 位,甚至 1 位。这意味着更少的数据存储和移动。

限制是单比特实现,它产生了所谓的“二元神经网络”或 BNN。The Linley Group 总裁兼首席分析师 Linley Gwennap 在 Linley Spring 2021 会议上说:“这不仅减少了计算量和内存量,而且实际上可以完全摆脱乘法电路。” “当你只有一位乘以一位时,它是一个执行该功能的 XNOR 逻辑门。因此,这是在计算和功耗方面的巨大节省。”

这里的权衡是准确性。“当你做出这些权衡时,你会从浮点到量化版本,再到较低的位精度,”Mitra 说。“奇妙的部分是所有这些事情都是可能的。人们忘记的部分是没有什么是免费的。”

模型在量化后可能需要重新训练,以便再次恢复准确度。量化感知训练可以通过将所需的位宽合并到原始训练中来提供帮助,从而可能避免下游再训练步骤的需要。

还可以通过允许不同的层具有不同的精度来调整精度。训练框架支持这一点,平衡了对低能量和更高准确度的需求。

一些公司花费了大量精力寻找在不损害准确性的情况下减少数据大小的方法。“IBM 能够实现从 INT8 到 INT4 的相同精度,这令人印象深刻,”Gwennap 说。“即使使用 2 位整数,精度也在百分之一或两个以内。”

如果要保持准确性,减少数据大小可能会产生一种副作用。“通常网络的大小随着数据类型的减少而增加,”Heinig 说。“绝对有一个甜蜜点。但最佳位置可能是特定于应用程序的。”

6. 稀疏可以提供帮助。神经网络计算都是关于向量和矩阵数学的。理论上,计算量仅由矩阵大小决定。但是 0 值条目会创建一个先验已知的零乘法结果。无需运行计算。因此,为 0 的向量或矩阵条目越多,需要的真实计算就越少。

原则上,一个原始模型自然可能比其他模型更稀疏。在这种情况下,利用这种稀疏性没有任何折衷。但通常,矩阵或向量并不是真正稀疏的,它们可能具有非常小的数字条目。想法是这些条目对整体结果的影响可以忽略不计,因此可以将小数字更改为 0 以增加稀疏性。

这可以在模型开发期间通过修剪太小的权重来完成,从而导致更稀疏的权重矩阵。它也可以实时激活,取决于选择的激活函数,从而导致更稀疏的激活向量。

Nvidia 有一个动态版本,涉及屏蔽零值权重。这增加了电路的复杂性,同时比其他方法更大程度地利用了稀疏性。

Nvidia 的方案可以通过对非零值进行聚类并使用掩码来确保这些值乘以适当的激活值来利用不同位置的稀疏性

图 1:Nvidia 的方案可以通过对非零值进行聚类并使用掩码来确保这些值乘以适当的激活值来利用不同位置的稀疏性。资料来源:林雷集团

权衡再次是准确性。例如,当给定的权重被修剪掉时,假设它不会真正对结果产生有意义的差异。这可能是真的 - 对于那个重量。但是如果大量的权重被剪枝,那么累积的结果可能会降低精度。

出于同样的原因,引入稀疏性可能不会对给定的激活产生太大影响。但如果这种情况发生在每一层,那么错误就会累积,从而降低准确性。

7. 使用压缩。对于给定的稀疏程度,压缩可以帮助减少四处移动的数据量。在设计时,权重可以以解压缩硬件为代价进行压缩。在运行时,可以以压缩和解压缩硬件为代价来压缩输入或激活。

英飞凌系统工程师、技术人员高级成员 Ashutosh Pandey 指出:“解压的能源成本远低于获取额外位所需的能源成本。”

这种压缩,假设它是无损的,应该对准确性没有影响。

8. 聚焦事件。视频由一系列按顺序排列的图像组成。每一帧都会与前一帧不同——有时很大,但更多时候是微妙的。例如,单个对象可能在框架中移动,而背景保持静止。

传统方法对每一帧的静止信息进行重新处理。随着时间的推移,这是很多冗余处理。另一种方法是仅将计算重点放在流中发生的变化上。这通常比全帧少得多,从而减少计算和内存。

这可以使用标准的神经网络架构来完成,但只关注变化。对于第一帧,必须处理整个帧。对于连续帧,可以在当前帧和先前帧之间进行“差异”,仅将工作定向到发生变化的那些部分。

这些变化被归类为“事件”,这种架构是一种“基于事件”的方法。GraAI Matter 是一家公司的例子,该公司拥有或多或少的传统网络,但在事件领域中有效。

这个想法的另一个实现是尖峰神经网络,或 SNN。SNN 被认为是神经形态的,它们的结构与更传统的人工神经网络 (ANN) 不同。英特尔的 Loihi 项目是对 SNN 的大规模尝试。BrainChip 有一个更温和的商业产品。

尖峰神经网络模仿大脑,通过关注事件来降低能力

图 2:尖峰神经网络模仿大脑,通过关注事件来降低能力。资料来源:林雷集团

目前尚不清楚使用基于事件的方法是否会对准确性产生特定影响。

Casey 指出了基于事件架构的一个挑战:由于缺乏同步,“完全事件驱动的 SNN 将无法利用任何矢量化。” 这会导致计算效率降低——这可能会返还一些节省的能量。

9. 使用模拟电路。 模拟实现可以比数字版本消耗更少的能量——尤其是在对模拟信号进行计算的情况下。将模拟转换为数字会消耗大量能量,因此如果可能,留在模拟域中可以节省能量。“您可以使用模拟计算将功耗降低 10 倍、20 倍或更多,”Gwennap 指出。

如果传入的传感器流具有低级别的相关数据,这可能特别有效。通过不将不相关的数据转换为数字进行分析来节省能源。Aspinity 是公司遵循这条道路的一个例子。

内存计算 (IMC) 也利用模拟,但它在其他数字芯片中具有模拟岛。数字数据必须精确转换为模拟数据进行计算,然后结果必须精确转换回数字数据,从而降低整体节能效果。但声称模拟领域的节能仍然使其成为净能源赢家。Mythic 是使用这种技术的公司的一个例子。

IMC 可以通过两种方式降低功耗。“不需要从内存中获取数据是一个压倒性的因素,”英飞凌 RAM 产品线的应用工程和产品营销、内存解决方案高级总监 Ramesh Chettuvetty 说。“但另一件事是 IMC 大大提高了计算并行性。”

图 3:内存计算通过内存阵列将乘加运算转换为欧姆定律练习。权重作为阵列中的电导值保持常驻。资料来源:林雷集团

在更多地方使用模拟确实存在一个主要障碍,正如 Heinig 指出的那样:“模拟技术在实现上要复杂得多。”

10. 使用光子代替电子。虽然传统开发人员反对摩尔定律以扩大可以在一块硅上完成的电子计算,但很少有公司正在转向硅光子学。这可以降低能耗,因为计算本身不消耗能量。

用于光子计算的所有能量都来自激光。该能量将在计算阶段以不同的方式分裂和重新组合,并且一些能量将在波导中损失。但从根本上说,激光是外部能量的唯一消耗者。所有其余的电路只是耗散该能量,希望在输出信号中留下足够的能量以供使用。

这使得创建具有低损耗波导的高效光子学平台更加重要。但是平台的奇特程度是有限的,因为当今实用的光子芯片需要与 CMOS 兼容,以便可以利用晶圆厂的效率来降低成本(无论 CMOS 电路是否与光子共存于单个芯片上) )。

光子“电路”不为计算功能使用能量。 所有的能量都是通过激光器引入的

图 4:光子“电路”不为计算功能使用能量。所有的能量都是通过激光器引入的。资料来源:林雷集团

11. 针对您的硬件和软件进行优化。根据底层计算硬件的功能定制实现也将降低功耗。这可能意味着更高级别的架构或更低级别的细节。Pandey 说:“如果您可以根据您的应用程序定制管道,这就是一种省电方式。”

这件事越早做越好。“也许最大的影响来自为目标硬件定制网络,并在模型开发时这样做,”罗迪说。“如今在训练框架中有大量技术可用,强调在设备上进行推理部署。”

在某些情况下,您可能会先训练模型,使用粗剪只是为了让某些东西尽快工作。一旦决定了硬件,重新训练该硬件或专门为该硬件编译将导致更有效的实现。

虽然重点放在硬件架构上,但几乎总是有一些软件组件在执行。如何优化——例如,循环如何嵌套——会影响能源消耗。

结论

对于传统电路,人们通常认为,为了使事情更快,您必须使用更多能量。速度和力量是这款游戏中无尽的战斗者。但在降低 AI 能耗的情况下,许多技术也有助于提高性能。

例如,通过将数据保持在本地或静止,您可以节省能源,而不会受到数据提取的延迟加法器的影响。稀疏性减少了计算量,这意味着您可以更快地完成。

最终的例子是光子学。可以使用皮秒级延迟进行计算,并且可以使用波分复用实现高水平的并行性,在该皮秒级时间范围内并行完成多个计算流。

然而,这不是免费的午餐。在功率和性能不冲突的情况下,权衡可能是成本和/或准确性。人们很可能会为了功耗和速度优势而牺牲硅面积。也就是说,花在硅上的钱可能会以较低的能源费用收回成本。