大语言模型训练核心主要是如何将模型进行分布式切片部署后完成训练。这其中涉及到多种策略和系统。

大语言模型的训练通常涉及大规模数据和计算资源,因此需要使用分布式计算和切片部署的策略和系统。以下是将大语言模型进行分布式切片部署完成训练的主要步骤和关键策略:

数据准备:首先,需要准备大规模的文本数据集。这可能包括从互联网收集、清理和处理文本数据,以便用于模型的训练。数据集的质量和多样性对于模型的性能至关重要。

模型架构选择:选择合适的语言模型架构,如GPT(Generative Pre-trained Transformer)或其变种。根据任务和资源预算,选择适当的模型规模(模型的大小和参数数量)。

分布式计算架构:选择适当的分布式计算架构,如TensorFlow、PyTorch、Horovod等,以便将训练任务分布到多个计算节点上。这些框架提供了分布式计算的支持,使多个GPU或TPU可以协同工作。

数据并行化:将大型数据集划分为小批次,并将这些小批次分配给不同的计算节点。数据并行化可以加快训练速度,并充分利用多个计算资源。

模型并行化:对于大型模型,可以将模型的不同部分部署在不同的计算节点上,以减少内存占用并加速训练。这称为模型并行化。

数据分布策略:确定如何分发和存储训练数据,以便让不同的计算节点能够高效地访问数据。这通常涉及将数据存储在分布式文件系统或云存储中。

超参数调整:根据训练的进展和性能指标,调整学习率、批次大小、训练轮次等超参数,以优化训练过程。

监控和调试:建立监控系统,以便随时跟踪训练任务的进展和性能。使用日志记录和可视化工具来调试和分析训练任务。

扩展性和容错性:确保系统具有良好的扩展性,可以轻松地添加更多计算节点,以加速训练。同时,要考虑容错性,以应对计算节点故障。

模型评估:在训练完成后,对模型进行评估和验证,以确保其在各种任务上的性能。

部署和应用:一旦模型训练完成,可以将其部署到生产环境中,用于各种自然语言处理任务,如文本生成、翻译、问答等。

分布式切片部署大语言模型需要综合考虑数据、计算资源、模型架构和超参数等多个方面的因素。这些步骤和策略可以帮助实现高效的模型训练和性能优化。

其中代表性策略如图所示(图来源于Alpa Talk)

(图来源于Alpa Talk)

(图来源于Alpa Talk)

数据并行、模型并行、流水并行和MoE(Mixture of Experts)是用于并行化和加速深度学习训练的不同技术。以下是它们的解释:

数据并行(Data Parallelism):

数据并行是一种分布式训练策略,其中训练数据被分成多个小批次,并且每个小批次由不同的计算节点处理。

每个计算节点包含模型的副本,它们并行地训练相同的模型,但使用不同的数据批次。

这种并行化方法适用于拥有大量数据的情况,可以提高训练速度。

模型并行(Model Parallelism):

模型并行是一种分布式训练策略,适用于非常大的深度学习模型,这些模型无法容纳在单个计算设备的内存中。

在模型并行中,模型被划分为多个部分,每个部分部署在不同的计算节点上。

这些节点一起处理训练数据,然后共享模型参数并协同工作以进行训练。

模型并行允许训练非常大的模型,同时节省内存。

流水并行(Pipeline Parallelism):

流水并行是一种用于加速模型推理的技术,而不是训练。

在流水并行中,模型的不同部分被部署在不同的计算节点上,每个节点负责处理数据的不同阶段。

数据在一系列节点之间流动,每个节点依次处理数据,从而实现并行处理。

流水并行可以减少推理时间,并提高模型的吞吐量。

MoE(Mixture of Experts):

MoE是一种模型架构,用于处理多模式数据或多任务学习,它结合了多个专家模型以获得更好的性能。

每个专家模型可以处理不同的数据模式或任务,例如,文本翻译中可以有一个专家处理法语翻译,另一个处理西班牙语翻译。

MoE架构包括一个门控机制,用于动态选择哪个专家模型处理特定输入。

MoE可以提高模型的泛化能力和性能,特别是在处理复杂多模态数据时。

这些并行化技术可以根据模型的大小、任务的性质以及可用的计算资源来选择和组合,以提高深度学习训练和推理的效率和性能。

(图来源于Alpa Talk)

那么这几种代表策略历史和优劣我们可以参考Megatron-LM的介绍:

有两种用于将深度神经网络训练扩展到多个硬件加速器的核心范例:

数据并行(Valiant, 1990):在数据并行中,训练小批量数据被分割成多个工作者之间进行处理,扩展训练。

模型并行:在模型并行中,模型的内存使用和计算被分布到多个工作者之间。通过将小批量大小与可用工作者的数量成比例地增加(即弱扩展),可以观察到训练数据吞吐量近似线性扩展。然而,大批量训练引入了优化过程的复杂性,可能导致准确度降低或收敛时间延长,抵消了增加训练吞吐量的好处(Keskar等人,2017)。进一步的研究(Goyal等人,2017;You等人,2017;2019)已经开发出减轻这些问题的技术。为了抵消这些影响并降低大型神经网络的训练时间,并行工作(Chen等人,2016)将数据并行与激活检查点相结合:在反向传播中重新计算激活,而不在前向传播中存储它们,以减少内存需求。

然而,这些技术存在一个根本性的限制,即它们能够处理的问题规模受到限制:模型必须完全适应一个工作者。随着诸如BERT和GPT-2之类的语言模型不断增大并变得更加复杂,神经网络已经接近现代硬件加速器的内存容量。解决这个问题的一种方法是使用参数共享来减少模型的内存占用(Lan等人,2019),但这限制了模型的总容量。我们的方法是利用模型并行来将模型分割到多个加速器上。这不仅减轻了内存压力,还增加了并行性,而与微批次大小无关。

在模型并行中,有两种进一步的范例:逐层流水线并行和更一般的分布式张量计算。在流水线模型并行中,一组操作在一个设备上执行,然后将输出传递到流水线中的下一个设备,其中执行不同的操作组。一些方法(Harlap等人,2018;Chen等人,2018)与流水线并行一起使用参数服务器(Li等人,2014)。然而,这些方法存在一致性问题。TensorFlow的GPipe框架(Huang等人,2018)通过使用同步梯度下降来解决这个一致性问题。这种方法需要额外的逻辑来处理这些通信和计算操作的有效流水线化,并且存在会降低效率的流水线泡沫,或者会影响准确性的优化器本身的更改。

MLP和 Attention的张量并行策略,图来源于Megatron-LM

分布式张量计算是一种正交且更一般的方法,它将张量操作分割到多个设备上以加速计算或增加模型大小。FlexFlow(Jia等人,2018)是一个协调此类并行计算的深度学习框架,提供了选择最佳并行化策略的方法。最近,Mesh-TensorFlow(Shazeer等人,2018)引入了一种在TensorFlow中指定分布式张量计算的一般类别的语言。用户通过该语言指定并行维度,然后使用适当的集体原语编译生成的图。我们利用与Mesh-TensorFlow中使用的类似见解,并利用并行计算注意力头以并行化我们的变换器模型。然而,与实施模型并行的框架和编译器不同,我们仅对现有的PyTorch变换器实现进行了少量有针对性的修改。我们的方法简单,不需要创建框架和编译器。

两种模型并行(张量和流水)容易混淆不好区分优劣,我们想只有两卡场景,两者共性都是减少内存,利用更多卡加速计算。不同点,流水且两份会有气泡闲置且有激活张量通信,模型并行切两份没有气泡,但也有激活或者梯度通信需求(根据计算可能次数会更多)。所以张量并行常在机器内通过NVLink高速带宽拓扑下完成,流水作为跨机器切模型方案。

图来源于Alpa

综上可以看到目前有这么多的开源系统在朝着并行化LLM训练优化,感兴趣读者可以参考,其中思路是几种并行策略+根据拓扑和模型特点自动搜索,感兴趣的读者可以再进一步了解。我们也将在后续文章再进行解读。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐