TRL 文档

使用 PEFT 与 TRL 对 8 位模型进行低秩自适应(LoRA)微调的示例

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

使用 PEFT 与 TRL 对 8 位模型进行低秩自适应(LoRA)微调的示例

这些示例中的笔记本和脚本展示了如何使用低秩自适应 (LoRA) 以内存效率高的方式微调模型。大多数 PEFT 方法都受 peft 库的支持,但请注意,某些 PEFT 方法(例如提示微调)不受支持。有关 LoRA 的更多信息,请参阅 原始论文

以下是 trl 存储库 中启用 peft 的笔记本和脚本的概述

文件 任务 描述
stack_llama/rl_training.py RLHF 使用学习的奖励模型和 peft 对 70 亿参数的 LLaMA 模型进行分布式微调。
stack_llama/reward_modeling.py 奖励建模 使用 peft 对 70 亿参数的 LLaMA 奖励模型进行分布式训练。
stack_llama/supervised_finetuning.py SFT 使用 peft 对 70 亿参数的 LLaMA 模型进行分布式指令/监督微调。

安装

注意:peft 处于积极开发中,因此我们直接从其 Github 页面安装。Peft 还依赖于最新版本的 transformers。

pip install trl[peft]
pip install bitsandbytes loralib
pip install git+https://github.com/huggingface/transformers.git@main
#optional: wandb
pip install wandb

注意:如果您不想使用 wandb 记录,请在脚本/笔记本中删除 log_with="wandb"。您也可以用您喜欢的实验跟踪器替换它,该跟踪器受 accelerate 支持。

如何使用它?

只需在您的脚本中声明一个 PeftConfig 对象,并将其通过 .from_pretrained 传递以加载 TRL+PEFT 模型。

from peft import LoraConfig
from trl import AutoModelForCausalLMWithValueHead

model_id = "edbeeching/gpt-neo-125M-imdb"
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

model = AutoModelForCausalLMWithValueHead.from_pretrained(
    model_id, 
    peft_config=lora_config,
)

如果您想以 8 位精度加载您的模型

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    load_in_8bit=True,
    peft_config=lora_config,
)

… 或以 4 位精度

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_4bit=True,
)

启动脚本

trl 库由 accelerate 驱动。因此,最好使用以下命令配置和启动训练:

accelerate config # will prompt you to define the training configuration
accelerate launch examples/scripts/ppo.py --use_peft # launch`es training

使用 trl + peft 和数据并行

只要能够将训练过程放入单个设备中,就可以扩展到任意数量的 GPU。您需要应用的唯一调整是按如下方式加载模型:

from peft import LoraConfig
...

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
)

如果您想以 8 位精度加载您的模型

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_8bit=True,
)

… 或以 4 位精度

pretrained_model = AutoModelForCausalLMWithValueHead.from_pretrained(
    config.model_name, 
    peft_config=lora_config,
    load_in_4bit=True,
)

最后,确保奖励也在正确的设备上计算,为此可以使用 ppo_trainer.model.current_device

大型模型的朴素管道并行(NPP)(>60B 模型)

trl 库还支持大型模型(>60B 模型)的朴素管道并行 (NPP)。这是一种在多个 GPU 上并行化模型的简单方法。这种称为“朴素管道并行”(NPP)的范式是在多个 GPU 上并行化模型的一种简单方法。我们在多个 GPU 上加载模型和适配器,激活和梯度将在 GPU 之间进行朴素通信。这支持 int8 模型以及其他 dtype 模型。

如何使用 NPP?

只需在 from_pretrained 上使用自定义 device_map 参数加载您的模型,即可在多个设备上拆分您的模型。查看此很棒的教程,了解如何为您的模型正确创建 device_map

还要确保将 lm_head 模块放在第一个 GPU 设备上,因为它如果不在第一个设备上可能会抛出错误。在撰写本文时,您需要安装 acceleratemain 分支:pip install git+https://github.com/huggingface/accelerate.git@mainpeftpip install git+https://github.com/huggingface/peft.git@main

启动脚本

尽管 trl 库由 accelerate 驱动,但您应该在一个进程中运行您的训练脚本。请注意,我们目前还不支持数据并行和 NPP 同时使用。

python PATH_TO_SCRIPT

微调 Llama-2 模型

您可以轻松地使用 SFTTrainer 和官方脚本微调 Llama2 模型!例如,要在 Guanaco 数据集上微调 llama2-7b,请运行(在单个 NVIDIA T4-16GB 上测试)

python examples/scripts/sft.py --output_dir sft_openassistant-guanaco  --model_name meta-llama/Llama-2-7b-hf --dataset_name timdettmers/openassistant-guanaco --load_in_4bit --use_peft --per_device_train_batch_size 4 --gradient_accumulation_steps 2
< > 在 GitHub 上更新