verl框架:2. 对比OpenRLHF+colocate思路解析
SPMD->MPMD SPMD设计范式:单程序多数据,所有进程/线程执行同一个程序的拷贝,通过环境变量差异自主确定行为模式,无需中心调度节点。主流并行框架(DDP/DeepSpeed/Megatron)均基于SPMD范式。 优点:SPMD由于没有controller,完全由worker自驱,在运行时更为高效; 缺点:由于各个worker上需要运行相同程序,灵活性不如single-controller模式;需要考虑各个rank之间的通信,增加编程复杂度。 经典代码如下: 123456import torchimport osprint(os.environ['RANK'], os.environ['WORLD_SIZE'], os.environ['MASTER_ADDR'],...
verl框架:1. Ray 集群介绍 + verl 中基于 Ray 的执行流程解析
现代计算机体系结构 现代计算机体系结构如下: 多核:一台计算机上有多颗CPU,每个 CPU 有多个计算核心。CPU内部有缓存结构,外部有主存。 集群:多台计算机通过高速网络互联,每台计算机上配有至少一块高速网卡。使得不同节点之间互相访问数据就像在单个节点一样。 异构计算:CPU 和主存通常被称为主机(Host),各类专用的加速器被称为设备(Device)。当前基于 GPU 的异构计算是主流,GPU 有区别于 CPU 的芯片微架构和编译软件栈。 软件层面:GPU 提供了 CUDA编程接口; 硬件层面:GPU 有很多个专用计算核心,和 GPU...
大模型推理框架vLLM:paper + code 解析
论文解读:Efficient Memory Management for Large Language Model Serving with PagedAttention 论文原文 Abstract 为了提供LLM的高吞吐量服务,每次需要批量处理足够多的请求。然而现有系统面临KV缓存内存不足的挑战:每个请求的KV缓存内存占用巨大,且动态增减。当内存管理效率低下时,碎片化和冗余复制会造成显著的内存浪费,从而限制批处理规模。为解决这一问题,我们提出PagedAttention,这是一种受经典操作系统虚拟内存与分页技术启发的注意力算法。基于此,我们构建了vLLM这一LLM服务系统,其实现了:(1) KV缓存内存接近零浪费;(2) 支持请求内及跨请求的KV缓存灵活共享,进一步降低内存占用。评估表明,在相同延迟水平下,vLLM将主流LLM的吞吐量较FasterTransformer、Orca等最先进系统提升了2-4倍。当处理更长序列、更大模型及更复杂解码算法时,性能提升尤为显著。 Introduction 当前LLM...
深入 Parquet:从 Dremel 论文到列式存储的工程权衡
parquet(列式存储)在 OLAP 场景广泛使用,空闲时间阅读了 paper 和相关源码。 paper 原文阅读:Dremel Dremel是一个可扩展的交互式查询系统,专门用于分析 read-only 的嵌套数据。它结合了多级执行树和列式数据布局,能够在几秒钟内对万亿行的表运行聚合查询。Dremel 可以扩展到数千个 CPU 和 PB 级数据,并且在 Google 内部有数千名用户。Dremel 并不是用来替代 MapReduce的,而是经常与 MR 结合使用,用于分析 MR 管道的输出或快速原型化更大的计算。 数据模型 Dremel 的数据模型是基于强类型的嵌套记录,抽象语法: \[ t = dom | <A1:t[*|?], ..., An:t[*|?]> \] t 是原子类型或一个记录类型,原子类型包括整型、浮点数、字符串等;Ai 为记录的第 i 个字段,其后的 [*|?] 表示其重复类型。 * 表示该字段为 Repeated; ?表示该字段为 Optional; 无标记则表示该字段为...
Transformer 系列:3. Encoder 和 Decoder 的架构
背景 此前的模型(如ByteNet, ConvS2S)使用 CNN 并行计算,但处理长距离依赖关系的能力随着位置间距的增加而减弱(线性或对数增长)。 Transformer 利用自注意力机制,使得关联任意两个位置所需的操作次数降至常数级,极大改善了处理长距离依赖的能力;引入 Multi-Head Attention 抵消因注意力位置平均化可能导致的"有效分辨率"下降问题。 Transformer 是第一个只依赖 Self-Attnetion 来实现 Encoder-Decoder 架构的模型。 模型架构 在 GPT 之前,大部分神经序列转换模型都采用 Encoder-Decoder 结构,Transformer 模型也不例外。Encoder 将输入的符号序列\((x_1,...,x_n)\)映射为一个连续序列\(z=(z_1,...,z_n)\);得到编码后的序列\(z\),Decoder 逐个元素生成输出序列\((y_1,...,y_m)\)。Decoder 每一步输出是 auto-regressive 的,将当前 step 的输出和输入拼接,作为下一个 step 的输入。 ...
幂等性设计
幂等性定义 幂等性设计用数学的语言来表达是:f(x) = f(f(x))。在计算机中幂等性指一个操作多次执行的结果与其执行一次的结果相同。 注意:这里强调的是结果,而非响应。 Wiki 上幂等性的定义:https://zh.wikipedia.org/zh-cn/%E5%86%AA%E7%AD%89 在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和1。 设计具有幂等性的分布式系统可以有效避免数据不一致和重复处理的问题。非幂等性产生的原因如下: 前端设计不合理,用户主动多次请求; 网络库超时重试机制; 弱一致性分布式系统中,不合理的查询判断。 支付是一个需要强幂等性的典型场景:用户点击支付按钮后,可能因为网页响应慢而重复点击,或者网络问题导致客户端重试。需要避免重复支付。 幂等性 &...
从 TCP 粘包到分帧
TCP/ IP 协议簇中: IP 协议解决了数据包(Packet)的路由和传输,上层的 TCP 协议无需关注路由和寻址; 传输层的 TCP 协议解决了数据段(Segment)的可靠性和顺序问题,上层无需关心数据能否传输到目标进程,只要写入 TCP 协议的缓冲区的数据,协议栈几乎都能保证数据的送达。 当应用层协议使用 TCP 协议传输数据时,TCP 协议可能会将应用层发送的数据分成多个包依次发送;当应用层从 TCP 缓冲区中读取数据时发现粘连的数据包时,需要对收到的数据进行拆分。 TCP 协议之所以存在所谓的"粘包"问题,本质上源于对 TCP 协议特性的误解和不当应用层协议设计。现在分析 TCP 协议中的粘包是如何发生的: TCP 协议是面向字节流的协议,它可能会组合或者拆分应用层协议的数据; 应用层协议的没有定义消息的边界导致数据的接收方无法拼接数据。 面向字节流 TCP 是一种面向字节流的传输层协议,其核心设计不包含数据包或消息的概念,而是将数据视为连续的字节流进行传输。TCP 协议本身的传输机制会对待发送数据进行组合或拆分。 Nagle...
并行训练系列:5. Megatron 之分布式环境初始化
训练脚本入口点: pretrain_gpt.py - GPT模型训练 pretrain_bert.py - BERT模型训练 pretrain_mamba.py - Mamba模型训练 pretrain_t5.py - T5模型训练 pretrain_vlm.py - 视觉语言模型训练 train_rl.py - 强化学习训练 例如 pretrain_gpt.py:if name == "main": -> 调用 megatron.training.pretrain 函数 123456789101112from megatron.training import pretrainif __name__ == "__main__": ...... pretrain( train_valid_test_datasets_provider, partial(model_provider, gpt_builder), ModelType.encoder_or_decoder, ...
并行训练系列:4. 张量并行(TP)
在 ZeRO 系列中,实现了 parameters, gradients 和 optimizer states 的切分,然而在 FWD/BWD 计算时,使用的依然是完整的模型参数(需要预先通过 All-Gather 收集)。能不能在计算时只使用模型参数的一部分呢? 由此引出张量并行(Tensor Parallelism)。 TP 切分方式 在神经网络中,矩阵乘法常用以下形式表示:\(X\times W\),其中\(X\)为 actication 的输入,\(W\)为模型参数,均以 tensors 的形式保存;tensors 将被沿着一个特定维度切分为 N 个 shards,分布到 N 个 GPU 上。矩阵可以按行或者按列切分,分别对应行并行、列并行。 row-linear forward 运用 scatter 操作,将输入矩阵切分为若干个列; 将每个权重矩阵切分为若干行,分别与输入矩阵的各列相乘,最后通过 all-reduce 操作相加。 backward f和g分别表示两个算子(每个算子包含一个 forward+backward 操作) g的...
并行训练系列:3. 数据并行下篇(DeepSeed-ZeRO)
上篇描述了朴素数据并行(DP)和分布式数据并行(DDP)策略。两者的总通信量相同,然而 DP 的单 Server 机制导致了通信负载不均的问题(Server 通信量和总 GPU 数量成线性关系),导致 DP 适用于单机多卡场景;DDP 通过 Ring-AllReduce 这一 NCCL 操作,使得通信量均衡分布到所有 GPU 上(单个 GPU 通信量不受到总 GPU 数量的影响),利于多机多卡场景。 解决通信量负载不均的问题后,开始考虑显存开销:每个 DP 分片都复制了一份完整的模型参数、梯度和优化器状态,造成极大的显存负担,如何优化呢? 在优化显存前,需要先理清两个关键问题: 训练过程中 GPU 上存储了哪些内容? 分别在哪些阶段需要使用? 先看第一个问题。 显存开销计算 当训练一个神经网络时,需要在内存中存储以下内容:模型参数 W、模型梯度...