语言模型,特别是基于变压器(transformer)架构的模型,已经被证明是自然语言处理(NLP)中极其有力的工具。如OpenAI的GPT(生成式预训练变压器)系列、Google的BERT(双向编码器表示变压器)和T5(文本到文本转换变压器)等预训练语言模型,在广泛的NLP任务上取得了最先进的结果。然而,这些预训练模型可能不一定对每一个特定的用例或领域都是最优的。微调提供了一个解决方案,可以将这些模型适配到特定的任务或数据集上,从而提高性能。
一些新的模型正在被若干组织如Meta、Microsoft、DeciLM和Mistral等开发。
因此,对一个大型语言模型进行微调是一个耗时的任务,通常需要机器学习领域的专业知识、一个精心策划的数据集和高算力的计算资源,对于个人(甚至是一些组织)来说是无法获得的。
我们可以微调一些适合在我们的本地笔记本电脑或Google Colab上运行的较小模型。
我们将会对GPT2进行微调。这是GPT-2系列中最小的版本,有1.24亿的参数。
预训练模型的链接:https://huggingface.co/gpt2
数据集的链接:
https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k
导入库
import torch
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
DataCollatorForLanguageModeling,
Trainer,
TrainingArguments,
)
from datasets import load_dataset
将设备设置为Cuda以快速运行你的模型
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
torch.cuda.empty_cache()
device
选择你的模型和数据集
model_name = "gpt2"
dataset_name = "HuggingFaceH4/ultrachat_200k"
model = AutoModelForCausalLM.from_pretrained(model_name).to(device)
train_dataset = load_dataset(dataset_name, split='train_gen')
train_dataset.to_pandas()
test_dataset = load_dataset(dataset_name, split='test_gen')
test_dataset.to_pandas()
数据集准备和词条化
def prepare_datasets(data):
prompt = ""
for i in range(len(data['messages']) - 1):
if len(prompt) > 0:
prompt = prompt + "\n" + f"""{data['messages'][i]['role']}: {data['messages'][i]['content']}"""
else:
prompt = f"""{data['messages'][i]['role']}: {data['messages'][i]['content']}"""
data['query'] = prompt
return data
def tokenize_datasets(dataset):
tokenized_dataset = dataset.map(
lambda example: tokenizer(
example['query'],
truncation=True,
max_length=128,
),
batched=True,
remove_columns=['query']
)
return tokenized_dataset
# Dataset Prep
train_dataset = train_dataset.map(
prepare_datasets, remove_columns=['prompt', 'prompt_id', 'messages']
)
test_dataset = test_dataset.map(
prepare_datasets, remove_columns=['prompt', 'prompt_id', 'messages']
)
# Tokenization
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
train_dataset = tokenize_datasets(train_dataset)
test_dataset = tokenize_datasets(test_dataset)
# Data Collator
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
data_collator
训练参数
batch_size = 4
training_args = TrainingArguments(
output_dir="./models/chat_gpt2",
gradient_accumulation_steps=batch_size,
num_train_epochs=3,
per_device_train_batch_size=batch_size,
per_device_eval_batch_size=batch_size,
load_best_model_at_end=True,
save_strategy="no",
save_total_limit=2,
fp16=True,
learning_rate=2e-05,
lr_scheduler_type="cosine",
warmup_ratio=0.05,
report_to=None
)
training_args
训练师
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset,
data_collator=data_collator
)
trainer.train()
将其推送到HuggingFace
MODEL_PATH = "<Yourname/Name_of_the_model>"
model.push_to_hub(
MODEL_PATH, token="<HF_Token>"
)