语言模型微调指南

2023年12月21日 由 alex 发表 210 0

语言模型,特别是基于变压器(transformer)架构的模型,已经被证明是自然语言处理(NLP)中极其有力的工具。如OpenAI的GPT(生成式预训练变压器)系列、Google的BERT(双向编码器表示变压器)和T5(文本到文本转换变压器)等预训练语言模型,在广泛的NLP任务上取得了最先进的结果。然而,这些预训练模型可能不一定对每一个特定的用例或领域都是最优的。微调提供了一个解决方案,可以将这些模型适配到特定的任务或数据集上,从而提高性能。


一些新的模型正在被若干组织如Meta、Microsoft、DeciLM和Mistral等开发。


因此,对一个大型语言模型进行微调是一个耗时的任务,通常需要机器学习领域的专业知识、一个精心策划的数据集和高算力的计算资源,对于个人(甚至是一些组织)来说是无法获得的。


我们可以微调一些适合在我们的本地笔记本电脑或Google Colab上运行的较小模型。


我们将会对GPT2进行微调。这是GPT-2系列中最小的版本,有1.24亿的参数。


2


3


预训练模型的链接: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>"
)
文章来源:https://medium.com/@sharathhebbar24/finetune-language-models-d0ecaaf85298
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消