AD这个软件做网站用得着吗,广州番禺最新消息,简单的html网页制作模板免费,关键词优化排名的步骤相关说明
这篇文章的大部分内容参考自我的新书《解构大语言模型#xff1a;从线性回归到通用人工智能》#xff0c;欢迎有兴趣的读者多多支持。
本文将讨论如何利用梯度检查点算法来减少模型在训练时候#xff08;更准确地说是运行反向传播算法时#xff09;的内存开支。…相关说明
这篇文章的大部分内容参考自我的新书《解构大语言模型从线性回归到通用人工智能》欢迎有兴趣的读者多多支持。
本文将讨论如何利用梯度检查点算法来减少模型在训练时候更准确地说是运行反向传播算法时的内存开支。这在训练超大规模的模型时会用到。
关于其他的工程技巧可以参考
大语言模型的工程技巧一——GPU计算大语言模型的工程技巧二——混合精度训练大语言模型的工程技巧三——分布式计算
关于大语言模型的讨论请参考
理解大语言模型二——从零开始实现GPT-2 内容大纲 相关说明一、标准反向传播二、内存极简算法三、梯度检查点 一、标准反向传播
根据梯度的定义变量的梯度与其本身的值密切相关。因此要想得到某个变量的梯度必须先知道这个变量的值。这也是为什么在进行反向传播算法之前需要先对计算图进行向前传播并记录每个节点的计算结果如图1左侧部分所示。这样在计算节点的梯度时可以利用这些事先缓存的结果直接启动反向传播过程从而得到梯度如图1中的节点d所示。这种方法也被称为标准反向传播。这种方式能够确保梯度计算以最高效的方式进行。 图1 二、内存极简算法
然而采用标准反向传播算法会造成较大的内存开销。为了在计算过程中尽可能地压缩内存使用可以采用一种以时间换空间的方法。在这种算法中一旦向前传播完成仅会保留顶点的计算结果而中间节点的结果会被清空叶子节点的值会保留。在反向传播遇到中间计算节点没有缓存时则重新触发向前传播以获取所需节点的结果。这就是内存极简的反向传播算法。以节点d为例为了计算其梯度需要首先从节点a开始重新触发向前传播直到节点d并缓存计算结果。然后使用这个缓存的结果以及节点e的梯度计算出节点d的梯度。对于其他节点也采用类似的步骤计算梯度。通过这种方式在完成反向传播的同时节省了内存开销。以图1为例内存极简算法只需要3个存储空间而标准算法需要5个存储空间。
三、梯度检查点
尽管内存极简算法在降低内存开销方面取得了显著成果但它涉及大量的重复计算运行时间相对较长。为了在内存使用和运行时间之间取得平衡下面引入梯度检查点Gradient Checkpoint。这一算法的核心思想是选择一些中间节点作为存储点以便在再次触发向前传播时以这些存储点作为起点开始传播避免从头开始重复计算。这种方式在一定程度上减少重复计算从而提高运行效率。需要注意的是由于需要存储额外的中间结果梯度检查点会稍微增加一些内存开销。
关于梯度检查点算法PyTorch中已经提供了便捷的封装函数即torch.utils.checkpoint。这个工具能够帮助我们更方便地应用梯度检查点算法以平衡内存开锁和运行时间。更多细节请参考这个链接。