数字时代,人工智能(AI)及其相关技术正日益成为许多领域的热门话题。其中,生成式人工智能(Gen AI)和大型语言模型(LLMs)引起了广泛的兴趣和讨论。然而,尽管这些术语在科技界和专业领域中频繁出现,网络工程师对其的理解却不多。

什么是生成式人工智能和大型语言模型?本文将为大家介绍大型语言模型和生成式人工智能的基本概念、应用领域及大语言模型的运行原理,阅读本文后您将更全面地了解这些领域的前沿技术,我们一同踏上这段探索新领域的科普之旅吧!

什么是生成式人工智能和大型语言模型?

“生成式人工智能(Generative AI,一般简称为Gen AI)”是一种人工智能技术,专注于创造或生成新的内容,例如图像、文本或音乐。这些内容不是直接复制或派生自现有的示例,而是由计算机自己创造的。生成式AI的一个重要应用是生成文本,比如自动写作、诗歌创作或对话生成。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_LLMs

“大型语言模型(Large Language Models,LLMs)”是一类生成式AI,它们通过深度学习算法在大量自然语言数据上进行训练。这些模型学习人类语言的模式和结构,并能够对各种书面输入或提示生成类似人类的回应。最近的LLMs表现出了接近人类的水平,例如GPT-3.5,它能够产生几乎完美的文本回应。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_大语言模型_02

这些近乎完美的类人化回应,包括来自chatGPT和其他最近的LLMs,得益于模型架构的进步。这些模型采用高效的具有数十亿个参数的深度神经网络(DNNs)经过大规模数据集的训练得出,其中大部分参数被用于训练和推理的矩阵权重。而训练这些模型的浮点运算次数(FLOP)几乎与参数数量和训练集大小成线性关系。这一系列运算是在专门用于矩阵运算的处理器上执行的,例如图形处理单元(GPUs)、张量处理单元(TPUs)和其他专用的AI芯片等。GPU、TPU、AI加速器以及它们之间的通信互联技术的进步让庞大模型训练成为现实。

LLMs有哪些应用?

大型语言模型(LLMs)具有许多用例,几乎每个行业都可以从中受益。不同的组织可以根据自身的特定需求和领域对模型进行微调。微调是指在特定数据集上对预先存在的语言模型进行训练,使其更专业化并适应特定任务。通过微调,组织可以在利用这些训练模型预先存在能力的同时,将其调整得能够满足自己得独特需求,这让模型能够获取领域特定的知识,从而提高其生成组织用例所需输出的能力。通过微调的模型,组织可以在多个用例中使用LLMs。

例如,根据公司文档进行微调的LLMs可用于客户支持。LLMs可以通过创建代码或支持他们创建部分代码来帮助软件工程师。当与组织的专有代码库进行微调时,LLMs有可能生成类似于并符合现有代码库的软件。

LLMs的众多用例包括用于评估客户反馈的情绪分析、将技术文档翻译成其他语言、总结会议和客户电话以及生成工程和营销内容。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_AIGC_03

随着这些LLMs的规模持续呈指数级增长,对计算和互连资源的需求也显着增加。只有当模型的训练和微调以及推理有足够成本效益时,LLMs才会被广泛采用。

LLMs如何使用深度学习算法进行训练?

为了使用自然语言文本训练LLM,通常需要收集大量数据,包括网络抓取(爬取网页)、维基百科、GitHub、Stack Exchange、ArXiv等。大多数模型通常使用开放数据集进行训练。这些数据集中的大量文本首先会进行标记化,通常使用字节对编码等方法。标记化将来自互联网的原始文本转换为整数序列(标记,tokens)。一个标记(唯一整数)可以表示一个字符或一个单词,甚至可以是单词的一部分。例如,单词“unhappy”可能会被分成两个标记——一个表示子词“un”,另一个表示子词“happy”。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_AIGC_04

比如这段文本先被标记化,再被编码化

根据数据集的不同,可能会有成千上万个唯一标记,数据集本身可能映射到数千亿个标记。序列长度是模型在训练过程中预测下一个标记时要考虑的连续标记的数量。GPT-3和LLaMA(Meta的LLM)的序列长度约为2000。一些模型使用的序列长度甚至达到10万。表1比较了GPT-3和LLaMA模型的训练参数。

为了训练模型,标记被分成大小为batch_size(B)x序列长度的数组,然后将这些批次馈送给大型神经网络模型。训练通常需要几周,甚至几个月,并且需要大量的GPU集群。

模型参数

GPT-3 Large

LLaMA

词汇量大小

50,257

32,000

序列长度

2,048

2,048

最大训练模型参数

1750亿

650亿

训练数据集中的标记数

3000亿

1到1.3万亿

GPU数量

10,000 x V100 GPUs

2,048 x A100 GPUs

训练时间

一个月

21天

一旦基础模型训练完成,通常会进行监督微调(Fine-Tuning,SFT)。这是一个可以让LLMs扮演助手角色,回答人们提示问题的重要步骤。在有监督微调中,人们会创建一个精心策划的数据集(数量较少但质量很高的数据集),其中包含提示和响应的形式,然后使用这个数据集重新训练基础模型。经过训练的SFT模型会成为一个能对用户提示作出类似人类回应的助手。

以上是对LLMs的简单解释,接下来将直接讲述LLMs的模型计算过程。(敲黑板,上强度了!)

模型计算

一个具有1750亿参数的模型通常需要超过1TB的内存来存储参数和计算过程中的中间状态。它还需要存储检查点的训练状态(以防在训练迭代过程中遇到硬件错误)。一万亿个标记通常需要4TB的存储空间。像Nvidia的H100这样的高端GPU具有80GB的集成HBM内存(如果想用H100装下一个一万亿标记的模型,需要4TB➗80GB=51.2张卡)。一个GPU的内存是无法容纳模型参数和训练集的。

根据维基百科的说法,大型语言模型(LLM)通常每个参数和标记需要进行六次浮点运算(FLOP)。这相当于对GPT-3模型进行训练需要进行3.15 x 10^23次浮点运算,其中GPT-3模型的训练耗时为三周。因此,在这三周的时间内,它需要5.8 x 10^16次每秒的浮点运算能力(FLOPs)。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_大语言模型_05

一卡难求的H100长这样

然而,尽管Nvidia的最高性能H100 GPU在FP32模式下可以达到约67 TeraFLOPS(每秒万亿次),但在许多训练工作负载中,由于内存和网络瓶颈,GPU的利用率通常只能维持在30%左右。因此,为了满足训练需求,我们需要三倍数量的GPU,大约是6,000个H100 GPU。原始的LLM模型(表1)是使用较旧版本的GPU进行训练的,因此需要10,000个GPU。

由于有成千上万个GPU,模型和训练数据集需要在这些GPU之间进行分区,以实现并行运行。并行性可以在多个维度上发生。

数据并行性

数据并行性(Data Parallelism)涉及将训练数据分割到多个GPU上,并在每个GPU上训练模型的副本。典型流程包含数据分布、数据复制、梯度计算、梯度聚合、模式更新和重复等。


  1. 数据分布:训练数据被划分为小批量,并在多个GPU之间分布。每个GPU获得一个独特的小批量训练集。
  2. 模型复制:模型的副本被放置在每个GPU上(也称为工作节点)。
  3. 梯度计算:每个GPU执行一次模型训练迭代,使用其小批量数据进行前向传播以进行预测,并进行反向传播以计算梯度(这些梯度指示模型参数在下一次迭代之前应如何调整)。
  4. 梯度聚合:来自所有GPU的梯度被汇总在一起。通常通过计算梯度的平均值来完成此步骤。
  5. 模型更新:汇总的梯度被广播到所有GPU。各个GPU更新其本地模型参数并进行同步。
  6. 重复:此过程重复多次,直到模型完全训练完成。

数据并行性可以在使用大型数据集时显著加快训练速度。然而,它可能会导致大量的GPU间通信,因为每个GPU都必须与训练中涉及的其他GPU通信。这种全对全的通信(All-to-All)可能会在每次训练迭代中在网络中产生大量的流量。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_AIGC_06

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_大语言模型_07

训练大型语言模型(LLMs)时,我们使用了一些方案,例如环形全局归约(Ring All-Reduce),将梯度以环形模式从一个GPU发送到另一个GPU。在这个过程中,每个GPU将其从前一个GPU接收到的梯度与本地计算的梯度进行聚合,然后将其发送到下一个GPU。然而,这个过程非常缓慢,因为梯度聚合分布在多个GPU之间,最终结果需要在环形拓扑中传播回所有GPU。如果网络拥塞,GPU之间的流量会因等待聚合梯度而停滞。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_LLMs_08

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_LLMs_09

此外,具有数十亿参数的LLMs无法适应单个GPU。因此,仅靠数据并行性无法满足LLM模型的需求。

模型并行性

模型并行性(Model Parallelism)旨在解决模型无法适应单个GPU的情况,通过将模型参数(和计算)分布到多个GPU上。典型的流程包含模型分区、前向传播、反向传播、参数更新、重复等。

  1. 模型分区:将模型划分为若干个分区,每个分区分配给不同的GPU。由于深度神经网络通常包含一系列垂直层,因此按层次划分大型模型是合乎逻辑的,其中一个或一组层可能分配给不同的GPU。
  2. 前向传播:在前向传播过程中,每个GPU使用“整个”训练集计算其模型部分的输出。一个GPU的输出作为下一个GPU的输入传递。下一个GPU在接收到前一个GPU的更新之前无法开始处理。
  3. 反向传播:在反向传播过程中,一个GPU的梯度传递给序列中的前一个GPU。在接收到输入后,每个GPU计算其模型部分的梯度。与前向传播类似,这在GPU之间创建了顺序依赖关系。
  4. 参数更新:每个GPU在其反向传播结束时更新其模型部分的参数。需要注意的是,这些参数不需要广播到其他GPU。
  5. 重复:此过程重复多次,直到模型在所有数据上训练完成。

流水线并行性

流水线并行性(Pipeline Parallelism)将数据并行性和模型并行性相结合,其中训练数据集的每个小批量进一步分成几个微批量。在上面的模型并行性示例中,一个GPU使用第一个微批量计算输出,并将该数据传递给序列中的下一个GPU。与在反向传播中等待从该GPU获取输入不同,它开始处理训练数据集的第二个微批量,依此类推。这增加了GPU之间的通信,因为每个微批量都需要在序列中相邻的GPU之间进行前向传播和反向传播的通信。

张量并行性

张量并行性(Tensor Parallelism)是一种用于加速深度学习模型训练的技术。与模型并行和流水线并行技术不同,张量并行性在操作级别(或“张量”级别)上划分模型,而不是在层级别上划分。这种方法允许更精细的并行处理,对某些模型来说更高效。

具体来说,张量并行性的步骤如下:

  1. 模型分区:将模型划分为多个操作(或“张量”),每个操作分配给不同的GPU。这样,每个GPU只负责计算部分操作的输出。
  2. 前向传播:在前向传播过程中,每个GPU使用整个训练集计算其操作部分的输出。一个GPU的输出作为下一个GPU的输入传递。这样,模型的计算被分散到多个GPU上。
  3. 反向传播:在反向传播过程中,梯度从一个GPU传递到序列中的前一个GPU。每个GPU计算其操作部分的梯度。与前向传播类似,这也创建了GPU之间的顺序依赖关系。
  4. 参数更新:每个GPU在其反向传播结束时更新其操作部分的参数。这些参数不需要广播到其他GPU。

数据并行性、模型并行性、流水并行性、张量并行性……没搞懂不同并行技术的处理逻辑?下面这个案例或许可以给你一些启发,相信作为网工的你一定能很快理解~

假设我们有2台机器(node0和node1),每台机器上有8块GPU,GPU的编号为0~15。

我们使用这16块GPU,做MP/DP/TP/PP混合并行,如下图:

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_LLMs_10

MP:模型并行组(Model Parallism):

假设一个完整的模型需要布在8块GPU上,则如图所示,我们共布了2个model replica(2个MP)。MP组为:[[g0, g1, g4, g5, g8, g9, g12, g13], [g2, g3, g6, g7, g10, g11, g14, g15]]

TP:张量并行组(Tensor Parallism)

对于一个模型的每一层,我们将其参数纵向切开,分别置于不同的GPU上,则图中一共有8个TP组。TP组为:[[g0, g1], [g4, g5],[g8, g9], [g12, g13], [g2, g3], [g6, g7], [g10, g11], [g14, g15]]

PP:流水线并行组(Pipeline Parallism):

对于一个模型,我们将其每一层都放置于不同的GPU上,则图中一共有4个PP组。PP组为:[[g0, g4, g8, g12], [g1, g5, g9, g13], [g2, g6, g10, g14], [g3, g7, g11, g15]]

DP:数据并行组(Data Parallism):

经过上述切割,对维护有相同模型部分的GPU,我们就可以做数据并行,则图中共有8个DP组。DP组为[[g0, g2], [g1, g3], [g4, g6], [g5, g7], [g8, g10], [g9, g11], [g12, g14], [g13, g15]]

读完本文,相信你对训练大语言模型(LLMs)的三个步骤已经很熟悉:

  1. 通过网络抓取等方式进行数据集集成;
  2. 将源文本分割为标记;
  3. 通过模型参数并行处理的方式进行模型训练

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_LLMs_11

相信你也对大数据模型的多种并行类型有了初步认识:无论使用何种并行性类型,LLM 凭借其参数和数据集的庞大规模,都会通过连接这些 GPU 的结构产生大量的 GPU 间流量。结构中的任何拥塞都可能导致训练时间过长且 GPU 利用率极低。之后将继续推出AI系列科普文,为大家介绍GPU/TPU 集群设计,以了解互连以及它们如何进行 LLM 训练。

实际应用中,训练完大语言模型(LLMs)之后,需要对模型进行微调以满足不同组织(企业)的个性化需求,该如何优化LLMs模型?后续的推文将为您解答这些疑惑。

星融元作为一家网络公司,为什么会那么关注AI、LLMs这些看似与自身业务关系不大的领域,甚至开辟专栏为网络工程师科普相关知识?主要出于技术和市场竞争方面的考虑。

1.技术方面,网络在大语言模型(LLMs)的训练过程中至关重要:

LLMs训练之初便需要通过网络抓取大量的数据集成数据集,数据集中的大量参数和数据需要通过网络传输到GPU上进行并行处理,网络连接的质量直接影响了数据传输的速度和效率。LLMs的训练会涉及到多个GPU的协同工作,连接这些GPU的网络结构会产生大量的GPU间流量,如果网络拥塞,数据传输会受到影响,导致训练时间过长且GPU利用效率降低。

因此,网络的稳定性、速度和带宽都对LLMs的训练效果至关重要。网络拥塞可能导致训练效率下降,因此需要优化网络架构,确保数据传输的高效性。

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南_AIGC_12

2.市场竞争方面,AI离不开LLMs训练,市场潜力无穷:

人工智能作为人们高度关注的热点话题,在许多领域拥有巨大的市场潜力。LLMs训练完毕后,大模型与用户的交互过程中(如chatGPT爆火,全球很多用户都在使用的情况),网络质量会直接影响用户对Gen AI应用的体验。拥有先进技术和工具是企业保持竞争优势的关键,星融元顺势而为,持续关注智算市场的发展,并推出HPC、AI等场景的网络解决方案,为用户提供良好的网络环境,实现用户与自身的双赢!

参考:Large Language Models – The Hardware Connection (juniper.net)

数据并行(DP)、张量模型并行(TP)、流水线并行(PP)_tp pp dp-CSDN博客

关注vx公号“星融元Asterfusion”,获取更多技术分享和最新产品动态。