LLMs Fine-tuning 学习笔记(一):trl+peft
1 基本信息#
From:Fine-tuning 20B LLMs with RLHF on a 24GB consumer GPU (huggingface.co)
Codes:trl/examples/sentiment/scripts/gpt-neox-20b_peft at main · lvwerra/trl · GitHub
相关工具:
- peft:用于微调大模型的python库
- transformers:用于获取和使用开源社区中预训练模型的python库
- trl:使用强化学习算法来训练或微调模型的python库
使用RLHF训练LLM的三个基本步骤:
- 构建一个由prompt和respond组成的数据集,用这个数据集来微调LLM
- 收集第一步中训好的LLM对各prompt的不同回复,对同一个prompt的不同回复内容按质量好坏进行排序,排序后的数据将构成新的数据集用在第三步中
- 使用强化学习算法(比如PPO)根据第二步得到的数据集对第一步得到的LLM进行RLHF微调
可选的基础模型(截至March 9, 2023):
- https://huggingface.co/bigscience/bloomz
- https://huggingface.co/google/flan-t5-xxl
- https://huggingface.co/google/flan-ul2
- https://huggingface.co/facebook/opt-iml-max-30b
关于模型和GPU显存之间的关系
- 建议基础模型参数量大于100亿,这类模型全精度工作一般需要40G以上显存
- 在GPU上以全精度(FP32)加载模型,每10亿参数需要消耗 4GB显存,以半精度(FP32)加载模型需要的显存是全精度的一半
- 更多关于精度量化和显存优化的信息:https://huggingface.co/blog/hf-bitsandbytes-integration
关于模型/数据并行及分布式训练:
对RLHF的理解:
- 在RLHF中,Actor Model(生成模型)需要Instruct Tuning来学习如何follow指令,而Reward model将学习人类的偏好,对Actor Model的输出进行打分。因此,可以把Reward Model理解为一个针对Actor Model输出结果的分类器。
对PPO的理解:
-
Overview of the PPO training setup in TRL:
-
The active model is the model being trained, and a copy of it is periodically made as the reference model. When the policy changes, the reference model is used as a baseline to evaluate whether the changes made by the active model are good or bad.
在单GPU中完成RLHF的关键技术要素:adapters 和 8bit matrix multiplication
-
8-bit matrix multiplication
- 一个优化矩阵相乘的算法,可以降低Transformer中前馈和注意力计算阶段的显存消耗
- 引入8-bit matrix multiplication后,和全精度(FP32)相比,模型对显存的消耗可以降低4倍
- 论文:LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (arxiv.org)
- 一个优化矩阵相乘的算法,可以降低Transformer中前馈和注意力计算阶段的显存消耗
-
Adapters
-
Adapters,或者说LoRA,这是一种针对LLM的微调方法,其核心思想是把LLM中的需要变更的权重矩阵替换成Fine-tuning过程中习得的低秩近似(low-rank approximations)矩阵,以此减少Fine-tuning过程中的计算资源消耗
-
论文:LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org)
-
-
注意 8-bit int8 training 和 Low Rank adaption 在 Parameter-Efficient Fine-Tuning (PEFT) 包中都有现成实现
2 实现步骤#
第一步:以8-bit精度加载预训练模型
- 调用transformers的
from_pretrained()
方法时加上load_in_8bit=True
即可,参考:Quantize Transformers models
第二步:使用peft在预训练模型中增加一个可训练的Adapter
第三步:使用添加了Adapter的模型来做PPO,实现RLHF
-
peft提供了便捷的API ,使我们可以随时启用或禁用模型中额外添加的Adapter。禁用Adapter时就是Reference Model,启用Adapter时就是Active Model:
3 代码分析#
这个坑等后面有空再填。。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)