分类 一、大模型 下的文章

一 基本介绍

vLLM(Vectorized Large Language Model Serving System)是一个用于大型语言模型推理加速的工具。它的核心技术主要包括:
PagedAttention技术:这是一种内存管理技术,可以在不连续的内存空间中存储注意力机制中的键和值,从而减少显存碎片并提高显存利用率。

连续批处理:vLLM能够连续批处理接入的请求,充分利用GPU资源,提高吞吐量。

CUDA核心优化:vLLM对CUDA核心进行了优化,确保了速度与效率。

分布式推理支持:vLLM支持分布式推理,能够在多台GPU上并行运行模型,进一步提高推理速度。

一、PagedAttention算法概述
(PagedAttention)受操作系统虚拟内存和分页思想启发,将原本连续的 KV cache 存储在不连续的空间,以避免 KV cache 带来的显存浪费。

PagedAttention算法是一种针对大型语言模型推理过程的优化方案。其核心思想是将每个序列的KV cache(键值缓存)分块(blocks),每块包含固定数量的token的key和value张量。通过这种方式,算法可以在显存中更灵活地管理键和值,实现了内存的高效利用和共享。

二、内存管理与块映射

在PagedAttention算法中,KV cache被划分为多个块,这些块在内存空间中不必连续。这种设计使得算法可以像操作系统的虚拟内存分页一样,以更灵活的方式管理键和值。具体而言,算法将block视为page,将token视为bytes,将序列视为进程。序列的连续逻辑块通过block table映射到非连续物理块。这种映射方式使得物理块可以在生成新token时按需分配,从而减少了显存的浪费。

三、内存共享与性能提升

PagedAttention算法还通过内存共享的方式进一步减少了显存占用。不同序列可以通过将其逻辑块映射到同一物理块来共享块。这种共享机制使得显存占用减少了55%,同时吞吐量提升了2.2倍。这种性能提升对于在实际应用中部署大型语言模型具有重要意义。

v2-1502534b7e614e64b3a9e1a4568ee93a_b.png

DPO

定义

DPO(Direct Preference Optimization, 直接偏好优化)
通过利用奖励函数与最优策略之间的映射关系,证明这个受限的奖励最大化问题可以通过单阶段的策略训练来精确优化,本质上是在人类偏好数据上解决一个分类问题。DPO是稳定的、性能和计算成本轻量级的,无需拟合奖励模型,在微调期间从 LM 中采样,或执行显着的超参数调整。通过实验表明:DPO 进行微调超过了 RLHF 效果,并提高了摘要和单轮对话的响应质量。

1、简化:DPO(直接偏好优化)简化了RLHF流程。
2、原理:它的工作原理是创建人类偏好对的数据集,每个偏好对都包含一个提示和两种可能的完成方式——一种是首选,一种是不受欢迎。然后对LLM进行微调,以最大限度地提高生成首选完成的可能性,并最大限度地减少生成不受欢迎的完成的可能性。
3、优点:与传统的微调方法相比,DPO 绕过了建模奖励函数这一步,设计一种包含正负样本对比的损失函数,通过直接在偏好数据上优化模型来提高性能。(即不训练奖励模型,语言模型直接做偏好优化)

作者:akaihaoshuai
链接:https://zhuanlan.zhihu.com/p/686217468
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

PPO(不是很懂,copy来的)

PPO(Proximal Policy Optimization)是OpenAI在2017提出的一种强化学习算法,是基于策略优化的算法,用于训练能够最大化累积奖励的智能体。PPO算法通过在每次更新时限制新策略与旧策略之间的差异,从而更稳定地更新策略参数。这种方法有助于避免训练过程中出现的不稳定性和剧烈波动,使得算法更容易收敛并学习到更好的策略。

PPO的想法是,通过限制在每个训练阶段对策略所做的更改来提高策略的训练稳定性:我们希望避免过大的策略(参数)更新。我们从经验上知道,训练期间较小的策略更新更有可能收敛到最优解。策略更新步幅太大可能导致“坠崖”(获得糟糕的策略),并且需要很长时间甚至不可能恢复。

因此,使用PPO,我们要保守地更新策略。为此,我们需要通过计算当前策略与前一个策略之间的比率来衡量当前策略与前一个策略相比发生了多大的变化。我们将此比率限制在 [1−ϵ,1+ϵ] 的范围内,这意味着我们消除了当前策略偏离旧策略太远的动机(因此称为近端策略术语)。

RLHF(奖励模型+PPO)

预训练的基础LLM
监督微调(SFT)LLM
奖励模型(LLM,但修改为奖励模型)
PPO优化的语言模型(最终与偏好对齐的LLM)

DPO取代奖励模型+PPO

DPO通过完全移除奖励模型来简化这个过程。

预训练的基础LLM
监督微调(SFT)LLM
DPO优化的语言模型(最终与偏好对齐的LLM)

强化学习与大模型的结合在公式中是如何体现
根据OpenAI 的 [[Learning to summarize from human feedback]的论文,除了最终生成句子的得分基础外,在每生成一个词/字的时候,需要计算 RL 模型和 SFT 模型在生成当前词/字的概率差异,以此来当作生成当前词/字的当前步奖励。
v2-dd2814b6c5697d4cce81bcaa76a4bc81_r.png

一、位置编码的需求

为了理解 RoPE 的重要性,我们首先回顾一下为什么位置编码至关重要。 Transformer 模型根据其固有的设计,不会考虑输入标记的顺序。例如,像“the dog chases the pig ”和“the pig chases the dogs”这样的短语虽然含义不同,但由于它们被视为一组无序的标记,因此被视为无法区分。为了维护序列信息及其含义,需要一个表示来将位置信息集成到模型中。

二、绝对位置编码

1.定义(理解)

在句子的上下文中,假设我们有一个代表一个单词的嵌入。为了对其位置进行编码,需要使用另一个具有相同维度的向量,其中每个向量唯一地代表句子中的一个位置。例如,为句子中的第二个单词指定特定向量。所以每个句子位置都有其独特的向量。然后通过将词嵌入与其相应的位置嵌入求和来形成 Transformer 层的输入。

2. 两种方法来生成这些嵌入

(1).从数据中学习

在这里,位置向量是在训练过程中学习的,就像其他模型参数一样。我们为每个位置(例如从 1 到 512)学习一个唯一的向量。这引入了一个限制——最大序列长度受到限制。如果模型仅学习到位置 512,则它无法表示比该位置更长的序列。

(2).正弦函数:

此方法涉及使用正弦函数为每个位置构建唯一的嵌入。尽管这种构造的细节很复杂,但它本质上为序列中的每个位置提供了独特的位置嵌入。实证研究表明,从数据中学习和使用正弦函数可以在现实世界模型中提供相当的性能。

3.绝对位置编码的局限性

有限序列长度:如上所述,如果模型学习到某个点的位置向量,它本质上不能表示超出该限制的位置。
位置嵌入的独立性:每个位置嵌入都是独立于其他位置嵌入的。这意味着在模型看来,位置 1 和 2 之间的差异与位置 2 和 500 之间的差异相同。但是其实位置 1 和 2 应该比位置 500 相关性更密切,位置 500 距离明显更远。这种相对定位的缺乏可能会阻碍模型理解语言结构的细微差别的能力。

三、相对位置编码

1.定义(理解)

相对位置位置不是关注标记在句子中的绝对位置,而是关注标记对之间的距离。该方法不会直接向词向量添加位置向量。而是改变了注意力机制以纳入相对位置信息。最经典得案例就是T5(Text-to-Text Transfer Transformer)是一种利用相对位置嵌入的著名模型。 T5 引入了一种处理位置信息的微妙方式:

2. 两种方法来生成这些嵌入

位置偏移的偏差: T5 使用偏差(浮点数)来表示每个可能的位置偏移。例如,偏差 B1 可能表示任意两个相距一个位置的标记之间的相对距离,无论它们在句子中的绝对位置如何。

自注意力层中的集成:该相对位置偏差矩阵被添加到自注意力层中的查询矩阵和关键矩阵的乘积中。这确保了相同相对距离的标记始终由相同的偏差表示,无论它们在序列中的位置如何。

可扩展性:该方法的一个显着优点是其可扩展性。它可以扩展到任意长的序列,这比绝对位置嵌入有明显的优势。

3.绝对位置编码的局限性

尽管它们在理论上很有吸引力,但相对位置编码得问题很严重

计算效率低下:必须创建成对的位置编码矩阵,然后执行大量张量操作以获得每个时间步的相对位置编码。特别是对于较长的序列。这主要是由于自注意力层中的额外计算步骤,其中位置矩阵被添加到查询键矩阵中。

键值缓存使用的复杂性:由于每个附加令牌都会改变每个其他令牌的嵌入,这使得 Transformer 中键值缓存的有效使用变得复杂。使用 KV 缓存的一项要求是已经生成的单词的位置编码, 在生成新单词时不改变(绝对位置编码提供)因此相对位置编码不适合推理,因为每个标记的嵌入会随着每个新时间步的变化而变化。由于这些工程复杂性,位置编码未得到广泛采用,特别是在较大的语言模型中。

四、旋转位置编码 (RoPE)

1、定义

RoPE 代表了一种编码位置信息的新方法。传统方法中无论是绝对方法还是相对方法,都有其局限性。
绝对位置编码为每个位置分配一个唯一的向量,虽然简单但不能很好地扩展并且无法有效捕获相对位置;
相对位置编码关注标记之间的距离,增强模型对标记关系的理解,但使模型架构复杂化。

RoPE巧妙地结合了两者的优点。允许模型理解标记的绝对位置及其相对距离的方式对位置信息进行编码

这是通过旋转机制实现的,其中序列中的每个位置都由嵌入空间中的旋转表示。

旋转矩阵源自我们在高中学到的正弦和余弦的三角性质,使用二维矩阵应该足以获得旋转矩阵的理论,如下所示!

2、理解

v2-926c53072768c2e531f1c49135df6ca2_r.jpg
我们看到旋转矩阵保留了原始向量的大小(或长度),如上图中的“r”所示,唯一改变的是与x轴的角度。RoPE 引入了一个新颖的概念。它不是添加位置向量,而是对词向量应用旋转。旋转角度 (θ) 与单词在句子中的位置成正比。第一个位置的向量旋转 θ,第二个位置的向量旋转 2θ,依此类推。这种方法有几个好处:

1、向量的稳定性:在句子末尾添加标记不会影响开头单词的向量,有利于高效缓存。
2、相对位置的保留:如果两个单词在不同的上下文中保持相同的相对距离,则它们的向量将旋转相同的量。这确保了角度以及这些向量之间的点积保持恒定

一、简介

Deepspeed是微软推出的一个开源分布式工具,其集合了分布式训练、推断、压缩等高效模块。
该工具旨在提高大规模模型训练的效率和可扩展性。

它通过多种技术手段来加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。

DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。

二 、分布式训练方法

如今的大模型训练,离不开各种分布式的训练框架,一般来说,并行策略包含:数据并行、模型并行、流水线并行。

三种方式:数据并行、模型并行、3D并行

参考:https://juejin.cn/post/7254001262646738981

1、数据并行DP (Data Parallel)

数据并行是最常见的并行形式,因为它很简单。在数据并行训练中,数据集被分割成几个碎片,每个碎片被分配到一个设备上。这相当于沿批次(Batch)维度对训练过程进行并行化。每个设备将持有一个完整的模型副本,并在分配的数据集碎片上进行训练。在反向传播之后,模型的梯度将被全部减少,以便在不同设备上的模型参数能够保持同步。典型的数据并行实现:PyTorch DDP。
数据并行分为了两种模式:
Data Parallel(DP)和 Distributed Data Parallel(DDP)。
(1)Data Parallel(DP)
DP是一种单进程多线程的并行策略,只能在单机上进行训练,步骤如下:

1)单进程控制多GPU,即本质上是单进程多线程;
2)首先将模型加载到主 GPU 上,再复制到各个指定从 GPU;
3)将输入数据按照 Batch 维度进行拆分,各个 GPU 独立进行 forward 计算;
4)将结果同步给主 GPU 完成梯度计算和参数更新,将更新后的参数复制到各个 GPU。
5)由于其是单进程控制多个GPU,故会存在GPU之间负载不均衡的问题,主GPU负载较大。
Distributed Data Parallel(DDP)
DDP采用 AllReduce 架构,多进程的方式,突破锁的束缚。在单机和多机上都可以使用。
负载分散在每个 GPU 节点上,通信成本(时间)是恒定的,与 GPU 数量无关,等于V/B(参数量/带宽)。
DDP不需要通过主GPU分发全模型的参数到每个GPU上。
使用ring-all-reduce的方式进行通讯,随着 GPU 数量 N 增加,总传输量恒定。也就是理论上,随着GPU数量的增加,ring all-reduce有线性加速能力。

72746.png

2、模型并行

通常有两种类型的模型并行:张量并行和流水线并行

  • 流水线并行是在各层之间进行并行计算。
  • 张量并行是在一个操作中进行并行计算,如:矩阵-矩阵乘法。

(1)、流水线并行 PP(Pipeline Parallelism)

流水线并行的核心思想是,模型按层分割成若干块,每块都交给一个设备。
在前向传播过程中,每个设备将中间的激活传递给下一个阶段。
在后向传播过程中,每个设备将输入张量的梯度传回给前一个流水线阶段。
这允许设备同时进行计算,从而增加训练的吞吐量。

微信截图_20240123173407.png

流水线并行训练的一个明显缺点是训练设备容易出现空闲状态(因为后一个阶段需要等待前一个阶段执行完毕),导致计算资源的浪费,加速效率没有数据并行高。

典型的流水线并行实现:GPipe、PipeDream、PipeDream-2BW、PipeDream Flush(1F1B)

(2)、张量并行TP(Tensor Parallelism)

张量并行:张量并行是另一种并行化技术,它通过将大模型的输入和输出张量拆分,使得多个GPU可以同时处理同一输入张量的不同部分,进一步提高了计算效率。

(3)、优化器并行 ???

目前随着模型越来越大,单个GPU的显存目前通常无法装下那么大的模型了。那么就要想办法对占显存的地方进行优化。

通常来说,模型训练的过程中,GPU上需要进行存储的参数包括了模型本身的参数、优化器状态、激活函数的输出值、梯度以及一些零时的Buffer。各种数据的占比如下图所示:
微信截图_20240123174631.png

可以看到模型参数仅占模型训练过程中所有数据的一部分,当进行混合精度运算时,其中模型状态参数(优化器状态 + 梯度+ 模型参数)占到了一大半以上。因此,我们需要想办法去除模型训练过程中的冗余数据。

而优化器相关的并行就是一种去除冗余数据的并行方案,目前这种并行最流行的方法是 ZeRO(即零冗余优化器)。针对模型状态的存储优化(去除冗余),ZeRO使用的方法是分片,即每张卡只存 1/N 的模型状态量,这样系统内只维护一份模型状态。ZeRO有三个不同级别,对模型状态进行不同程度的分片:

ZeRO-1 : 对优化器状态分片(Optimizer States Sharding)
ZeRO-2 : 对优化器状态和梯度分片(Optimizer States & Gradients Sharding)
ZeRO-3 : 对优化器状态、梯度分片以及模型权重参数分片(Optimizer States & Gradients & Parameters Sharding)

微信截图_20240123175131.png

3、3D并行

总的来说,3D并行是由数据并行(DP)、张量并行(TP)和流水线并行(PP)组成

微信截图_20240123180734.png

参考:
https://zhuanlan.zhihu.com/p/598714869