只用1块A100,就能训练自己的Llama-2模型

你知道吗?现在只用几行代码就能在自己的数据上训练所有Llama-2模型!

而且甚至可以在单个A100 GPU上使用70亿参数的模型,这要归功于4bit和PEFT的魔力!

通过PPO微调语言模型大致包括三个步骤:

生成(Rollout):语言模型根据查询(query)生成一个响应或连续文本,查询可能是一个句子的开头。

评估(Evaluation):使用一个函数、模型、人工反馈或它们的组合来对查询和生成的响应进行评估。重要的是,该过程应为每个查询/响应对产生一个标量值。

优化(Optimization):这是最复杂的部分。在优化步骤中,使用查询和生成的响应对来计算序列中每个令牌的对数概率。这是通过已经训练过的模型和一个参考模型来完成的,参考模型通常是微调之前的预训练模型。两个模型输出之间的KL散度被用作额外的奖励信号,以确保生成的响应不会偏离参考语言模型太远。然后使用PPO来训练主要的语言模型。

这个过程在下面的示意图中说明:

ff1336d7d78535f07dc575530f53b419.jpeg


安装:

要通过pip安装Python库:

pip install trl

如果你想从源代码运行库中的示例,还需要安装一些额外的库。首先,你需要克隆该库的代码仓库,然后使用pip安装它。

git clone https://github.com/lvwerra/trl.gitcd trl/pip install .

如果你希望开发TRL(指上文提到的名为"trl"的Python库),可以使用可编辑模式进行安装

pip install -e .


如何使用:

SFTTrainer

以下是如何使用库中的SFTTrainer的基本示例。SFTTrainer是transformers Trainer的轻量级封装,可以轻松地在自定义数据集上微调语言模型或适配器。

# imports

from datasets import load_dataset

from trl import SFTTrainer

# get datasetdataset = 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()

RewardTrainer

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

# imports

from transformers import AutoModelForSequenceClassification, AutoTokenizerfrom trl import RewardTrainer

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

...

# load trainer

trainer = RewardTrainer( 

 model=model, t

okenizer=tokenizer,

 train_dataset=dataset,)

# train

trainer.train()

PPOTrainer

以下是如何使用库中的PPOTrainer的基本示例。根据查询,语言模型创建一个响应,然后对该响应进行评估。评估可以由人类参与,也可以是另一个模型的输出。

# importsi

mport torch

from transformers import AutoTokenizerf

rom trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead, create_reference_model

from trl.core import respond_to_batch

# get models

model = AutoModelForCausalLMWithValueHead.from_pretrained('gpt2')

model_ref = create_reference_model(model)

tokenizer = AutoTokenizer.from_pretrained('gpt2')

# initialize trainer

ppo_config = PPOConfig( 

 batch_size=1,)

# encode a queryquery_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, model_ref, 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 ppotrain_stats = ppo_t

rainer.step([query_tensor[0]], [response_tensor[0]], reward)

高级示例:IMDB情感分类
要了解详细的示例,请查看项目examples/scripts/sentiment_tuning.py中的示例Python脚本。下面是在优化之前和之后,从语言模型中提取的几个示例:df4b5c1786247cbc485efd1a2c91ad46.jpegGitHub项目地址:https://github.com/lvwerra/trl

猜你喜欢

转载自blog.csdn.net/specssss/article/details/131857883
今日推荐