在 Amazon SageMaker 上使用 Hugging Face Transformers 对问答任务的 BERT 大型模型进行分布式微调

源节点: 1885069

从训练新模型到将它们部署到生产中, 亚马逊SageMaker 为初创企业和企业提供最完整的工具集,以利用机器学习 (ML) 和深度学习的力量。

凭借其 Transformers 开源库和 ML 平台,Hugging Face 使全球 AI 社区可以访问迁移学习和最新的 ML 模型,从而减少了全球公司的数据科学家和 ML 工程师利用每一个新科学技术所需的时间进步。

将 Transformer 应用于新的 NLP 任务或领域需要对大型语言模型进行微调,这是一种利用预训练模型积累的知识,在额外、高效的训练过程中使其适应新任务或特定类型文档的技术。

微调模型以对手头的业务问题产生准确的预测需要训练大型 Transformers 模型,例如 BERT、BART、RoBERTa、T5,这可能很难以可扩展的方式执行。

Hugging Face 一直与 SageMaker 密切合作以交付 即用型深度学习容器 (DLC) 使培训和部署最新的变形金刚模型比以往任何时候都更容易和更快。 由于将 SageMaker Data Parallel (SMDP)、SageMaker Model Parallel (SMMP)、S3 管道模式等功能集成到容器中,使用这些功能可以大大减少公司创建基于 Transformer 的 ML 解决方案(例如问答、生成)的时间文本和图像,优化搜索结果,并改进客户支持自动化、对话界面、语义搜索、文档分析和更多应用程序。

在这篇博文中,我们重点介绍 SageMaker 分布式库与 Hugging Face 的深度集成,这使数据科学家能够将 Transformers 模型的训练和微调从几天加速到几小时,这一切都在 SageMaker 中进行。

分布式训练概述

ML 从业者和数据科学家在训练模型时面临两个缩放挑战:缩放模型大小(参数和层数)和缩放训练数据。 缩放模型大小或训练数据可以获得更好的准确性,但在深度学习中可能会出现加速器(CPU 或 GPU)上的内存量限制训练数据大小与模型大小的组合的情况。模型。 例如,在训练大型语言模型时,批量大小通常仅限于少量样本,这会导致模型的准确性降低。

分布式训练可以拆分工作负载以在多个处理器之间训练模型,称为 工人. 这些 worker 并行操作以加速模型训练。

根据我们想要扩展的内容(模型或数据),有两种分布式训练方法: 数据并行和模型并行.

数据并行是最常见的分布式训练方法。 数据并行性需要在不同的加速器上创建模型架构和权重的副本。 然后,我们可以将训练集划分到不同的加速器,而不是将整个训练集传递给单个加速器,从而更快地完成训练集。 尽管这增加了加速器需要将其梯度信息传回参数服务器的步骤,但这个时间被每个加速器迭代整个数据集的一小部分的速度提升所抵消。 因此,数据并行性可以显着帮助减少训练时间。 例如,在没有并行化的情况下训练单个模型需要 4 个小时。 使用分布式训练可以将时间缩短至 24 分钟。 SageMaker 分布式训练还在梯度更新方面实现了前沿技术。

模型并行方法用于大型模型,这些模型太大而无法安装在一个加速器 (GPU) 上。 这种方法实现了一种并行化策略,其中模型架构被分成碎片并放置在不同的加速器上。 这些分片中的每一个的配置都依赖于神经网络架构,并且通常包括多个层。 每次训练数据从一个分片传递到下一个分片时,加速器之间就会进行通信。

总而言之,对于大型数据集导致的时间密集型任务,或者当您想要加速训练实验时,您应该使用分布式训练数据并行性。 当您的模型无法适用于一个加速器时,您应该使用模型并行性。

先决条件

要在 SageMaker 中对 Hugging Face Transformers 模型进行分布式训练,您需要完成以下先决条件:

实施分布式训练

Hugging Face Transformers 库提供了一个经过优化的 Trainer API,可以训练或微调库提供的模型。 如果它们的工作方式与变形金刚模型相同,您也可以在自己的模型上使用它; 看 训练者 更多细节。 这个 API 用于我们的 示例脚本,展示了如何为各种 NLP 任务预处理数据,您可以将其作为模型来编写脚本来解决您自己的自定义问题。 Trainer API 的承诺是该脚本可以在任何分布式设置(包括 SageMaker)上开箱即用。

Trainer API 获取训练所需的一切。 这包括您的数据集、模型(或返回模型的函数)、 compute_metrics 该函数从预测和标签数组、优化器和学习率调度程序(提供了良好的默认值)以及您可以为训练调整的所有超参数返回您想要跟踪的指标,这些超参数分组在一个名为 TrainingArguments. 综上所述,它公开了三种方法——训练、评估和预测——来训练你的模型,获得任何数据集的度量结果,或获得任何数据集的预测。 要了解有关 Trainer 对象的更多信息,请参阅 使用 Trainer API 微调模型 和视频 培训师API,它会引导您完成一个简单的示例。

在幕后,Trainer API 首先分析您在创建脚本时启动脚本的环境 TrainingArguments. 例如,如果您使用 SageMaker 启动训练,它会查看 SM_FRAMEWORK_PARAMS 环境中的变量以检测您是否启用了 SageMaker 数据并行性或模型并行性。 然后它在执行必要的初始化步骤(例如 smdistributed.dataparallel.torch.distributed.init_process_group()).

Trainer 包含整个训练循环,因此它可以调整必要的步骤以确保 smdistributed.dataparallel 后端在必要时使用,而无需更改脚本中的一行代码。 它仍然可以在您的本地机器上运行(虽然慢得多)以进行调试。 它处理数据集的分片,以便每个过程自动看到不同的样本,在每个时期进行重新洗牌,在优化步骤之前同步梯度,如果激活它则进行混合精度训练,如果不能适应大批量大小则进行梯度累积您的 GPU,以及更多优化。

如果您激活了模型并行性,它会确保必须看到相同数据的进程(如果它们 dp_rank 是相同的)得到相同的批次,并且处理不同 dp_rank 看不到相同的样本,在每个时期再次重新洗牌。 它确保模型或优化器的状态字典在检查点时正确同步,并再次处理所有优化,如混合精度和梯度累积。

使用评估和预测方法时,Trainer 会执行分布式评估,以利用您的所有 GPU。 它可以正确处理每个进程的数据拆分(相同的进程 dp_rank 如果激活了模型并行性)并确保在将预测发送到 compute_metrics 功能或刚刚返回。 使用 Trainer API 不是强制性的。 用户仍然可以在 Hugging Face 中使用 Keras 或 PyTorch。 但是,Trainer API 可以提供有用的抽象层。

使用 SageMaker Hugging Face Estimators 训练模型

Estimator 是 SageMaker 培训的高级接口,可处理端到端 SageMaker 培训和部署任务。 调用时会调用脚本的训练 fitHuggingFace 估算器。 在 Estimator 中,您定义要用作的微调脚本 entry_point,这 instance_type 使用,以及传入哪些超参数。有关的更多信息 HuggingFace 参数,请参阅 拥抱脸估计器.

分布式训练:数据并行

在此示例中,我们使用新的 Hugging Face DLC 和 SageMaker SDK 来训练分布式 Seq2Seq-transformer 模型,以使用 Transformers 和数据集库处理问答任务。 这 bert-large-uncased-全字掩码 模型是微调的 数据集。

以下代码示例向您展示了创建一个 HuggingFace 具有数据并行性的分布式训练估计器。

  1. 选择 Hugging Face Transformers 脚本:
    # git configuration to download our fine-tuning script
    git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'}

当您创建一个 HuggingFace Estimator,您可以指定存储在 GitHub 存储库中的训练脚本作为 Estimator 的入口点,因此您不必在本地下载脚本。 您可以使用 git_config 运行 Hugging Face Transformers 示例脚本和正确的“分支”,如果你 transformers_version 需要配置。 例如,如果您使用 transformers_version 4.6.1,你必须使用 'branch':'v4.6.1“。

  1. 配置传递到训练作业中的训练超参数:
    # hyperparameters, which are passed into the training job
    hyperparameters={ 'model_name_or_path': 'bert-large-uncased-whole-word-masking', 'dataset_name':'squad', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 4, 'per_device_eval_batch_size': 4, 'num_train_epochs': 2, 'max_seq_length': 384, 'max_steps': 100, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model'
    }

作为超参数,我们可以定义任何 Seq2SeqTraining参数 以及训练脚本中定义的那些。

  1. 定义分布参数 HuggingFace 估算器:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

您可以使用 SageMaker数据并行库 开箱即用的分布式训练。 我们将数据并行的功能直接添加到 Trainer 中。 要启用数据并行性,您只需将一个参数添加到您的 HuggingFace Estimator 让您的基于 Trainer 的代码自动使用它。

  1. 创建一个 HuggingFace 估计器包括前面步骤中定义的参数并开始训练:
from sagemaker.huggingface import HuggingFace
# estimator
huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type= 'ml.p3.16xlarge', instance_count= 2, volume_size= 200, role= <SageMaker Role>, # IAM role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', distribution= distribution, hyperparameters = hyperparameters) # starting the train job huggingface_estimator.fit()

拥抱脸变形金刚存储库 包含几个示例和脚本,用于在从语言建模到标记分类的任务上微调模型。 在我们的例子中,我们使用 run_qa.py 来自 examples/pytorch/question-answering 例子。

smdistributed.dataparallel 支持 SageMaker 上的模型训练 仅限以下实例类型. 为获得最佳性能,我们建议使用支持的实例类型 弹性织物适配器 (全民教育):

  • 毫升.p3.16xlarge
  • ml.p3dn.24xlarge(推荐)
  • ml.p4d.24xlarge(推荐)

获得最佳性能并充分利用 SMDataParallel,你应该至少使用两个实例,但你也可以使用一个来测试这个例子。

下列 示例笔记本 提供更详细的分步指导。

分布式训练:模型并行

对于具有模型并行性的分布式训练,我们将 Hugging Face Transformers 和数据集库与 SageMaker SDK 一起用于序列分类 通用语言理解评估 (GLUE) 使用多节点、多 GPU 集群进行基准测试 SageMaker 模型并行库.

与数据并行性一样,我们首先在 HuggingFace 估算器:

# git configuration to download our fine-tuning script
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'} # hyperparameters, which are passed into the training job
hyperparameters={ 'model_name_or_path':'roberta-large', 'task_name': 'mnli', 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'do_train': True, 'do_eval': True, 'do_predict': True, 'num_train_epochs': 2, 'output_dir':'/opt/ml/model', 'max_steps': 500,
} # configuration for running training on smdistributed Model Parallel
mpi_options = { "enabled" : True, "processes_per_host" : 8,
}
smp_options = { "enabled":True, "parameters": { "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "partitions": 4, "ddp": True, }
} distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options
}

模型并行库在内部使用 MPI,因此要使用模型并行,必须使用分布参数启用 MPI。 “processes_per_host”在前面的代码中指定了 MPI 应该在每台主机上启动的进程数。 我们建议这些用于开发和测试。 在生产时,如果需要大量 GPU 容量,您可以联系 AWS Support。 有关详细信息,请参阅 运行 SageMaker 分布式模型并行训练作业.

下列 示例笔记本 包含完整的代码脚本。

竞价实例

借助 SageMaker Python SDK 的 Hugging Face 框架扩展,我们还可以利用完全托管的 亚马逊弹性计算云 (Amazon EC2) 竞价实例 并节省高达 90% 的培训成本。

除非你的训练工作很快完成,否则我们建议你使用 检查点 使用托管现场培训,因此您需要定义 checkpoint_s3_uri.

将 Spot 实例与 HuggingFace 估计器,我们必须设置 use_spot_instances 参数为 True 并定义你的 max_waitmax_run 时间。 有关托管现场培训生命周期的更多信息,请参阅 Amazon SageMaker中的托管现场培训.

以下是设置现场训练 Estimator 的代码片段:

from sagemaker.huggingface import HuggingFace # hyperparameters, which are passed into the training job
hyperparameters={'epochs': 1, 'train_batch_size': 32, 'model_name':'distilbert-base-uncased', 'output_dir':'/opt/ml/checkpoints' } # s3 uri where our checkpoints will be uploaded during training
job_name = "using-spot"
checkpoint_s3_uri = f's3://{sess.default_bucket()}/{job_name}/checkpoints' huggingface_estimator = HuggingFace(entry_point='train.py', source_dir='./scripts', instance_type='ml.p3.2xlarge', instance_count=1, base_job_name=job_name, checkpoint_s3_uri=checkpoint_s3_uri, use_spot_instances=True, max_wait=3600, # This should be equal to or greater than max_run in seconds' max_run=1000, # expected max run in seconds role=role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', hyperparameters = hyperparameters)

下列 笔记本 包含完整的代码脚本。

结论

在这篇博文中,我们讨论了使用 SageMaker 对 Hugging Face Transformer 进行分布式训练。 我们首先回顾了数据并行与模型并行的用例。 数据并行性通常更合适,但不一定限于训练受到计算瓶颈的情况,而当模型无法适应单个加速器提供的内存时,您可以使用模型并行性。 然后我们展示了如何使用这两种方法进行训练。

在我们讨论的数据并行性用例中,在单个 p3.2xlarge 实例(使用单个 GPU)上训练模型需要 4 个小时,在撰写本文时成本约为 15 美元。 通过数据并行,我们可以在 24 分钟内以 28 美元的成本训练同一个模型。 虽然成本增加了一倍,但是却减少了10倍的训练时间。对于需要在短时间内训练很多模型的情况,数据并行可以以相对较低的成本增加来实​​现。 至于模型并行性用例,它增加了训练模型的能力,这些模型以前由于硬件限制根本无法训练。 这两个功能都为 ML 从业者提供了新的工作流程,并且可以通过 HuggingFace Estimator 作为 SageMaker Python SDK 的一部分。 将这些模型部署到托管端点遵循与其他 Estimator 相同的过程。

此集成支持作为 SageMaker 生态系统一部分的其他功能。 例如,您可以通过向 Estimator 添加一个简单的标志来使用 Spot 实例,以实现额外的成本优化。 下一步,您可以找到并运行 培训演示示例笔记本.


作者简介

阿奇斯·乔格卡 是新兴技术团队的 AI/ML 合作伙伴解决方案架构师。 他对使用 AWS 构建块的高性能、可扩展深度学习和科学计算感兴趣。 他过去的经历从计算物理研究到学术界、国家实验室和初创公司的机器学习平台开发。 他远离电脑的时间是踢足球和与朋友和家人一起度过的。

詹姆斯·易 是 Amazon Web Services 新兴技术团队的高级 AI/ML 合作伙伴解决方案架构师。 他热衷于与企业客户和合作伙伴合作,设计、部署和扩展 AI/ML 应用程序以获取他们的商业价值。 工作之余,他喜欢踢足球、旅行和与家人共度时光。

菲利普·施密德 是 Hugging Face 的机器学习工程师和技术主管,负责领导与 Amazon SageMaker 团队的合作。 他热衷于使尖端 NLP 模型民主化、优化和生产化,并提高深度学习的易用性。

西尔万·古格 是 Hugging Face 的研究工程师,也是 Transformers 库的主要维护者之一。 他热爱开源软件并帮助社区使用它。

杰夫布迪尔 在领先的开源 ML 库 Transformers 的创建者 Hugging Face 构建产品。 此前,Jeff 是 Stupeflix 的联合创始人,该公司被 GoPro 收购,他在该公司担任产品管理、产品营销、业务开发和企业发展总监。

来源:https://aws.amazon.com/blogs/machine-learning/distributed-fine-tuning-of-a-bert-large-model-for-a-question-answering-task-using-hugging-face-变形金刚-on-amazon-sagemaker/

时间戳记:

更多来自 AWS机器学习博客