admin管理员组

文章数量:1608358

威震天-LM & 威震天-核心

用于大规模训练 Transformer 模型的 GPU 优化技术

 

 

最新消息

  • [2024/1 公告] NVIDIA 已将Megatron-LM的核心功能发布到此存储库中的Megatron-Core中。Megatron-Core 在 Megatron-LM 的 GPU 优化技术的基础上进行了扩展,并在系统级优化方面进行了更多尖端创新,具有可组合和模块化 API。探索 Megatron- Core 简介以了解更多详细信息。

目录

  • 威震天概览
    • 威震天-LM
    • 威震天核心
  • 训练速度和可扩展性
  • 设置
    • 下载检查点
  • 用法
  • 训练
    • 数据预处理
    • BERT 预训练
    • GPT 预训练
    • T5 预训练
    • 分布式预训练
    • 激活检查点和重新计算
    • 分布式优化器
    • Flash注意力
    • GPT-3 示例
    • Retro 和 InstructRetro
  • 评估与任务
    • GPT 文本生成
    • GPT 评估
      • WikiText 困惑度评估
      • LAMBADA 完形填空准确率
    • BERT 任务评估
      • RACE 评估
      • MNLI 评估
    • Llama-2 推理和微调
  • 数据集
    • 收集维基百科训练数据
    • 收集 GPT Webtext 数据
  • 可重复性
  • 使用 Megatron 的项目

威震天概览

该存储库包含两个基本组件:Megatron-LMMegatron-Core。Megatron -LM 是一个面向研究的框架,利用 Megatron-Core 进行大型语言模型 (LLM) 训练。另一方面,Megatron-Core 是一个 GPU 优化训练技术库,附带正式的产品支持,包括版本化 API 和定期发布。您可以将 Megatron-Core 与 Megatron-LM 或Nvidia NeMo Framework一起使用,以获得端到端和云原生解决方案。或者,您可以将 Megatron-Core 的构建块集成到您首选的训练框架中。

威震天-LM

Megatron( 1、2和3 )于 2019 年首次推出,在 AI 社区掀起了一波创新浪潮,使研究人员和开发人员能够利用该库的基础来进一步推动 LLM 的发展。如今,许多最受欢迎的 LLM 开发人员框架都受到开源 Megatron-LM 库的启发并直接利用该库构建,从而引发了一波基础模型和 AI 初创企业的浪潮。在 Megatron-LM 之上构建的一些最受欢迎的 LLM 框架包括Colossal-AI、HuggingFace Accelerate和NVIDIA NeMo Framework 。可在此处找到直接使用 Megatron 的项目列表。

威震天核心

Megatron-Core 是一个新发布的基于 PyTorch 的开源库,它进一步扩展了从 Megatron-LM 继承的 GPU 优化技术集合,并在系统级优化方面进行了更多前沿创新。它将它们抽象为可组合和模块化的 API,使开发人员和模型研究人员能够完全灵活地在 NVIDIA 加速计算基础设施上大规模训练自定义转换器。该库与所有 NVIDIA Tensor Core GPU 兼容,包括对 NVIDIA Hopper 架构的 FP8 加速支持。

Megatron-Core 提供核心构建块,例如注意力机制、变压器块和层、规范化层和嵌入技术。激活重新计算、分布式检查点等附加功能也内置于库中。这些构建块和功能都针对 GPU 进行了优化,并且可以使用高级并行化策略构建,以在 NVIDIA 加速计算基础架构上实现最佳训练速度和稳定性。Megatron-Core 库的另一个关键组件包括高级模型并行技术(张量、序列和管道)。目前,基于解码器(例如GPT、Llama)、编码器(例如BERT)、编码器-解码器(例如T5)检索增强变压器(例如 RETRO和专家混合 (MoE) 的流行 LLM 模型架构可以轻松构建,并在大规模计算范围内实现性能和效率。开发人员还可以使用 Megatron-Core 的变压器块和功能 API 来构建自己的自定义层。

训练速度和可扩展性

我们的代码库能够有效地训练非常大(数千亿个参数)的语言模型,并且具有模型和数据并行性。为了演示代码如何随着多个 GPU 和模型大小而扩展,我们考虑从 10 亿个参数一直到 1 万亿个参数的 GPT 模型。所有模型都使用 51,200 个词汇表和 2048 个序列长度。我们改变隐藏大小、注意力头数量和层数以达到特定的模型大小。随着模型大小的增加,我们也会适度增加批量大小。我们利用NVIDIA 的 Selene 超级计算机进行扩展研究,并为最大的模型使用多达 3072 个A100 GPU。每个集群节点都有 8 个 NVIDIA 80GB A100 GPU。下图显示,我们几乎线性扩展到在 3072 个 GPU 上运行的 1 万亿个参数模型。请注意,这些结果来自基准运行,这些模型未经训练以达到收敛;然而,FLOP 是针对端到端训练进行测量的,即包括数据加载、优化甚至日志记录等所有操作。

下表显示了模型 (MFU) 和硬件 (HFU) FLOP 利用率,适用于最多 1T 参数的选定配置(请参阅我们的论文以了解这些计算方法)。随着模型大小的增加,我们实现了更好的 GPU 利用率。对于一万亿参数模型,我们分别达到了 56.3% 和 57.0% 的 MFU 和 HFU。请注意,这些数字也是在基准测试运行中测量的,在这种情况下,使用数据并行大小 1 进行测量。由于数据并行组之间需要梯度全归约,数据并行性会带来一些开销。但是,对于大型 Transformer 模型,这种开销并不大,并且几乎可以通过将梯度全归约与反向传播重叠而完全消除。

模型尺寸模型 FLOP 利用率硬件 FLOP 利用率
22B41.5%43.7%
175B51.4%52.8%
530B56.0%57.0%
1吨56.3%57.0%

设置

我们强烈建议使用NGC 的 PyTorch 容器的最新版本和 DGX 节点。如果您出于某种原因无法使用它,请使用最新的 pytorch、cuda、nccl 和 NVIDIA APEX版本。数据预处理需要NLTK,但这对于训练、评估或下游任务来说不是必需的。

您可以使用以下 Docker 命令启动 PyTorch 容器的实例并挂载 Megatron、数据集和检查点:

<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>docker pull nvcr.io/nvidia/pytorch:xx.xx-py3
docker run --gpus all -it --rm -v /path/to/megatron:/workspace/megatron -v /path/to/dataset:/workspace/dataset -v /path/to/checkpoints:/workspace/checkpoints nvcr.io/nvidia/pytorch:xx.xx-py3
</code></span></span></span></span></span>

下载检查点

我们提供了预训练的BERT-345M和GPT-345M检查点,用于评估或微调下游任务。要访问这些检查点,请先注册并设置NVIDIA GPU Cloud (NGC) Registry CLI。有关下载模型的更多文档,请参阅NGC 文档。

或者,您可以使用以下方式直接下载检查点:

BERT-345M-uncased:wget --content-disposition https://api.ngc.nvidia/v2/models/nvidia/megatron_bert_345m/versions/v0.1_uncased/zip -O megatron_bert_345m_v0.1_uncased.zip
BERT-345M-cased:wget --content-disposition https://api.ngc.nvidia/v2/models/nvidia/megatron_bert_345m/versions/v0.1_cased/zip -O megatron_bert_345m_v0.1_cased.zip
GPT-345M:wget --content-disposition https://api.ngc.nvidia/v2/models/nvidia/megatron_lm_345m/versions/v0.0/zip -O megatron_lm_345m_v0.0.zip

模型需要词汇文件才能运行。BERT WordPiece 词汇文件可以从 Google 的预训练 BERT 模型中提取:uncased、cased。GPT词汇文件和合并表可以直接下载。

用法

安装后,有几种可能的工作流程。最全面的是:

  1. 数据预处理
  2. 预训练
  3. 微调(零样本任务可选)
  4. 下游任务评估或文本生成

但是,可以使用上面提到的预训练模型之一来代替步骤 1 和 2。

我们在目录中提供了几个用于预训练 BERT 和 GPT 的脚本examples,以及用于零样本和微调下游任务的脚本,包括 MNLI、RACE、WikiText103 和 LAMBADA 评估。还有一个用于 GPT 交互式文本生成的脚本。

训练

数据预处理

训练数据需要预处理。首先,将训练数据置于松散的 json 格式中,每个 json 每行包含一个文本样本。例如:

{"src": "www.nvidia", "text": "敏捷的棕色狐狸", "type": "Eng", "id": "0", "title": "第一部分"}
{"src": "互联网", "text": "跳过懒狗", "type": "Eng", "id": "42", "title": "第二部分"}

可以使用中的标志text来更改 json 的字段名称。其他元数据是可选的,不用于训练。--json-keypreprocess_data.py

然后将松散的 json 处理为二进制格式以进行训练。要将 json 转换为 mmap 格式,请使用preprocess_data.py。为 BERT 训练准备数据的示例脚本是:

python 工具/preprocess_data.py \
       --输入我的语料库.json \
       --输出前缀 my-bert \
       --vocab 文件 bert-vocab.txt \
       --tokenizer 类型 BertWordPieceLowerCase \
       --拆分句子

输出将是两个文件,在本例中名为my-bert_text_sentence.binmy-bert_text_sentence.idx--data-path稍后在 BERT 训练中指定的是完整路径和新文件名,但没有文件扩展名。

对于 T5,使用与 BERT 相同的预处理,或许将其重命名为:

       --输出前缀 my-t5 \

GPT 数据预处理需要进行一些小的修改,即添加合并表、文档结束标记、删除句子拆分以及更改标记器类型:

python 工具/preprocess_data.py \
       --输入我的语料库.json \
       --输出前缀 my-gpt2 \
       --词汇文件 gpt2-词汇.json \
       --tokenizer 类型 GPT2BPETokenizer \
       --合并文件 gpt2-merges.txt \
       --append-eod

这里的输出文件被命名为my-gpt2_text_document.binmy-gpt2_text_document.idx。和以前一样,在 GPT 训练中,使用较长的名称(不带扩展名)作为--data-path

源文件中描述了进一步的命令行参数preprocess_data.py。

BERT 预训练

该examples/pretrain_bert.sh脚本运行单 GPU 345M 参数 BERT 预训练。调试是单 GPU 训练的主要用途,因为代码库和命令行参数针对高度分布式训练进行了优化。大多数参数都相当不言自明。默认情况下,学习率在训练迭代中线性衰减,从开始到迭代--lr设置的最小值。用于预热的训练迭代分数由设置。虽然这是单 GPU 训练,但指定的批处理大小是单个前向-后向路径批处理大小,代码将执行梯度累积步骤,直到达到每次迭代的批处理大小。数据被划分为训练/验证/测试集的 949:50:1 比例(默认值为 969:30:1)。这种划分是即时发生的,但在使用相同随机种子(默认为 1234,或使用手动指定)的运行中保持一致。我们使用作为请求的训练迭代。或者,可以提供要训练的样本总数。如果存在此选项,则不需要提供,而是需要提供。--min-lr--lr-decay-iters--lr-warmup-fraction--micro-batch-sizeglobal-batch-size--seedtrain-iters--train-samples--lr-decay-iters--lr-decay-samples

指定了日志记录、检查点保存和评估间隔选项。请注意,现在--data-path包括在预处理中添加的附加_text_sentence后缀,但不包括文件扩展名。

源文件中描述了进一步的命令行参数arguments.py。

要运行,请进行任何所需的修改,包括设置、和examples/pretrain_bert.sh的环境变量。确保将这些变量设置为容器中的路径。然后启动已安装 Megatron 和必要路径的容器(如设置中所述)并运行示例脚本。CHECKPOINT_PATHVOCAB_FILEDATA_PATH

GPT 预训练

examples/pretrain_gpt.sh脚本运行单 GPU 345M 参数 GPT 预训练。如上所述,单 GPU 训练主要用于调试目的,因为代码针对分布式训练进行了优化。

它与之前的 BERT 脚本的格式基本相同,但有一些显著的区别:使用的标记化方案是 BPE(需要合并表和json词汇文件)而不是 WordPiece,模型架构允许更长的序列(请注意,最大位置嵌入必须大于或等于最大序列长度),并且已--lr-decay-style设置为余弦衰减。请注意,--data-path现在包括在预处理中添加的附加_text_document后缀,但不包括文件扩展名。

源文件中描述了进一步的命令行参数arguments.py。

examples/pretrain_gpt.sh可以按照 BERT 中所述的方式启动。设置环境变量并进行任何其他修改,使用适当的挂载启动容器,然后运行脚本。

T5 预训练

与 BERT 和 GPT 非常相似,该examples/pretrain_t5.sh脚本运行单个 GPU“基础”(约 220M 个参数)T5 预训练。与 BERT 和 GPT 的主要区别在于添加了以下参数以适应 T5 架构:

  • --kv-channels设置模型中所有注意力机制的“键”和“值”矩阵的内部维度。对于 BERT 和 GPT,此默认值为隐藏大小除以注意力头的数量,但可以为 T5 配置。

  • --ffn-hidden-size设置变压器层前馈网络中的隐藏大小。对于 BERT 和 GPT,默认为变压器隐藏大小的 4 倍,但可以为 T5 配置。

  • --encoder-seq-length--decoder-seq-length分别为编码器和解码器设置序列长度。

所有其他参数与 BERT 和 GPT 预训练中的参数相同。使用上述针对其他脚本的相同步骤运行此示例。

分布式预训练

脚本examples/pretrain_{bert,gpt,t5}_distributed.sh使用 PyTorch 分布式启动器进行分布式训练。因此,通过正确设置环境变量即可实现多节点训练。有关这些环境变量的进一步描述,请参阅官方 PyTorch文档。默认情况下,多节点训练使用nccl分布式后端。一组简单的附加参数以及将 PyTorch 分布式模块与弹性启动器(相当于)一起使用是采用分布式训练的唯一附加要求。有关更多详细信息,请参阅其中任何一个。torchrunpython -m torch.distributed.runexamples/pretrain_{bert,gpt,t5}_distributed.sh

我们使用两种类型的并行:数据并行和模型并行。我们的数据并行实现位于 中,并且在使用命令行选项megatron/core/distributed时支持梯度降低与后向传递的重叠。--overlap-grad-reduce

其次,我们开发了一种简单而高效的二维模型并行方法。要使用第一个维度,即张量模型并行(将单个转换器模块的执行拆分到多个 GPU 上,请参阅我们论文的第 3 节),请添加--tensor-model-parallel-size标志以指定要在其中拆分模型的 GPU 数量,以及传递给分布式启动器的参数(如上所述)。要使用第二个维度,即序列并行,请指定--sequence-parallel,这也需要启用张量模型并行,因为它会拆分到相同的 GPU 上(更多详细信息请参阅我们论文的第 4.2.2 节)。

要使用流水线模型并行性(将变压器模块分成几个阶段,每个阶段具有相同数量的变压器模块,然后通过将批次分成更小的微批次来实现流水线执行,请参阅我们的论文第 2.2 节),请使用--pipeline-model-parallel-size标志指定要将模型分成的阶段数(例如,将具有 24 个变压器层的模型分成 4 个阶段意味着每个阶段各获得 6 个变压器层)。

我们有如何使用这两种不同形式的模型并行性的示例,示例脚本以 结尾distributed_with_mp.sh

除了这些细微的变化之外,分布式训练与单个 GPU 上的训练完全相同。

可以使用参数启用交错流水线调度(更多详细信息请参阅我们论文--num-layers-per-virtual-pipeline-stage的第 2.2.2 节) ,该参数控制虚拟阶段中的变压器层数(默认情况下,使用非交错调度,每个 GPU 将执行一个具有NUM_LAYERS / PIPELINE_MP_SIZE变压器层的虚拟阶段)。变压器模型中的总层数应该可以被该参数值整除。此外,使用此调度时,管道中的微批次数量(计算为GLOBAL_BATCH_SIZE / (DATA_PARALLEL_SIZE * MICRO_BATCH_SIZE))应该可以被整除PIPELINE_MP_SIZE(此条件在代码中的断言中检查)。对于具有 2 个阶段的管道(PIPELINE_MP_SIZE=2),不支持交错调度。

激活检查点和重新计算

为了在训练大型模型时减少 GPU 内存使用量,我们支持各种形式的激活检查点和重新计算。与传统深度学习模型中的做法不同,我们不会将所有激活都存储在内存中以供反向传播使用,而是只在模型中的某些“检查点”处保留(或存储)在内存中,其他激活则在反向传播需要时即时重新计算。请注意,这种检查点(激活检查点)与其他地方提到的模型参数和优化器状态的检查点非常不同。

我们支持两种级别的重新计算粒度:selectivefull。选择性重新计算是默认设置,几乎在所有情况下都建议使用。此模式在内存中保留占用较少内存存储空间且重新计算成本较高的激活,并重新计算占用更多内存存储空间但重新计算成本相对较低的激活。有关详细信息,请参阅我们的论文。您应该会发现此模式可最大限度地提高性能,同时最大限度地减少存储激活所需的内存。要启用选择性激活重新计算,只需使用--recompute-activations

对于内存非常有限的情况,full重新计算仅保存变压器层、变压器层组或变压器层块的输入,并重新计算其他所有内容。要启用完整的激活重新计算,请使用--recompute-granularity full。使用激活重新计算时full,有两种方法:uniformblock,使用--recompute-method参数选择。

  • uniform方法将 Transformer 层均匀地划分为层组(每组大小为--recompute-num-layers),并将每组的输入激活存储在内存中。基线组大小为 1,在这种情况下,每个 Transformer 层的输入激活都会被存储。当 GPU 内存不足时,增加每组的层数可以减少内存使用量,从而可以训练更大的模型。例如,当--recompute-num-layers设置为 4 时,仅存储每组 4 个 Transformer 层的输入激活。

  • block方法重新计算每个流水线阶段特定数量(由 给出--recompute-num-layers)的各个 Transformer 层的输入激活,并将剩余层的输入激活存储在流水线阶段中。减少--recompute-num-layers会导致将输入激活存储到更多的 Transformer 层,从而减少反向传播中所需的激活重新计算,从而提高训练性能并增加内存使用量。例如,当我们指定每个流水线阶段 8 层中的 5 层进行重新计算时,在反向传播步骤中仅重新计算前 5 个 Transformer 层的输入激活,而存储最后 3 层的输入激活。--recompute-num-layers可以逐步增加,直到所需的内存存储空间量刚好小到足以容纳可用内存,从而最大限度地利用内存并最大化性能。

分布式优化器

用法:--use-distributed-optimizer。兼容所有模型和数据类型。

分布式优化器是一种内存节省技术,通过该技术,优化器状态均匀分布在数据并行等级之间(与在数据并行等级之间复制优化器状态的传统方法相反)。如ZeRO:面向训练万亿参数模型的内存优化中所述,我们的实现会分布所有与模型状态不重叠的优化器状态。例如,当使用 fp16 模型参数时,分布式优化器会维护自己独立的 fp32 主参数和梯度副本,这些副本分布在 DP 等级之间。但是,当使用 bf16 模型参数时,分布式优化器的 fp32 主梯度与模型的 fp32 梯度相同,因此在这种情况下梯度不是分布式的(尽管 fp32 主参数仍然是分布式的,因为它们与 bf16 模型参数是分开的)。

理论上的内存节省量取决于模型的 param dtype 和 grad dtype 的组合。在我们的实现中,每个参数的理论字节数为(其中“d”是数据并行大小):

非分布式优化分布式优化
fp16 参数、fp16 梯度204+16/天
bf16 参数,fp32 梯度186+12/天
fp32 参数、fp32 梯度168+8/天

与常规数据并行一样,可以使用标志来促进梯度降低(在本例中为减少散射)与后向传递的重叠--overlap-grad-reduce。此外,可以使用 来将参数 all-gather 与前向传递重叠--overlap-param-gather

Flash注意力

使用方法:--use-flash-attn.支持最多128个注意力头尺寸。

FlashAttention是一种快速且内存高效的算法,用于计算精确注意力。它加快了模型训练速度并减少了内存需求。

要安装 FlashAttention:

pip install flash-attn

GPT-3 示例

在 中,examples/pretrain_gpt3_175B.sh我们提供了一个示例,说明如何配置 Megatron在 1024 个 GPU 上训练具有 1750 亿个参数的GPT-3 。该脚本专为带有pyxis插件的slurm设计,但可以轻松应用于任何其他调度程序。它使用 8 路张量并行和 16 路管道并行。使用选项和,训练将从全局批处理大小 16 开始,并以增量步长 16 在 5,859,375 个样本上将全局批处理大小线性增加到 1536。训练数据集可以是单个集合,也可以是与一组权重组合的多个数据集。global-batch-size 1536rampup-batch-size 16 16 5859375

在 1024 个 A100 GPU 上,全局批次大小为 1536,每次迭代大约需要 32 秒,每个 GPU 的计算能力为 138 teraFLOP,占理论峰值 FLOP 的 44%。

Retro 和 InstructRetro

Retro (Borgeaud 等人,2022)是一种自回归解码器专用语言模型 (LM),通过检索增强进行预训练。Retro 具有实用的可扩展性,可通过检索数万亿个 token 来支持从头开始进行大规模预训练。与将事实知识隐式存储在网络参数中相比,使用检索进行预训练提供了一种更有效的事实知识存储机制,从而大大减少了模型参数,同时实现了比标准 GPT 更低的困惑度。Retro 还提供了灵活性,可以通过更新检索数据库来更新存储在 LM 中的知识(Wang 等人,2023a), 而无需再次训练 LM。

InstructRetro (Wang 等人,2023b)进一步将 Retro 的大小扩大到 48B,具有最大的经过检索预训练的 LLM(截至 2023 年 12 月)。获得的基础模型 Retro 48B 在困惑度方面大大优于 GPT 对应模型。通过对 Retro 进行指令调整,InstructRetro 在零样本设置中的下游任务上表现出比指令调整后的 GPT 显着改进。具体来说,InstructRetro 在 8 个短篇 QA 任务中的平均改进比其 GPT 对应模型高出 7%,在 4 个具有挑战性的长篇 QA 任务中的平均改进比 GPT 高出 10%。我们还发现,可以从 InstructRetro 架构中消融编码器并直接使用 InstructRetro 解码器主干作为 GPT,同时获得可比的结果。

在此 repo 中,我们提供了实现 Retro 和 InstructRetro 的端到端复现指南,涵盖

  • 检索数据库建设,支持数十亿甚至数万亿个token的大规模检索数据库。
  • 带检索预训练,支持从头开始预训练和从预训练的 GPT 模型进行预训练(Retro-fitting)。
  • 指令调优,我们提供了一个开源指令调优数据集和 Retro 上的指令调优的训练方案。
  • 下游任务评估,我们为零样本问答任务提供文本生成和评估脚本。

请参阅tools/retro/README.md了解详细概述。

基于 Mamba 的语言模型

请参阅examples/mamba了解详情。

评估与任务

我们提供了几个命令行参数(详见下面列出的脚本),用于处理各种零样本和微调下游任务。但是,您也可以根据需要从其他语料库上的预训练检查点微调您的模型。为此,只需添加标志--finetune并调整原始训练脚本中的输入文件和训练参数。迭代计数将重置为零,优化器和内部状态将重新初始化。如果微调因任何原因中断,请务必--finetune在继续之前删除标志,否则训练将从头开始。

由于评估所需的内存远少于训练所需的内存,因此合并并行训练的模型以在下游任务中在更少的 GPU 上使用可能是有利的。以下脚本实现了这一点。此示例读入具有 4 路张量和 4 路管道模型并行性的 GPT 模型,并写出具有 2 路张量和 2 路管道模型并行性的模型。

python 工具/checkpoint/convert.py \
        --模型类型 GPT \
        --load-dir 检查点/gpt3_tp4_pp4 \
        --save-dir 检查点/gpt3_tp2_pp2 \
        --目标张量并行大小 2 \
        --目标管道并行大小 2

下面介绍了 GPT 和 BERT 模型的几个下游任务。它们可以在分布式和模型并行模式下运行,只需在训练脚本中使用相同的更改即可。

GPT 文本生成

我们在 中包含了一个简单的 REST 服务器,用于文本生成tools/run_text_generation_server.py。您可以像启动预训练作业一样运行它,指定适当的预训练检查点。还有一些可选参数:temperaturetop-ktop-p--help有关更多信息,请参阅或源文件。有关如何运行服务器的示例,请参阅examples/run_text_generation_server_345M.sh 。

一旦服务器运行,您就可以使用tools/text_generation_cli.py它来查询它,它接受一个参数,即服务器正在运行的主机。

工具/text_generation_cli.py 本地主机:5000

您也可以使用 CURL 或任何其他工具直接查询服务器:

curl 'http://localhost:5000/api' -X 'PUT' -H 'Content-Type: application/json; charset=UTF-8' -d '{"prompts":["Hello world"], "tokens_to_generate":1}'

查看megatron/inference/text_generation_server.py了解更多 API 选项。

通过自我生成来解毒GPT

我们在其中加入了一个例子,examples/detxoify_lm/通过利用语言模型的生成能力来消除语言模型的毒性。

请参阅examples/detxoify_lm/README.md获取有关如何执行领域自适应训练和使用自生成语料库解毒 LM 的分步教程。

GPT 评估

我们包含了针对 WikiText 困惑度评估和 LAMBADA Cloze 准确度进行 GPT 评估的示例脚本。

WikiText 困惑度评估

为了与之前的研究进行比较,我们在词级WikiText-103 测试数据集上评估困惑度,并在使用我们的子词标记器时根据标记的变化适当地计算困惑度。

我们使用以下命令在 345M 参数模型上运行 WikiText-103 评估。

任务=“WIKITEXT103”

VALID_DATA=<wikitext 路径>.txt
VOCAB_FILE=gpt2-vocab.json
MERGE_FILE=gpt2-merges.txt
CHECKPOINT_PATH=检查点/gpt2_345m

COMMON_TASK_ARGS="--层数 24 \
                  --隐藏大小 1024 \
                  --注意头数量 16 \
                  --序列长度 1024 \
                  --最大位置嵌入 1024 \
                  --fp16 \
                  --词汇文件$VOCAB_FILE”

python 任务/main.py \
       --任务$任务\
       $COMMON_TASK_ARGS \
       --有效数据 $VALID_DATA \
       --tokenizer 类型 GPT2BPETokenizer \
       --合并文件$MERGE_FILE \
       --加载$CHECKPOINT_PATH\
       --微批次大小 8 \
       --对数间隔 10 \
       --无负载优化 \
       --无负载 RN

LAMBADA 完形填空准确率

为了计算 LAMBADA 完形填空准确度(根据前面的标记预测最后一个标记的准确度),我们利用了LAMBADA 数据集的去标记化、处理过的版本。

我们使用以下命令在 345M 参数模型上运行 LAMBADA 评估。请注意,--strict-lambada应使用标志来要求全字匹配。确保这lambada是文件路径的一部分。

任务=“兰巴达”

VALID_DATA=<lambada 路径>.json
VOCAB_FILE=gpt2-vocab.json
MERGE_FILE=gpt2-merges.txt
CHECKPOINT_PATH=检查点/gpt2_345mCOMMON_TASK_ARGS=<与上面的WikiText 困惑度评估
相同>

python 任务/main.py \
       --任务$任务\
       $COMMON_TASK_ARGS \
       --有效数据 $VALID_DATA \
       --tokenizer 类型 GPT2BPETokenizer \
       --strict-lambada \
       --合并文件$MERGE_FILE \
       --加载$CHECKPOINT_PATH\
       --微批次大小 8 \
       --对数间隔 10 \
       --无负载优化 \
       --无负载 RN

源文件中描述了进一步的命令行参数main.py

BERT 任务评估

RACE 评估

以下脚本对 BERT 模型进行微调,以便在RACE 数据集上进行评估。TRAIN_DATAVALID_DATA目录包含 RACE 数据集作为单独的.txt文件。请注意,对于 RACE,批处理大小是需要评估的 RACE 查询的数量。由于每个 RACE 查询都有四个样本,因此通过模型的有效批处理大小将是命令行上指定的批处理大小的四倍。

TRAIN_DATA="数据/比赛/训练/中间"
VALID_DATA="数据/RACE/dev/中间\
            数据/RACE/dev/high”
VOCAB_FILE=bert-vocab.txt
PRETRAINED_CHECKPOINT=检查点/bert_345m
CHECKPOINT_PATH=检查点/bert_345m_race
COMMON_TASK_ARGS="--层数 24 \
                  --隐藏大小 1024 \
                  --注意头数量 16 \
                  --序列长度 512 \
                  --最大位置嵌入 512 \
                  --fp16 \
                  --词汇文件$VOCAB_FILE”

COMMON_TASK_ARGS_EXT="--训练数据$TRAIN_DATA \
                      --有效数据 $VALID_DATA \
                      --预训练检查点$PRETRAINED_CHECKPOINT \
                      --保存间隔 10000 \
                      --保存 $CHECKPOINT_PATH \
                      --对数间隔 100 \
                      --评估间隔 1000 \
                      --eval-iters 10 \
                      --重量衰减 1.0e-1”

python 任务/main.py \
       --任务竞赛\
       $COMMON_TASK_ARGS \
       $COMMON_TASK_ARGS_EXT \
       --tokenizer 类型 BertWordPieceLowerCase \
       --epochs 3 \
       --微批次大小 4 \
       --lr 1.0e-5 \
       --lr-warmup-fraction 0.06

MNLI 评估

以下脚本使用MultiNLI 句对语料库对 BERT 模型进行微调以进行评估。由于匹配任务非常相似,因此可以快速调整脚本以适用于Quora 问题对(QQP) 数据集。

TRAIN_DATA="数据/glue_data/MNLI/train.tsv"
VALID_DATA="数据/glue_data/MNLI/dev_matched.tsv \
            数据/glue_data/MNLI/dev_mismatched.tsv”
PRETRAINED_CHECKPOINT=检查点/bert_345m
VOCAB_FILE=bert-vocab.txt
CHECKPOINT_PATH=检查点/bert_345m_mnliCOMMON_TASK_ARGS=<与上面的RACE 评估
中的相同>COMMON_TASK_ARGS_EXT=<与上面的RACE 评估
中的相同>

python 任务/main.py \
       --任务 MNLI \
       $COMMON_TASK_ARGS \
       $COMMON_TASK_ARGS_EXT \
       --tokenizer 类型 BertWordPieceLowerCase \
       --epochs 5 \
       --微批次大小 8 \
       --lr 5.0e-5 \
       --lr-预热分数 0.065

Llama-2 推理和微调

Llama-2模型系列是一组开源的预训练和微调(用于聊天)模型,这些模型在一系列基准测试中都取得了优异的成绩。在发布时,Llama-2 模型在开源模型中取得了最佳成绩,并且与闭源 GPT-3.5 模型相媲美(请参阅https://arxiv/pdf/2307.09288.pdf)。

Llama-2 检查点可以加载到 Megatron 中进行推理和微调。请参阅此处的文档。

模型优化与部署

Megatron-Core(MCore)GPTModel系列通过TensorRT-LLM支持高级量化算法和高性能推理。

量化和 TensorRT-LLM 部署

请参阅Megatron 模型优化和部署以llama2获取nemotron3示例。

数据集

我们没有托管任何用于 GPT 或 BERT 训练的数据集,但是,我们详细说明了它们的收集,以便可以重现我们的结果。

收集维基百科训练数据

我们建议遵循 Google 研究指定的维基百科数据提取流程:“建议的预处理是下载最新的转储,使用WikiExtractor.py提取文本,然后应用任何必要的清理将其转换为纯文本。”

我们建议--json在使用 WikiExtractor 时使用参数,它将把 Wikipedia 数据转储为松散的 json 格式(每行一个 json 对象),使其在文件系统上更易于管理,并且我们的代码库也可以轻松使用。我们建议使用 nltk 标点符号标准化进一步预处理此 json 数据集。对于 BERT 训练,使用如上所述的标志--split-sentences在生成的索引中包含句子分隔符。如果您想使用 Wikipedia 数据进行 GPT 训练,您仍应使用 nltk/spacy/ftfy 清理它,但不要使用该标志。preprocess_data.py--split-sentences

收集 GPT Webtext 数据

我们利用jcpeterson和eukaryote31 的作品中公开提供的OpenWebText库来下载 URL。然后,我们根据openwebtext目录中描述的过程过滤、清理和删除所有下载内容的重复数据。对于截至 2018 年 10 月的内容所对应的 reddit URL,我们得出了大约 37GB 的内容。

可重复性

Megatron 训练可以按位重现;要启用此模式,请使用--deterministic-mode。这意味着在相同的硬件和软件环境中运行两次相同的训练配置应该会产生相同的模型检查点、损失和准确度指标值(迭代时间指标可能有所不同)。

目前已知的 Megatron 优化有三种,它们会破坏可重复性,但仍然会产生几乎相同的训练运行:

  1. 在all -reduce 期间使用的特定 NCCL 算法(由环境变量指定NCCL_ALGO)很重要。我们测试了以下内容:、、、、^NVLS。代码允许使用,这允许 NCCL 选择非 NVLS 算法;它的选择似乎是稳定的。TreeRingCollnetDirectCollnetChain^NVLS
  2. 闪光注意是不确定的;请勿使用--use-flash-attn
  3. 如果使用 Transformer Engine,您还必须设置环境变量NVTE_ALLOW_NONDETERMINISTIC_ALGO=0

此外,determinisim 仅在 NGC PyTorch 容器 23.12 及以上版本中得到验证。如果您在其他情况下观察到 Megatron 训练中的不确定性,请提出问题。

使用 Megatron 的项目

以下是我们直接使用Megatron的一些项目:

  • 使用 Megatron 进行 BERT 和 GPT 研究
  • BioMegatron:更大的生物医学领域语言模型
  • 用于开放域问答的神经检索器的端到端训练
  • 大规模多参与者生成对话模型
  • 本地知识驱动的对话代理
  • MEGATRON-CNTRL:使用大规模语言模型通过外部知识生成可控故事
  • RACE 阅读理解数据集排行榜
  • 利用合成数据训练问答模型
  • 使用少样本教学提示预训练语言模型检测社会偏见
  • 探索领域自适应训练的极限以解决大规模语言模型问题
  • 使用 DeepSpeed 和 Megatron 训练大规模生成语言模型 Megatron-Turing NLG 530B
  • 用于知识性对话生成的多阶段提示
  • 评估生成参数有效学习
  • 探索领域自适应训练的极限以解决大规模语言模型问题
  • 我们是否应该使用检索来预训练自回归语言模型?一项全面的研究
  • InstructRetro:检索增强预训练后的指令调整
  • 基于 Mamba 的语言模型实证研究

本文标签: 主页MegatronLMGitHub