使用 LoRA 和 Hugging Face 高效训练大语言模型

Posted Hugging Face 博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 LoRA 和 Hugging Face 高效训练大语言模型相关的知识,希望对你有一定的参考价值。

在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 FLAN-T5 XXL 模型。在此过程中,我们会使用到 Hugging Face 的 TransformersAcceleratePEFT 库。

通过本文,你会学到:

  1. 如何搭建开发环境
  2. 如何加载并准备数据集
  3. 如何使用 LoRA 和 bnb (即 bitsandbytes) int-8 微调 T5
  4. 如何评估 LoRA FLAN-T5 并将其用于推理
  5. 如何比较不同方案的性价比

另外,你可以 点击这里 在线查看此博文对应的 Jupyter Notebook。

快速入门: 轻量化微调 (Parameter Efficient Fine-Tuning,PEFT)

PEFT 是 Hugging Face 的一个新的开源库。使用 PEFT 库,无需微调模型的全部参数,即可高效地将预训练语言模型 (Pre-trained Language Model,PLM) 适配到各种下游应用。PEFT 目前支持以下几种方法:

注意: 本教程是在 g5.2xlarge AWS EC2 实例上创建和运行的,该实例包含 1 个 NVIDIA A10G

1. 搭建开发环境

在本例中,我们使用 AWS 预置的 PyTorch 深度学习 AMI,其已安装了正确的 CUDA 驱动程序和 PyTorch。在此基础上,我们还需要安装一些 Hugging Face 库,包括 transformers 和 datasets。运行下面的代码就可安装所有需要的包。

# install Hugging Face Libraries
!pip install git+https://github.com/huggingface/peft.git
!pip install "transformers==4.27.1" "datasets==2.9.0" "accelerate==0.17.1" "evaluate==0.4.0" "bitsandbytes==0.37.1" loralib --upgrade --quiet
# install additional dependencies needed for training
!pip install rouge-score tensorboard py7zr

2. 加载并准备数据集

这里,我们使用 samsum 数据集,该数据集包含大约 16k 个含摘要的聊天类对话数据。这些对话由精通英语的语言学家制作。


  "id": "13818513",
  "summary": "Amanda baked cookies and will bring Jerry some tomorrow.",
  "dialogue": "Amanda: I baked cookies. Do you want some?\\r\\nJerry: Sure!\\r\\nAmanda: I\'ll bring you tomorrow :-)"

我们使用

查看 Hugging Face Sagemaker 模型的训练错误指标

【中文标题】查看 Hugging Face Sagemaker 模型的训练错误指标【英文标题】:View train error metrics for Hugging Face Sagemaker model 【发布时间】:2022-01-15 06:18:42 【问题描述】:

我已经使用 Hugging Face 与 Amazon Sagemaker and their Hello World example 的集成训练了一个模型。

通过在训练模型上调用training_job_analyticshuggingface_estimator.training_job_analytics.dataframe(),我可以轻松地计算和查看评估测试集上生成的指标:准确度、f-score、精度、召回率等:huggingface_estimator.training_job_analytics.dataframe()

我如何才能在训练集上看到相同的指标(甚至每个 epoch 的训练误差)?

培训代码与添加文档的额外部分的链接基本相同:

from sagemaker.huggingface import HuggingFace

# optionally parse logs for key metrics
# from the docs: https://huggingface.co/docs/sagemaker/train#sagemaker-metrics
metric_definitions = [
    'Name': 'loss', 'Regex': "'loss': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'learning_rate', 'Regex': "'learning_rate': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_loss', 'Regex': "'eval_loss': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_accuracy', 'Regex': "'eval_accuracy': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_f1', 'Regex': "'eval_f1': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_precision', 'Regex': "'eval_precision': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_recall', 'Regex': "'eval_recall': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_runtime', 'Regex': "'eval_runtime': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'eval_samples_per_second', 'Regex': "'eval_samples_per_second': ([0-9]+(.|e\-)[0-9]+),?",
    'Name': 'epoch', 'Regex': "'epoch': ([0-9]+(.|e\-)[0-9]+),?"
]

# hyperparameters, which are passed into the training job
hyperparameters=
    'epochs': 5,
    'train_batch_size': batch_size,
    'model_name': model_checkpoint,
    'task': task,


# init the model (but not yet trained)
huggingface_estimator = HuggingFace(
    entry_point='train.py',
    source_dir='./scripts',
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    role=role,
    transformers_version='4.6',
    pytorch_version='1.7',
    py_version='py36',
    hyperparameters = hyperparameters,
    metric_definitions=metric_definitions
)
# starting the train job with our uploaded datasets as input
huggingface_estimator.fit('train': training_input_path, 'test': test_input_path)

# does not return metrics on training - only on eval!
huggingface_estimator.training_job_analytics.dataframe()

【问题讨论】:

【参考方案1】:

这可以通过将训练中的 epoch 数增加到更现实的值来解决。

目前,模型的训练时间不到 300 秒(这是记录以下时间戳的时间),并且可能是损失函数。

要进行的更改:

hyperparameters=
    'epochs': 100, # increase the number of epochs to realistic value!
    'train_batch_size': batch_size,
    'model_name': model_checkpoint,
    'task': task,

【讨论】:

以上是关于使用 LoRA 和 Hugging Face 高效训练大语言模型的主要内容,如果未能解决你的问题,请参考以下文章

官宣:Hugging Face x ILLA Cloud 深度合作

在管道中使用带有参数的 Hugging-face 转换器

从 Hugging Face 模型加载权重时出错

Hugging-Face Transformers:从路径错误中加载模型

查看 Hugging Face Sagemaker 模型的训练错误指标

BERT模型Hugging face的慢速训练