trl - 微调、对齐大模型的全栈工具

trl


一、关于 TRL

TRL : Transformer Reinforcement Learning

Full stack library to fine-tune and align large language models.

Train transformer language models with reinforcement learning.


trl库是一个全栈工具,用于使用监督微调步骤(SFT)、奖励建模(RM)和近似策略优化(PPO)以及直接偏好优化(DPO)等方法微调和对齐转换器语言和扩散模型。

该库建立在transformers库之上,因此允许使用那里可用的任何模型架构。


亮点

  • Efficient and scalable
    • acceleratetrl的支柱,它允许使用DDP和DeepSpeed等方法将模型训练从单个GPU扩展到大规模多节点集群。
    • PEFT是完全集成的,即使是最大的模型也可以通过量化和LoRA或QLoRA等方法在适度的硬件上训练。
    • unsloth也是集成的,允许使用专用内核显着加快训练速度。
  • CLI:使用CLI,您可以使用单个命令和灵活的配置系统微调LLM并与之聊天,而无需编写任何代码。
  • Trainers:培训师类是一个抽象,可以轻松应用许多微调方法,如SFTTrainerDPOTrainerRewardTrainerPPOTrainerCPOTrainerORPOTrainer
  • AutoModelsAutoModelForCausalLMWithValueHead & AutoModelForSeq2SeqLMWithValueHead 类为模型添加了一个额外的值头,允许使用RL算法(如PPO)训练它们。
  • Examples:使用BERT情感分类器训练GPT2以生成积极的电影评论,仅使用适配器的完整RLHF,训练GPT-j毒性更小,StackLlama示例等。以下是示例

二、安装


1、Python包

使用pip安装库:

pip install trl

2、从源码安装

如果您想在正式发布之前使用最新功能,您可以从源代码安装:

pip install git+https://github.com/huggingface/trl.git

3、存储库

如果您想使用这些示例,您可以使用以下命令克隆存储库:

git clone https://github.com/huggingface/trl.git

三、命令行界面(CLI)

您可以使用TRL命令行界面(CLI)快速开始使用监督微调(SFT)、直接偏好优化(DPO)并使用聊天CLI测试对齐的模型:

SFT:

trl sft --model_name_or_path facebook/opt-125m --dataset_name imdb --output_dir opt-sft-imdb

DPO:

trl dpo --model_name_or_path facebook/opt-125m --dataset_name trl-internal-testing/hh-rlhf-helpful-base-trl-style --output_dir opt-sft-hh-rlhf 

聊天:

trl chat --model_name_or_path Qwen/Qwen1.5-0.5B-Chat

relevant documentation section 阅读有关CLI的更多信息,或使用--help获取更多详细信息。


四、如何使用

为了获得更多的灵活性和对训练的控制,您可以使用专用的训练类 来微调Python中的模型。


1、SFTTrainer

这是如何使用库中的SFTTrainer的基本示例。

SFTTrainer 是围绕transformersTrainer的轻型包装器,可轻松微调自定义数据集上的语言模型或适配器。

# imports
from datasets import load_dataset
from trl import SFTTrainer

# get dataset
dataset = load_dataset("imdb", split="train")

# get trainer
trainer = SFTTrainer(
    "facebook/opt-350m",
    train_dataset=dataset,
    dataset_text_field="text",
    max_seq_length=512,
)

# train
trainer.train()

2、RewardTrainer

这是如何使用库中的RewardTrainer的基本示例。

RewardTrainer transformers Trainer 的包装器,可轻松微调自定义偏好数据集上的奖励模型或适配器。

# imports
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from trl import RewardTrainer

# load model and dataset - dataset needs to be in a specific format
model = AutoModelForSequenceClassification.from_pretrained("gpt2", num_labels=1)
tokenizer = AutoTokenizer.from_pretrained("gpt2")

...

# load trainer
trainer = RewardTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
)

# train
trainer.train()

3、PPOTrainer

这是如何使用库中的PPOTrainer的基本示例。

基于查询,语言模型创建一个响应,然后对其进行评估。评估可以是循环中的人或另一个模型的输出。

# imports
import torch
from transformers import AutoTokenizer
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead, create_reference_model
from trl.core import respond_to_batch

# get models
model = AutoModelForCausalLMWithValueHead.from_pretrained('gpt2')
ref_model = create_reference_model(model)

tokenizer = AutoTokenizer.from_pretrained('gpt2')
tokenizer.pad_token = tokenizer.eos_token

# initialize trainer
ppo_config = PPOConfig(batch_size=1, mini_batch_size=1)

# encode a query
query_txt = "This morning I went to the "
query_tensor = tokenizer.encode(query_txt, return_tensors="pt")

# get model response
response_tensor  = respond_to_batch(model, query_tensor)

# create a ppo trainer
ppo_trainer = PPOTrainer(ppo_config, model, ref_model, tokenizer)

# define a reward for response
# (this could be any reward such as human feedback or output from another model)
reward = [torch.tensor(1.0)]

# train model for one step with ppo
train_stats = ppo_trainer.step([query_tensor[0]], [response_tensor[0]], reward)

4、DPOTrainer

DPOTrainer是使用直接偏好优化算法的培训师,这是如何使用库中的DPOTrainer的基本示例DPOTrainertransformersTrainer的包装器,可轻松微调自定义偏好数据集上的奖励模型或适配器。

# imports
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import DPOTrainer

# load model and dataset - dataset needs to be in a specific format
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

...

# load trainer
trainer = DPOTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
)

# train
trainer.train()

五、其它

开发 & 贡献

如果您想为trl做出贡献或根据您的需求对其进行定制,请务必阅读贡献指南并确保您进行了开发安装:

git clone https://github.com/huggingface/trl.git
cd trl/
make dev

参考文献


最近策略优化 PPO

PPO实现在很大程度上遵循D. Ziegler等人的**“来自人类偏好的微调语言模型”**论文中介绍的结构。[论文代码]。


直接偏好优化 DPO

DPO基于E. Mitchell等人的**《直接偏好优化:您的语言模型是秘密的奖励模型》**的原始实现。[论文代码]


2024-07-17(三)

你可以按照以下步骤使用Python的trl来编写一个PPO算法来优化LLAMA的代码: 1. 安装trl:在命令行中运行`pip install trl`来安装trl。 2. 导入所需的和模块: ```python import trl import torch import llama # 导入LLAMA环境 ``` 3. 创建LLAMA环境: ```python env = llama.LLAMA() ``` 4. 定义神经网络模型: ```python class Policy(torch.nn.Module): def __init__(self): super(Policy, self).__init__() self.fc1 = torch.nn.Linear(env.observation_space.shape[0], 64) self.fc2 = torch.nn.Linear(64, 64) self.fc3 = torch.nn.Linear(64, env.action_space.n) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return trl.distributions.Categorical(logits=x) policy = Policy() ``` 5. 创建PPO优化器: ```python optimizer = trl.optimizers.PPO(policy, lr=1e-3) ``` 6. 定义训练循环: ```python for epoch in range(num_epochs): states = [] actions = [] rewards = [] log_probs = [] state = env.reset() done = False while not done: states.append(state) action, log_prob = policy(torch.tensor(state).float()) actions.append(action) log_probs.append(log_prob) state, reward, done, _ = env.step(action.item()) rewards.append(reward) states = torch.tensor(states).float() actions = torch.tensor(actions).long() rewards = torch.tensor(rewards).float() log_probs = torch.stack(log_probs) optimizer.zero_grad() loss = trl.ppo_loss(policy, states, actions, rewards, log_probs) loss.backward() optimizer.step() ``` 在这个训练循环中,我们收集了每个时间步的状态、动作、奖励和对数概率,然后使用PPO损失计算损失并进行反向传播和优化。 请注意,这只是一个简单的示例,实际上你可能需要进行更多的调优和修改来适应你的具体问题和环境。 希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值