PyTorch+Transformers训练一个大语言模型傻瓜教程

关于大语音模型的一些新闻

所以,对于大多数的大语言模型学习者、从业者是不是应该重头搞一个大语言模型?这个问题相信大家都有自己的选择。对大语言模型的态度是不是应该:知其然知其所以然,但目标在应用。

相关库安装及库引用

相关库作用

pip -q install trl
pip -q install peft
pip -q install torch
pip -q install datasets
pip -q install transformers
  • Trl:是一个开源的机器学习库,主要用于实现深度学习和强化学习(RL)算法。用于通过强化学习训练 transformers 语言模型。
  • Peft: 使用参数效率微调 (PEFT) 方法来有效适应预训练模型。
  • Torch:一个广泛使用的开源机器学习库。
  • 数据集:用于帮助下载和加载许多常见的机器学习数据集。

库引用

import torch
from trl import SFTTrainer
from datasets import load_dataset
from peft import LoraConfig, get_peft_model, prepare_model_for_int8_training
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
import textwrap
  • SFTTrainer:一个轻量级的Transformers Trainer包装器,可以用于在自定义数据集上微调语言模型或适配器。
  • LoraConfig:hugging face开源的一个参数高效微调大模型的工具,里面集成了4种微调大模型的方法。LORA是PEFT中最常用的方法,LORA认为过参数的模型权重其实存在低内在维度,那么模型适应过程中的权重变化也存在低内在维度,因此模型在微调的过程中实际上可以通过微调低秩矩阵来微调模型。
  • textwrap:模块是Python标准库中的一个文本处理模块,用于对字符串进行格式化操作,更好的展示文本。

大语言模型的数据集通常来源于多种多样的文本资源

六类数据集类型

  1. Books

    • 包括像BookCorpus这样专门的数据集,由成千上万本电子书组成,通常涵盖小说、传记等多种文学类型,为模型提供了丰富的故事叙述、情节发展和人物描绘等内容,有助于模型理解长篇叙事结构和连贯性。
  2. CommonCrawl

    • CommonCrawl是一个庞大的开放Web爬虫项目,抓取了互联网上的大量网页,并生成可供下载的原始网页快照索引和数据集。这些数据可用于训练语言模型,从而让模型学习网络文本的各种写作风格、新闻报道、博客文章、论坛讨论等各种形式的语言表达。
  3. Reddit links

    • Reddit是一个社交新闻聚合网站,用户在这里发表帖子、参与讨论,话题多样且富有社区特色。Reddit链接指向的内容可以包括评论、讨论串、主题帖子等,这部分数据集可以帮助模型捕捉当代社交媒体上的对话风格、俚语、流行文化和领域专业知识。
  4. Wikipedia

    • 维基百科是一个全球知名的在线百科全书,拥有海量的多语言条目,涵盖了各个学科的知识。它是训练语言模型的理想来源之一,因为它包含了广泛的主题、详尽的解释、引用和客观表述,有助于模型学习事实性内容、篇章结构和学术性写作。
  5. Code

    • 包括GitHub或其他代码托管平台上的编程代码数据,用于训练编码相关的语言模型,如GitHub Copilot等。此类数据集使模型能够理解和生成代码片段,掌握编程语法和逻辑。
  6. Others

    • 其他类别可能包括新闻文章、政府报告、法律文件、电影剧本、社交媒体帖子、电子邮件、产品评价等各类非结构化文本数据。这类数据集有助于模型更加全面地理解和模仿人类在不同场景下的书面和口头交流方式,增强了模型的泛化能力和领域适应性。随着技术的发展,还可能包括语音转文本、多语言数据等更多类型的资源。

常见数据集资源

大语言模型的数据集资源非常丰富,涵盖广泛的主题、语言和地区。以下是一些常见的和最近发布的数据集资源,它们被用于训练或评估大语言模型:

  1. 公开通用数据集

    • Wikipedia:维基百科的各种语言版本,是最常用的开放数据源之一。
    • Common Crawl:大规模互联网爬虫抓取的网页数据。
    • BookCorpus:包含大量小说和教科书文本的数据集。
    • OpenWebText:类似Common Crawl但专门针对Reddit帖子的去重文本集合。
    • CC-100:由多个来源组成的多语言数据集,包含100多种语言的文本。
    • Project Gutenberg:提供大量的公共领域书籍文本。
  2. 专业和领域数据集

    • PubMed:生物医学文献数据库。
    • arXiv:科研论文预印本库。
    • ACL Anthology:自然语言处理领域的学术论文集合。
  3. 社交媒体和讨论板数据

    • Reddit:社交新闻网站的帖子和评论数据。
    • Twitter:社交媒体平台上的公开推文数据。
    • StackExchange:技术问答社区的问答数据。
  4. 对话和多轮对话数据集

    • PersonaChat:模拟真实人物之间对话的数据集。
    • DialoGPT:微软的多轮对话数据集。
    • Cornell Movie-Dialogs Corpus:从电影剧本中提取的对话数据集。
  5. 中文数据集

    • CLUECorpus:面向中文语言理解评测的多任务数据集。
    • CMRC:中文阅读理解数据集。
    • MMCU:专为中国大语言模型设计的评测数据集。
    • 出门问问发布的序列猴子数据集:包含中文通用文本、古诗今译等多种类型文本的数据集。
  6. 跨语言和多模态数据集

    • Multi30k:用于机器翻译的英德双语数据集。
    • WikiMatrix:跨越多种语言的平行文本数据集。
    • Image-Text Datasets(如COCO Captions、Flickr30k):图像与描述性文本配对的数据集。
  7. 定制化和专业训练数据

    • 各种公司和研究机构自行收集和标注的特定行业或应用场景数据。

随着大语言模型的发展,不断有新的数据集出现,用于解决特定任务或改善模型在特定语言和文化背景下的表现。值得注意的是,使用这些数据集时需遵守各自的许可协议,并尊重隐私及版权法规。

抱抱脸Hugging Face中集成的数据集

Hugging Face 的 datasets 库并没有直接集成所有可能的数据集,而是提供了一个统一的接口和平台来访问、下载和处理众多流行的数据集,这些数据集涵盖自然语言处理(NLP)、计算机视觉(CV)和音频等多个领域。用户可以通过简单的API调用获取到上百种经过整理和标准化的数据集。

截至最后更新时间点(大约在2023年之后),Hugging Face Datasets 库已经整合了众多知名的NLP数据集,比如:

  • GLUE Benchmark
  • SQuAD
  • CoLA
  • SST-2
  • MNLI
  • XNLI
  • QNLI
  • RTE
  • MRPC
  • STS-B
  • Common Crawl Corpus
  • Wikipedia
  • BookCorpus
  • WikiText
  • OSCAR
  • CC-100
  • MultiNLI
  • WMT翻译任务的数据集
  • Europarl
  • ParaCrawl
  • TREC QA
  • BoolQ
  • Quora Question Pairs
  • SuperGLUE Benchmark

pytorch中相关数据集

PyTorch本身并不直接提供内置的数据集,但它通过其生态下的torch.utils.data模块提供了用于构建和管理数据集的基本工具,比如Dataset基类和DataLoader加载器。用户可以根据需要自定义数据集类,然后通过DataLoader进行批处理和异步加载数据。

不过,PyTorch生态中的torchvision库则为计算机视觉任务提供了许多内置数据集。

另外,Hugging Face的datasets库是PyTorch生态中非常重要的组成部分,它与PyTorch紧密集成,为各种自然语言处理(NLP)任务提供了大量预处理和标准化的数据集,尽管这不是PyTorch核心库的一部分,但通常被认为是PyTorch使用者获取和处理数据集的重要途径。

Alpaca数据集

在自然语言处理(NLP)领域,Alpaca 数据集是一个与训练和评估指令跟随语言模型相关的数据集。斯坦福大学的研究团队所开发的 Alpaca 模型旨在训练一个能够理解和执行用户指令的语言模型。这个数据集包含了大约52,000条英文指令数据,这些数据是由OpenAI的GPT-3衍生模型(如text-davinci-003)生成的高质量指令样本。

Alpaca 数据集的特点在于其聚焦于指令理解和执行的任务,这对于训练模型如何理解人类意图并生成符合指令要求的回复至关重要。通过在这样的数据集上微调大型语言模型,如Meta的LLaMA模型,Alpaca模型能够在多种自然语言处理任务上表现出良好的性能,并且特别适合在消费级显卡上进行训练和部署,因为相较于其他大规模模型,它相对轻量级。

此外,还有针对中文指令的Alpaca数据集变体,以及其他扩展或派生的数据集,如支持多轮对话的数据集,这些都为研究人员和开发者提供了丰富的资源来训练和测试指令驱动的对话系统。

本篇将使用免费提供的羊驼(Alpaca)数据集。该数据集主要有三个列:指令(instructions)、输入(input)和输出(output)。我们将这三个列的内容结合起来,生成最终的文本列。

train_dataset = load_dataset("tatsu-lab/alpaca", split="train")
print(train_dataset)
  • 参数“split”被设置为“train”,以便仅加载数据集的训练部分。

train_dataset结构如下:

Dataset({
    features: ['instruction', 'input', 'output', 'text'],
    num_rows: 52002
})

使用Pandas可以查看数据:

pandas_format = train_dataset.to_pandas()
display(pandas_format.head())

PyTorch+Transformers常用数据集+训练模型de傻瓜教程-LMLPHP

也可以使用import textwrap在命令行打印数据进行浏览、分析:

for index in range(3):
   print("---"*15)
   print("Instruction:        
       {}".format(textwrap.fill(pandas_format.iloc[index]["instruction"],    
       width=50)))
   print("Output:  
       {}".format(textwrap.fill(pandas_format.iloc[index]["output"],  
       width=50)))
   print("Text: 
       {}".format(textwrap.fill(pandas_format.iloc[index]["text"],  
       width=50)))

模型选择与训练

在开始训练模型之前,我们需要先完成一些准备工作:

  • Pre-trained Model预训练模型:
    可以选择在Hugging Face上提供的预训练模型,如THUDM/chatglm3-6b、Salesforce/xgen-7b-8k-base等。Salesforce训练了这一系列名为XGen-7B的70亿参数大语言模型,采用了标准稠密注意力机制,能够处理长达8千个序列,累积训练了多达1.5万亿个令牌。

  • Tokenizer分词器:
    这是对训练数据进行分词任务所必需的工具。

pretrained_model_name = "Salesforce/xgen-7b-8k-base"
model = AutoModelForCausalLM.from_pretrained(pretrained_model_name, torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name, trust_remote_code=True)
  • 关于Salesforce LLM的背景说明:

Salesforce训练了一系列名为XGen-7B的70亿参数大型语言模型,这些模型采用了标准密集注意力机制,适用于长达8k序列长度的数据,并进行了多达1.5T个tokens的训练。同时,也对这些模型在公开领域内的教学数据上进行了微调。主要结论如下:

在标准自然语言处理基准测试中,与当前最先进的开源大型语言模型(例如MPT、Falcon、LLaMA、Redpajama和OpenLLaMA)相比,同等规模下的XGen模型表现出相当或更优的结果。

我们在针对长序列建模基准的专项评估中发现,8K-seq模型相较于2K-seq和4K-seq模型具有显著优势。

无论是在文本任务(如MMLU、QA)还是代码任务(如HumanEval)中,XGen-7B都取得了同样出色的表现。

按照Google Cloud定价,在TPU-v4环境下,对1万亿个令牌进行训练的成本约为15万美元。

训练参数设置

TrainingArguments

model_training_args = TrainingArguments(
       output_dir="xgen-7b-8k-base-fine-tuned",
       per_device_train_batch_size=4,
       optim="adamw_torch",
       logging_steps=80,
       learning_rate=2e-4,
       warmup_ratio=0.1,
       lr_scheduler_type="linear",
       num_train_epochs=1,
       save_strategy="epoch"
   )

LoRAConfig

lora_peft_config = LoRAConfig(
    rank=16,          # 设置低秩矩阵的秩
    factor_lr=0.001,  # 设置LoRA因子的学习率
    apply_to_layers=['layer1', 'layer2'],  # 应用LoRA到指定的模型层名称列表
    freeze_base_model=True,  # 是否冻结基础模型的权重(仅更新LoRA矩阵)
    weight_decay=1e-5,   # 对LoRA矩阵施加L2正则化项
)

SFT_trainer = SFTTrainer(
       model=model,
       train_dataset=train_dataset,
       dataset_text_field="text",
       max_seq_length=1024,
       tokenizer=tokenizer,
       args=model_training_args,
       packing=True,
       peft_config=lora_peft_config,
   )

tokenizer.pad_token = tokenizer.eos_token
model.resize_token_embeddings(len(tokenizer))
model = prepare_model_for_int8_training(model)
model = get_peft_model(model, lora_peft_config)
training_args = model_training_args
trainer = SFT_trainer
trainer.train()

上述代码片段说明:

  1. tokenizer.pad_token = tokenizer.eos_token: 将填充符号设置为与句子结束符相同,这意味着在处理输入序列时,当需要填充至固定长度时,将使用与结束符号相同的标记作为填充标志。

  2. model.resize_token_embeddings(len(tokenizer)): 调整模型的词嵌入层大小,使其与tokenizer词汇表的长度相匹配,确保模型能够处理tokenizer所能识别的所有词汇。

  3. model = prepare_model_for_int8_training(model): 准备模型以进行INT8精度训练,这一步骤很可能涉及到量化操作,即将模型的权重从浮点数转换为8位整数,以降低内存占用和提高推理速度。

  4. model = get_peft_model(model, lora_peft_config): 根据PEFT(可能代表某种高效适配技术)配置调整给定的模型,这一操作可能涉及对模型结构或参数进行针对性优化。

  5. training_args = model_training_args: 将预定义好的训练参数赋值给变量training_args,这些参数可能包含了训练过程中的各种设定,如学习率、批次大小、训练轮数等。

  6. trainer = SFT_trainer: 创建一个SFTTrainer实例并将其赋值给变量trainer,SFTTrainer可能是一种自定义的训练器,用于执行特定的训练策略或优化算法。

  7. trainer.train(): 根据提供的规格启动模型的训练过程,根据之前定义好的训练参数和模型状态开始迭代训练。

大语言模型训练时常用参数类型

在训练大语言模型时,会用到多种参数类型和关键参数,这些参数对模型的学习能力和生成效果有很大影响。

以下是一些训练大语言模型时可能涉及的参数类型和关键参数

  1. 参数类型

    • 模型参数(Model Parameters):这些是神经网络模型中的权重和偏置等变量,训练过程中会被梯度下降算法调整以最小化损失函数。
    • 超参数(Hyperparameters):不在模型训练过程中优化,而是由研究人员手动设置的参数,比如学习率、批次大小、层数、隐藏单元数量、注意力头数等。
  2. 关键参数举例

    • 学习率(Learning Rate):控制模型在每次梯度更新时参数变化的幅度。
    • 批次大小(Batch Size):一次迭代中馈送给模型进行训练的样本数量。
    • 优化器参数(Optimizer Parameters):如Adam优化器的β1、β2(动量项和RMSprop项的比例),以及epsilon等。
    • 正则化参数(Regularization Parameters):如权重衰减(Weight Decay/L2正则化)的强度,Dropout比例等。
    • 温度参数(Temperature):在生成式模型中用于调节softmax函数输出分布平滑度的参数,影响模型生成结果的多样性。
    • Top-K和Top-P采样参数:在GPT等模型中用于决定采样的策略,限制模型生成词语时只考虑前K个最高概率的词语或总概率加和超过P阈值的词语集合。
  3. 针对大语言模型特有的关键参数

    • 预训练与微调策略相关参数:
      • 注意力掩码(Attention Mask):在自注意力机制中,用于指示模型忽略填充项和未来的预测项。
      • 编码器-解码器之间的掩码(Decoder Input Mask):在Transformer等模型中,确保解码器不能看到未来的目标序列信息。
      • 最大序列长度(Max Sequence Length):对输入序列进行截断的最大长度。
    • 微调任务特定参数:
      • 标签平滑(Label Smoothing):在分类任务中,使模型对正确类别以外的标签分配一定的概率,避免过拟合。
      • 噪声对比估计(Noise Contrastive Estimation, NCE)或掩码语言模型(Masked Language Model, MLM)损失相关的参数。
      • 结合知识蒸馏的参数,如教师模型的温度、学生模型和教师模型之间的相似性度量等。
  4. 训练过程控制参数

    • 训练步数(Epochs):模型完整遍历训练数据集的次数。
    • 学习率调度策略(Learning Rate Scheduler):控制训练过程中学习率的变化规则,如余弦退火、指数衰减等。
  5. 大语言模型的生成参数

    • 采样策略:如贪心搜索(Greedy Decoding)、 Beam Search 或者噪声分布采样(如上文提到的Top-K、Top-P采样)。
    • 控制生成文本长度的参数:如最大生成长度(Max Generation Length)。

这些参数的选择和调整对于模型的性能至关重要,也是训练和优化大语言模型的核心挑战之一

  • 在训练大语言模型时,并不是每次训练都需要修改所有参数。
  • 一些参数相对固定且具有通用性,例如模型结构的设计(层的数量、隐藏单元大小等)通常是经过初步实验后确定的。
  • 而另一些超参数,尤其是学习率、批次大小、正则化强度等,则可能需要根据具体任务和数据集的特点进行细致调整。
03-18 06:51