英语|中文
这是针对具有有限资源和Adalomo的大型语言模型进行完整参数微调的实施方法:具有自适应学习率的低内存优化。
transformers
中并accelerate
。lomo-optim
发布了。CoLLiE
Library,该图书馆以有效的方式支持大型语言模型的协作培训。您可以使用PIP从PYPI中安装lomo-optim
。
pip install lomo-optim
然后,导入Lomo
或AdaLomo
。
from lomo_optim import Lomo
from lomo_optim import AdaLomo
Lomo
和AdaLomo
的使用方式与Pytorch的优化器不同,但不相同(示例)。我们建议在没有gradnorm
情况下使用AdaLomo
以获得更好的性能和更高的吞吐量。
在这项工作中,我们提出了一个新的优化器,即L -W-Memory O Ptimization( LOMO ),该功能将梯度计算和参数更新融合,以减少存储器使用情况。我们的方法启用了单个RTX 3090上7B模型的完整参数微调,或者在具有8×RTX 3090的单个计算机上的65B模型,每个模型都有24GB内存。
我们的实现依赖于将钩子功能注入Pytorch的向后通过。如图所示,我们为每个参数注册一个自定义的挂钩函数。当计算参数的梯度(在将其写入.grad属性之前)时,调用其相应的钩函数。有关挂钩功能和自动踢图的向后通过的更多信息,请参阅Pytorch的文档。总而言之,在向后传球期间,我们通过张量及其grad_fn,将梯度写入.grad属性,然后传递到下一个张量。
我们的自定义挂钩函数扫描所有参数,如果其.grad属性不是空的,则更新一个参数,然后清除并释放.grad属性。由于在设置其.grad属性之前调用了一个参数的挂钩函数,因此在调用最后一个挂钩函数时,Autograd Graph中最后一个参数的.grad属性尚未准备就绪。因此,我们执行额外的扫描以更新最后一个参数。
Lomo的代码位于Lomo文件夹中。
在这项工作中,我们检查了Lomo和Adam优化技术之间的区别,并引入Adalomo,该技术为每个参数提供了自适应学习率,并在维持内存效率的同时使用了分组的更新归一化。 Adalomo在指导调整和进一步的预训练中获得了与ADAMW相当的结果,并以更少的记忆足迹进行预训练。
Adalomo的代码位于Adalomo文件夹中。
@article{lv2023full,
title={Full Parameter Fine-tuning for Large Language Models with Limited Resources},
author={Lv, Kai and Yang, Yuqing and Liu, Tengxiao and Gao, Qinghui and Guo, Qipeng and Qiu, Xipeng},
journal={arXiv preprint arXiv:2306.09782},
year={2023}
}
@article{lv2023adalomo,
title={AdaLomo: Low-memory Optimization with Adaptive Learning Rate},
author={Lv, Kai and Yan, Hang and Guo, Qipeng and Lv, Haijun and Qiu, Xipeng},
journal={arXiv preprint arXiv:2310.10195},
year={2023}
}