找回密码
 立即注册

QQ登录

只需一步,快速开始

  • 欢迎访问 计算机技术论坛-电脑迷与初学者的家园!由于论坛管理严格,新注册会员可能遇到各种问题,无法解决的请发邮件 admin@jsjbbs.cn
查看: 1667|回复: 0

英伟达1小时成功训练BERT,83亿参数打造史上最大语言模型

[复制链接]
发表于 2021-4-11 16:56:54 | 显示全部楼层 |阅读模式
#111723#英伟达一举发明了2个豪举!练习出了天下上最大的言语模子——MegatronLM,包括83亿参数,比BERT大24倍,比GPT-2大5.6倍;还攻破了及时对话AI的记载,仅耗时53分钟便可练习出行业尺度BERT模子、2毫秒就能对谜底做出揣摸!
天下上最大的言语模子来了,趁便还破了个记载!
英伟达发布,现在曾经练习出了天下上最大的言语模子——MegatronLM。
这个模子有多大?83亿个参数!比谷歌的 BERT 大24倍,比 OpenAI 的 GPT-2 大5.6倍!
不但如斯,英伟达还发布攻破了及时对话 AI 的记载——耗时53分钟便可以练习出行业尺度的BERT模子、2毫秒阁下就能对谜底做出揣摸。
为了实现这一豪举,英伟达应用模子的并行性,将一个神经收集宰割成多个部份,创立了因数据太大没法包容在单个GPU的练习模子。
最主要的是,代码已开源!

GitHub名目地点:https://github.com/NVIDIA/Megatron-LM
MegatronLM,可谓NLP 界的“威震天”!
有钱率性:练习史上最大言语模子须要几多GPU?
更大的言语模子对于诸如文章实现、成绩答复和对话体系等NLP义务十分有效。近来,练习最大的神经言语模子曾经成为进步NLP利用程度的最好方式。
近来的两篇论文,BERT和GPT-2,展现了大范围言语建模的利益。这两篇论文都应用了盘算机和可用文本语料库的提高,在天然言语懂得、建模和天生方面明显超出了以后的最优程度。
练习这些模子须要数以百计exaflops级的盘算力和奇妙的内存治理,以调换增加内存占用的从新盘算。但是,对于超越10亿参数的超大型的模子,单个GPU上的内存缺乏以婚配模子以及练习所需的参数,须要应用模子并行性来将参数宰割到多个GPU上。有几种建模并行性的方式,然而它们很难应用,由于它们依附于自界说编译器,或许扩大性很差,或许须要对优化器停止变动。
在这项任务中,咱们通过对现有PyTorch transformer实现停止少许有针对性的修正,实现了一种简略而无效的模子并行方式。咱们的代码是用原生Python编写的,应用混杂精度练习,并应用NCCL库在GPU之间停止通讯。   咱们通过在512个GPU上练习一个transformer言语模子证实了这类方式的无效性,该模子存在8路模子并行性和64路数据并行性,83亿参数,使其成为有史以来范围最大的基于transformer的言语模子,其巨细为BERT的24倍,GPT-2的5.6倍。咱们曾经在GitHub存储库中宣布了实现此方式的代码。
咱们的试验是在英伟达的DGX SuperPOD长进行的。在没有模子并行性的情形下,咱们能够在单个V100 32GB GPU上练习一个12亿参数的基线模子,并在全部练习进程中坚持39 TeraFLOPS,这是DGX2-H效劳器上单个GPU实践峰值的30%。
咱们将模子参数扩大到83亿,应用512个GPU,通过8路模子并行化,在全部利用顺序中咱们实现了高达15.1 PetaFLOPS的延续机能,与单GPU比拟,扩大效力到达76%。图1表现了扩大的成果。  

图1:模子并行(蓝色):多达8路模子并行弱扩大,每个GPU大概有10亿个参数(比方2个GPU有20亿参数,4个GPU有40亿参数)。模子+数据并行(绿色):相似于模子并行的64路数据并行的设置。
多GPU并行性
练习模子的典范典范是应用 weak scaling 方式和散布式数据并行性,依据GPU的数目来扩大练习批巨细。这类方式容许模子在更大的数据集长进行练习,但有一个束缚,即全部参数必需合适一个GPU。
模子并行练习能够通过跨多个GPU分别模子来战胜这一限度。比年来呈现了几个通用模子并行框架,如GPipe和Mesh-TensorFlow。gPipe在差别的处置器上分别层组,而Mesh-TensorFlow应用层内模子并行性。咱们的方式在观点上相似于Mesh-TensorFlow,咱们存眷层内并行性并融会GEMM以增加同步。但是,咱们只对现有PyTorch transformer实现停止了一些有针对性的修正,以便应用模子并行性来练习大型transformers。咱们的方式很简略,不须要任何新的编译器或代码从新衔接来实现模子并行性,而且能够通过拔出一些简略的primitives(图2中的f和g 算子)完整实现。
咱们应用 transformer收集的构造,通过增加一些同步primitives来创立一个简略的模子并行实现。
transformer层由一个self attention block和一个2层的多层感知器(MLP)构成。咱们分辨在这两个模块中引入模子并行性。
如图2a所示,这是MLP的构造,由两个GEMM构成,旁边有一个GeLU非线性,前面有一个dropout层。咱们以列并行方法分别第一个GEMM。这使得GeLU 非线性能够自力地利用于每个分块GEMM的输出。模块中的第二个GEMM沿着行并行化,直接获得GeLU层的输出,不须要任何通讯。而后,在将输出通报到dropout层之前,跨GPU增加第二个GEMM的输出。这类方式将MLP block中的GEMM跨GPU宰割了,只要要在正向通报(g算子)中履行一个all-reduce操纵,在反向通报(f算子)中履行一个all-reduce操纵。  

图2:(a): MLP, (b):transformer的self attention block。
如图2(b)所示,在self attention block上,咱们应用multihead attention操纵中的固有并行性,以列并行方法分别与键(K),查问(Q)和值(V)相干联的 GEMM。
这使得咱们能够在GPU之间宰割每个attention head参数和任务负载,而且不须要任何即时通讯来实现self attention。
这类方式对于MLP和self-attention层都融会了两个GEMM的组,打消了旁边的同步点,并取得了更好的scaling机能。这使咱们可能在一个简略的transformer层中履行全部GEMM,只应用前向门路的2个all reduce和后向门路的2个all reduce,如图3所示。

图3:GPT-2 transformer层的模子并行性。
这类方式实现起来很简略,由于它只要要在向前和向后通报中增加一些额定的all-reduce操纵。它不须要编译器,而且与gPipe等方式倡导的那种pipeline模子并行性是正交的。
机能
为了测试咱们的实现的盘算机能,咱们斟酌了表1中四组参数的GPT-2模子。

表1:用于scaling 研讨的参数。
全部的试验都是在NVIDIA的DGX SuperPOD长进行的,咱们应用了多达32台DGX- 2h效劳器(统共512个Tesla V100 SXM3 32GB GPU)。该体系针对多节点深度进修利用顺序停止了优化,效劳器外部GPU之间的带宽为300 GB/s,效劳器之间的互连带宽为100 GB/s。
图4表现了模子和模子+数据并行性的扩大值。咱们在这两种设置中都视察到了杰出的扩大数字。比方,8路(8 GPU)模子并行的83亿参数模子实现了77%的线性扩大。模子+数据并行性请求在反向传布步调以后进一步通讯梯度,因而扩大数略有降落。但是,即便是运转在512个GPU上的最大设置(83亿参数),绝对于强盛的基准单GPU设置(12亿个参数),咱们依然能够实现74%的扩大性。

图4:模子(左)和模子+数据(右)跟着GPU的数目并行地停止weak scaling。
最后,咱们研讨了attention heads对模子并行扩大的影响。为此,咱们斟酌了83亿参数、存在8路模子并行性的参数设置,并将attention heads的数量从16个改成32个。成果如表2所示。跟着attention heads数目的增添,self attention层中的一些GEMM变小,同时softmax中的元素数目增添。这致使了稍微的scaling decrease。将来的研讨在计划大型transformer模子时应当警戒这类超参数,均衡模子机能和模子效力。

表2:attention heads 数目对scaling的影响。
GPT-2练习
为了练习GPT-2模子,咱们创立了一个从_Reddit_下载的37 GB _WebText_ dataset,它相似于原始GPT-2论文中描写的webtext数据集。数据集终究有810万个url。咱们将WebText数据集随机宰割为95:5的比例,分辨失掉练习集和验证集。咱们斟酌了4种参数范围的模子:3.45亿、7.75亿、25亿和83亿。

图5:练习子集的验证迷惑度。在对37GB数据集过拟合以后,8.3B模子提早结束了。
图5表现了验证的迷惑度(perplexity)。咱们发明。最大的83亿参数的言语模子在~6epoch以后开端overfit,一种1 epoch被界说为15200次迭代。咱们以为这能够通过应用更大范围的数据集来减缓,相似于XLNet和RoBERTa等近来论文中应用的数据集。
GPT-2评价
为了剖析大型言语模子的练习机能,咱们在wikitext⑽3数据集上盘算了perplexity,在Lambada数据集上盘算了closize作风的猜测精度。
正如预期的一样,wikitext perplexity跟着模子尺寸的增大而减小,lambada正确率跟着模子尺寸的增大而增添(表3)。

表3:wikitext perplexity(越低越好)和Lambada完形精度(越高越好)的评价成果。
论断
在这项任务中,咱们在现有的深度进修硬件、软件和模子的基本上,构建了天下上最大的基于transformer的言语模子。
在此进程中,咱们胜利地冲破了传统的单GPU练习的限度,实现了一种简略而高效的模子并行方式,只要对现有PyTorch transformer实现停止少许有针对性的修正。
咱们在512台NVIDIA V100 GPU上高效地练习了83亿参数的言语模子(分辨比BERT和GPT-2大24倍和5.6倍),存在8路模子并行性,并在全部利用顺序中实现了高达15.1万万亿次浮点运算(PetaFLOPS)。
咱们发明,与较小的transformer模子比拟,更大的transformer模子能够在雷同的时光内停止练习,而且能够明显进步机能。
但是,正如咱们在任务中所展现的,NLP依然须要适合的数据集、成绩和技巧来准确地练习这些大型言语模子,不然会呈现过拟合。
咱们将咱们的任务开源,以便社区便可以复制并扩大它们。
英伟达官方GitHub名目已开源!
英伟达在官方GitHub上对MegatronLM开源了代码,也供给了响应的教程。
名目地点:https://github.com/NVIDIA/Megatron-LM
装置
官方只支撑 Python 3.6。致意装支撑GPU的最新版本PyTorch。
另外,代码库的一部份应用tensorflow-cpu(可选)履行TFRecords的数据加载以停止BERT练习。
倡议要末应用./docker/中供给的Dockerfile,要末创立一个虚构情况(以防止损坏现有的tf装置)并装置requirements.txt。
1python-mpipinstallvirtualenv 2virtualenvbert_env 3sourcebert_env/bin/activate 4pipinstall-rrequirements.txt
用法
供给了5个预练习BERT的剧本和3个预练习GPT2的剧本。应用 --save 和 --load 保留并加载模子检讨点(checkpoint)。
另外,还供给 GPT2 剧本,用于在wiki文本和LAMBADA上天生GPT2的交互式文本天生和零样本(zero shot)评价。
BERT预练习
1bashscripts/pretrain_bert.sh
此剧本运转单个gpu BERT预练习,重要用于调试目标。优化参数设置为64路散布式练习。
要应用此剧本,请 --train-data以loose json格局放置,每行一个json。json字典的文本字段应当对应于 --text-key。
1pythonpretrain_bert.py 2--num-layers24 3--hidden-size1024 4--num-attention-heads16 5--batch-size4 6--seq-length512 7--max-preds-per-seq80 8--max-position-embeddings512 9--train-iters1000000 10--savecheckpoints/bert_345m 11--loadcheckpoints/bert_345m 12--resume-dataloader 13--train-datawikipedia 14--lazy-loader 15--tokenizer-typeBertWordPieceTokenizer 16--tokenizer-model-typebert-large-uncased 17--presplit-sentences 18--cache-dircache 19--split949,50,1 20--distributed-backendnccl 21--lr0.0001 22--lr-decay-stylelinear 23--lr-decay-iters990000 24--weight-decay1e-2 25--clip-grad1.0 26--warmup.01 27--fp16 28--fp32-embedding
GPT2 预练习
1bashscripts/pretrain_gpt2.sh
此剧本运转单gpu gpt2预练习,重要用于调试目标。优化参数设置为64路散布式练习。
它与前一个剧本格局大抵雷同,但有一些值得留神的差别:
--tokenizer-type已切换为GPT2BPETokenizer;
--lr-decay-style已切换为cosine decay等等。
别的,GPT2应用来自BERT的差别参数初始化,用于练习深度残差收集。要应用此初始化来练习BERT,请应用--deep-init。
1pythonpretrain_gpt2.py 2--num-layers24 3--hidden-size1024 4--num-attention-heads16 5--batch-size8 6--seq-length1024 7--max-position-embeddings1024 8--train-iters320000 9--savecheckpoints/gpt2_345m 10--loadcheckpoints/gpt2_345m 11--resume-dataloader 12--train-datawikipedia 13--lazy-loader 14--tokenizer-typeGPT2BPETokenizer 15--cache-dircache 16--split949,50,1 17--distributed-backendnccl 18--lr0.00015 19--lr-decay-stylecosine 20--weight-decay1e-2 21--clip-grad1.0 22--warmup.01 23--checkpoint-activations 24--fp16
更多内容阅读推荐:空调进水了怎么办
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

|计算机技术论坛 JSJBBS.CN @ 2008-2025 ( 鲁ICP备17021708号 )

技术支持 : 腾讯云计算(北京)有限责任公司

快速回复 返回顶部 返回列表