马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
威震天-LM & 威震天-焦点
用于大规模训练 Transformer 模子的 GPU 优化技能
最新消息
- [2024/1 公告] NVIDIA 已将Megatron-LM的焦点功能发布到此存储库中的Megatron-Core中。Megatron-Core 在 Megatron-LM 的 GPU 优化技能的根本上进行了扩展,并在体系级优化方面进行了更多尖端创新,具有可组合和模块化 API。探索 Megatron- Core 简介以相识更多详细信息。
目录
- 威震天概览
- 训练速度和可扩展性
- 设置
- 用法
- 训练
- 数据预处理
- BERT 预训练
- GPT 预训练
- T5 预训练
- 分布式预训练
- 激活检查点和重新盘算
- 分布式优化器
- Flash留意力
- GPT-3 示例
- Retro 和 InstructRetro
- 评估与任务
- GPT 文本天生
- GPT 评估
- WikiText 狐疑度评估
- LAMBADA 完形填空精确率
- BERT 任务评估
- Llama-2 推理和微调
- 数据集
- 收集维基百科训练数据
- 收集 GPT Webtext 数据
- 可重复性
- 使用 Megatron 的项目
威震天概览
该存储库包含两个基本组件:Megatron-LM和Megatron-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.com/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.com/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.com/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。
我们在目录中提供了几个用于预训练 BERT 和 GPT 的脚本examples,以及用于零样本和微调卑鄙任务的脚本,包罗 MNLI、RACE、WikiText103 和 LAMBADA 评估。还有一个用于 GPT 交互式文本天生的脚本。
训练
数据预处理
训练数据须要预处理。起首,将训练数据置于松散的 json 格式中,每个 json 每行包含一个文本样本。比方:
- {"src": "www.nvidia.com", "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.bin和my-bert_text_sentence.idx。--data-path稍后在 BERT 训练中指定的是完整路径和新文件名,但没有文件扩展名。
对于 T5,使用与 BERT 雷同的预处理,或许将其重定名为:
GPT 数据预处理须要进行一些小的修改,即添加合并表、文档结束标记、删除句子拆分以及更改标记器类型:
- python 工具/preprocess_data.py \
- --输入我的语料库.json \
- --输出前缀 my-gpt2 \
- --词汇文件 gpt2-词汇.json \
- --tokenizer 类型 GPT2BPETokenizer \
- --合并文件 gpt2-merges.txt \
- --append-eod
复制代码 这里的输出文件被定名为my-gpt2_text_document.bin和my-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 内存使用量,我们支持各种形式的激活检查点和重新盘算。与传统深度学习模子中的做法不同,我们不会将全部激活都存储在内存中以供反向传播使用,而是只在模子中的某些“检查点”处保存(或存储)在内存中,其他激活则在反向传播须要时即时重新盘算。请留意,这种检查点(激活检查点)与其他地方提到的模子参数和优化器状态的检查点非常不同。
我们支持两种级别的重新盘算粒度:selective和full。选择性重新盘算是默认设置,险些在全部情况下都发起使用。此模式在内存中保存占用较少内存存储空间且重新盘算成本较高的激活,并重新盘算占用更多内存存储空间但重新盘算成本相对较低的激活。有关详细信息,请参阅我们的论文。您应该会发现此模式可最大限度地提高性能,同时最大限度地淘汰存储激活所需的内存。要启用选择性激活重新盘算,只需使用--recompute-activations。
对于内存非常有限的情况,full重新盘算仅保存变压器层、变压器层组或变压器层块的输入,并重新盘算其他全部内容。要启用完整的激活重新盘算,请使用--recompute-granularity full。使用激活重新盘算时full,有两种方法:uniform和block,使用--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:
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。您可以像启动预训练作业一样运行它,指定适当的预训练检查点。还有一些可选参数:temperature、top-k和top-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_DATA和VALID_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.org/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 优化有三种,它们会破坏可重复性,但仍然会产生险些雷同的训练运行:
- 在all -reduce 期间使用的特定 NCCL 算法(由环境变量指定NCCL_ALGO)很重要。我们测试了以下内容:、、、、^NVLS。代码允许使用,这允许 NCCL 选择非 NVLS 算法;它的选择似乎是稳固的。TreeRingCollnetDirectCollnetChain^NVLS
- 闪光留意是不确定的;请勿使用--use-flash-attn。
- 如果使用 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 的语言模子实证研究
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |