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中的参数即可,不需要调整整个Active模型的参数:
第三步:使用添加了Adapter的模型来做PPO,实现RLHF
-
peft提供了便捷的API ,使我们可以随时启用或禁用模型中额外添加的Adapter。禁用Adapter时就是Reference Model,启用Adapter时就是Active Model:
3 代码分析
这个坑等后面有空再填。。。