当前位置: 首页 > 科技观察

大规模产业化的方法论隐藏在GPU

时间:2023-03-14 23:26:34 科技观察

介绍中,数据智能时代,计算是刚需,也是痛点。最重要的特点是一个字大。将“大”分为三个特征包括:数据的大规模计算、串行依赖、计算复杂度高,其中包括数据和算法的复杂性,数据、算法和计算能力是智能时代的三要素。前两个用户的复杂性,最终还是要靠算力来承载。这使得行业对算力的需求在空间和时间上像海啸一样迅速膨胀。GPU有办法将海啸在空间上细分成万千细流,在时间上缩短流水的路径,在结构上简化路径分支,将大型任务逐层拆解成小型任务。它承载着海量的算力需求,成为智能时代的算力基础。针对以上三个特点,GPU基于吞吐量、内存等指标,采用并行、融合、简化三种方式在算子层面进行加速。GPU加速的主要方法论同样适用于大模型的产业化。随着底层芯片、算力、数据等基础设施的完善和进步,全球人工智能产业正逐步从计算智能向感知智能和认知智能迈进,并相应形成“芯片、算力设施、AI框架&算法模型”,以及应用场景。””产业分工协作体系。2019年以来,AI大模型泛化和解决问题的能力大幅提升,“大模型+小模型”逐渐成为行业主流技术路线,带动全球AI产业发展全面加速,前不久,DataFun举办了《AI 大模型技术路线和工业化落地实践》分享会,来自NVIDIA、百度、字节跳动火山翻译、腾讯微信的六位专家分享了他们对模型训练技术和推理解决方案的看法,在多语种机器翻译应用、大规模语言模型开发及落地等诸多方面,带来了AI大规模模型技术路线和产业化落地实践的精彩分享,他们在行业落地大模型时,主要采用的方法并行化、集成化、简化化,从训练推理层面扩展到算法建模层面。1.Parallel并行法是一种以空间换时间的方法,将海啸细分为细流。具体来说,对于大批量数据的计算,每个计算步骤都需要很长时间。GPU采用并行计算,即尽可能将没有计算依赖关系的数据并行化,将大batch拆分成小batch,减少GPU在每个计算步骤的空闲等待时间,提高计算吞吐量。为了真正完成大型模型的训练,需要一个高效的软件框架,让训练在单GPU、单节点,甚至大规模集群上都有很好的计算效率。因此,英伟达开发了威震天训练框架。Megatron采用模型并行、序列并行等优化方式高效训练大型Transformer模型,可以训练出万亿级参数的模型。在算法建模层面,火山翻译和百度主要探索了MoE模型等建模方法。1.模型并行度模型并行度可以分为Pipeline并行度和Tensor并行度。流水线并行是层间并行(图中上半部分),将不同的层划分到不同的GPU上进行计算。这种通信方式只发生在层的边界,通信次数和通信数据量较小,但会引入额外的GPU空间等待时间。Tensorparallelism是层内并行(图中下半部分),将一个层的计算划分到不同的GPU上进行计算。这种方式更容易实现,对大矩阵效果更好,更好的实现GPU之间的负载均衡,但是通信次数和数据量都比较大。为了充分利用GPU资源,威震天将每个训练批次分成更小的微批次。由于不同微批之间没有数据依赖,等待时间可以相互覆盖,可以提高GPU的利用率,提高整体训练性能。Tensor将每个算子的计算并行地分给不同的GPU。对于矩阵层,有两种方式:横切和竖切。如图所示,Megatron在Transformerblock的attention和MLP部分都引入了这两种分割方式。在Tensor并行模式下,每个Transformer层的正向和反向共需要4次All-reduce通信。由于All-reduce通信量大,Tensor并行更适合单卡内部使用。结合Pipeline并行和Tensor并行,Megatron可以在32个GPU上训练1700亿参数模型,并在3072个GPU上扩展到1万亿参数规模模型。2.SequenceparallelTensorparallel实际上并没有拆分Layer-norm和Dropout,所以这两个算子是在每个GPU之间复制的。但是,这些操作本身并不需要大量的计算,反而会消耗大量的活动显存。为此,威震天提出了Sequence并行优化方法。Sequence并行的优点是不增加通信量,可以大大减少内存占用。由于Layer-norm和Dropout在sequence维度上是独立的,所以可以按照Sequence维度进行拆分。使用Sequence并行后,对于非常大规模的模型,显存占用还是很大。因此,威震天引入了激活重计算技术。Megatron的做法是找一些计算量小但占用显存大的算子,比如Attention中的Softmax和Dropout。这些运算符的激活和重新计算可以显着减少显存,并且不会增加计算开销。大的。Sequenceparallelism和selectiveactivationrecomputation的结合可以将内存使用减少到原来的1/5左右。与原来直接重新计算所有激活的方案相比,其显存只有两倍大,计算开销显着降低。随着模型规模的增大,计算开销所占的比例会逐渐降低。对于万亿级模型,重新计算的开销只占整体的2%左右。3.算法并行的MoE模型以其简洁的设计思路和强大的可扩展性受到了业界越来越多的关注。MoE模型提出了这样的设计思路,就是将大模型拆分成多个小模型。每个样本只需要激活部分专家模型进行计算,大大节省了计算资源。目前最常用的稠密大模型是BERT、T5、GPT-3,最常用的稀疏MoE模型是T5+MoE,MoE正在成为大模型构建的趋势。可以说,MoE在算法建模层面结合了并行计算的思想。大机型的通用性体现在很多方面。除了我们已经熟悉的点,比如attention机制的inductivebias较弱,模型容量大,模型数据量大等,还可以通过任务建模的方式进行优化,MoE就是一个典型的代表。对于火山翻译,MoE的基本思路是用宽度换深度,因为模型越深,计算层数越多,推理时间也越长。例如,对于4层Encoder和4层Decoder的Transformer模型,每次计算都要经过全部8次FFN计算。如果是混合专家模型,FFN可以并联,最终计算路径减半,因此推理时间也减半。在相同的推理时间下,即模型深度相近的情况下,由于MoE可以增加模型宽度,机器翻译的最终效果也有所提升。针对24种非洲语言和英法语言的多语言翻译任务,VolcanoTranslation开发了128层Transformer和24个专家层的MoE模型,取得了比传统架构更好的翻译效果。不过,SparseMoE中的“专家模型”可能名不副实,因为对于一个句子,比如每个Token传递的专家可能是不同的。因此,火山翻译开发了HardGateMoE,让通过句子的专家由语言决定,使得模型结构更简单,实验结果也表明其翻译效果更好。在算法建模的并行探索中,百度在知识增强跨模态生成大模型ERNIE-ViLG2.0中也采用了混合专家扩散模型框架。扩散模型为什么要用专家模型?其实是因为在生成的不同阶段,对模型建模的要求是不同的。例如,在初始阶段,模型侧重于学习从高斯噪声中生成语义图像,在最后阶段,模型侧重于从噪声图像中恢复图像细节。事实上,在ERNIE3.0的早期版本中,集成了自编码和自回归,可以针对一般语义表示中的特定生成任务和理解任务结合两种建模方式。整合autoencoder和autoregressive的基本思想其实和expertmodel的建模方法论很相似。具体来说,在一般表示的基础上,按照理解任务适合自编码网络结构,生成任务适合自回归网络结构进行建模。此外,这种类型的建模通常有助于学习更好的一般表示。此外,在ERNIE-UniX2模型中,百度通过整合对比学习、语言模型等预训练范式,统一了多语言、多模态的理解和生成任务。训练好MoE模型后,推理部署也是一个非常重视效率的环节。在选择超大规模模型推理部署方案时,首先要根据模型的参数规模、模型结构、GPU显存、推理框架等因素,决定采用单卡推理还是多卡推理。模型准确性和推理性能之间的权衡。如果显存不足,会考虑模型压缩或者多卡推理的方案。Doka推理包括Tensor并行、Pipeline并行、Expert并行等多种模式。对MoE非常大的模型使用不同的模式会带来不同的挑战。其中,MoE模型的Tensor并行度与dense模型类似。如果选择Expert并行模式,每个MoELayer的Experts会被分到不同的GPU上,这可能会造成负载均衡问题,导致大量GPU处于空闲状态,最终导致整体吞吐量偏低。这是MoE多卡推理中需要关注的重点。对于Tensor并行和Pipeline并行,除了通过fine-tuning减少卡间通信外,更直接的方法是增加卡间带宽。当MoE模型使用Expert并行导致负载均衡出现问题时,可以通过Profiling进行分析和优化。多卡推理方案增加了通信开销,对模型推理的延迟有一定影响。2.Fusion融合是一种解决并行计算中遇到的自然矛盾的方法。并行计算和串行计算是两种基本的计算模式。在应用并行计算时,最典型的难点是大量的串行依赖,以及由此产生的中间值内存使用问题,而GPU内存通常成为大型模型训练和推理的硬件性能瓶颈之一。对于海量计算的串行依赖,最重要的方法是缩短trickle的路径,即减少中间停留过程。具体来说,operatorfusion用于合并序列相互依赖的operators,以减少显存占用。算子融合不仅可以在计算层面实现,还可以在算子设计层面实现。1.如果1F1BPipeline并行时正反进程分离,会出现内存占用过大的问题。因此,威震天提出了一种新的流水线并行模式1F1B。每个GPU交替执行每个microbatch的正向和反向过程,以尽快释放其占用的显存,从而减少内存占用。1F1B不能减少泡泡时间。为了进一步减少泡泡时间,威震天提出了交错的1F1B模式。也就是说,每个GPU原本负责连续4层的计算,现在负责连续2层的计算,只有原来的一半,所以泡泡时间也变成了原来的一半.2.KernelFusion在进行GPU计算时,可以将每个计算过程封装到一个GPUKernel中,在GPU上顺序执行。传统的算子库为了通用性,会将算子设计得非常基础,所以数量也非常多。缺点是占用大量显存,因为它需要存储大量的中间隐藏表示。另外,对带宽的要求也比较高。高,最终可能导致延迟或性能损失。VolcanoTranslation在CuBLAS乘法接口的基础上集成了其他非矩阵乘法算子,包括Softmax、LayerNorm等。VolcanoTranslation除了对比通用算子的集成度,还对一些特定算子如BeamSearch等不能很好利用GPU并行性的计算依赖进行了优化,从而实现加速。在四种主流Transformer模型上,LightSeq算子融合在PyTorch的基础上实现了高达8倍的加速。3.SimplificationSimplification是一种比较简单直观的加速方法,在细微处精简流水线分支。具体来说,对于高复杂度的计算,在保证性能的前提下简化算子复杂度,最终降低计算量。超大规模模型的单卡推理通常涉及模型压缩。常见的模型压缩方案是量化、蒸馏和修剪。量化是业界最常用的模型压缩方案之一。量化计算虽然采用了较低的精度,但可以保持模型的参数量级,在某些情况下可能更好地保证模型的整体精度。1.量化目前有两种量化方式,一种是post-trainingquantization,一种是quantization-awaretraining。后者通常比前者更好地保持模型的准确性。量化完成后,可以使用TensorRT或FasterTransformer等推理加速框架进一步加速超大模型的推理。LightSeq在训练过程的量化上使用了真正的int8量化,即在矩阵乘法之前进行量化操作,在矩阵乘法之后进行逆量化操作。与以往的伪量化不同,在矩阵乘法之前进行量化和反量化操作,让模型适应量化带来的损失和波动。后者在实际计算中不会带来加速,但可能会增加延迟或增加显存占用。realint8量化在实际应用中也带来了很好的加速效果。2.蒸馏第二种压缩方法是蒸馏。Distillation可以针对不同的应用场景,使用不同的策略来压缩超大模型。在某些情况下,蒸馏可以使超大型模型具有更好的泛化能力。3.剪枝最后一种模型压缩方案是剪枝。剪枝可以分为全模型剪枝和部分层剪枝。对于非常大的模型,了解模型的关键层非常重要。需要避免对这些对精度影响最大的部分进行剪枝。这也适用于稀疏的MoE模型。4.大型模型产业化大型模型的研究和实施已成为一种趋势。预计到2022年,大规模语言模型和Transformers的论文将超过10000篇,比Transformers5年前首次提出时增长7倍。此外,大模型也有广泛的应用,例如图像生成、推荐系统、机器翻译,甚至生命科学、代码生成等。OpenAI也在2020年发表了两篇论文,表明模型的性能基本上与三个主要因素挂钩,即计算能力、数据集大小和模型参数。这三个指标可以很好的预测模型性能。RichardSutton曾表示,在过去70年的人工智能发展中,一个反复出现的趋势是,能够高效利用计算资源的通用方法永远是最后的赢家。根据RichardSutton的“Winner'sLaw”,深度学习在过去十年中普遍获胜。但在今天,大模型训练的挑战不言而喻。以GPT-3为例,如果在训练时使用原始混合精度,则需要保存训练时的参数和梯度以及FP32的主要参数。如果使用Adam优化器,还需要保存动量两个优化器的信息,那么一共需要2.8TB的显存,远远超过单卡的显存容量,需要35多块A100才能承载。NVIDIA2021年的论文《EfficientLarge-ScaleLanguageModelTrainingonGPUClustersUsingMegatron-LM》得到了一个经验公式,表明单次迭代1750亿个参数的GPT-3模型需要4.5亿次FLOPs的计算。力量。如果整个训练周期包含95000次迭代,则需要430ZettaFLOP。也就是说,一台A100需要训练16000天,这是没有考虑计算效率的结论。也就是说,仅仅依靠这三个指标的积累,在大规模工业化时代是一种资源的极大浪费。DeepMind在2022年发表的ChinChilla论文中表示,实际上GPT-3、OPT、PaLM等大模型基本都是欠拟合模型。如果基于相同的计算资源,减少模型参数量,训练更多的步数,最终的模型效果会更好。这也是微信在WeLM大规模语言模型中遵循的设计思路。业内所有公司基本上都开始从规模上放松关注,转而关注大型模型的效率。例如,从整体执行效率来看,威震天优化的几乎所有模型的吞吐量都有30%的提升,并且随着模型规模的增加,可以实现更高的GPU利用率。在1750亿参数的GPT-3模型上,GPU利用率可达52.8%。在超过5300亿参数规模的模型上,利用率可以达到57%。也就是说,根据理查德萨顿的“赢家法则”,效率将成为大规模工业化的主基调。