Liuyi Wen's Blog
搜索

Liuyi Wen's Blog

Transformer 系列:3. Encoder 和 Decoder 的架构
发表于2025-09-29|Transformer
背景 此前的模型(如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 的输入。 ...
幂等性设计
发表于2025-09-28|Distributed System
幂等性定义 幂等性设计用数学的语言来表达是:f(x) = f(f(x))。在计算机中幂等性指一个操作多次执行的结果与其执行一次的结果相同。 注意:这里强调的是结果,而非响应。 Wiki 上幂等性的定义:https://zh.wikipedia.org/zh-cn/%E5%86%AA%E7%AD%89 在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和1。 设计具有幂等性的分布式系统可以有效避免数据不一致和重复处理的问题。非幂等性产生的原因如下: 前端设计不合理,用户主动多次请求; 网络库超时重试机制; 弱一致性分布式系统中,不合理的查询判断。 支付是一个需要强幂等性的典型场景:用户点击支付按钮后,可能因为网页响应慢而重复点击,或者网络问题导致客户端重试。需要避免重复支付。 幂等性 &...
从 TCP 粘包到分帧
发表于2025-09-26|Network
TCP/ IP 协议簇中: IP 协议解决了数据包(Packet)的路由和传输,上层的 TCP 协议无需关注路由和寻址; 传输层的 TCP 协议解决了数据段(Segment)的可靠性和顺序问题,上层无需关心数据能否传输到目标进程,只要写入 TCP 协议的缓冲区的数据,协议栈几乎都能保证数据的送达。 当应用层协议使用 TCP 协议传输数据时,TCP 协议可能会将应用层发送的数据分成多个包依次发送;当应用层从 TCP 缓冲区中读取数据时发现粘连的数据包时,需要对收到的数据进行拆分。 TCP 协议之所以存在所谓的"粘包"问题,本质上源于对 TCP 协议特性的误解和不当应用层协议设计。现在分析 TCP 协议中的粘包是如何发生的: TCP 协议是面向字节流的协议,它可能会组合或者拆分应用层协议的数据; 应用层协议的没有定义消息的边界导致数据的接收方无法拼接数据。 面向字节流 TCP 是一种面向字节流的传输层协议,其核心设计不包含数据包或消息的概念,而是将数据视为连续的字节流进行传输。TCP 协议本身的传输机制会对待发送数据进行组合或拆分。 Nagle...
并行训练系列:5. Megatron 之分布式环境初始化
发表于2025-09-25|Parallelism
训练脚本入口点: 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)
发表于2025-09-18|Parallelism
在 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)
发表于2025-09-17|Parallelism
上篇描述了朴素数据并行(DP)和分布式数据并行(DDP)策略。两者的总通信量相同,然而 DP 的单 Server 机制导致了通信负载不均的问题(Server 通信量和总 GPU 数量成线性关系),导致 DP 适用于单机多卡场景;DDP 通过 Ring-AllReduce 这一 NCCL 操作,使得通信量均衡分布到所有 GPU 上(单个 GPU 通信量不受到总 GPU 数量的影响),利于多机多卡场景。 解决通信量负载不均的问题后,开始考虑显存开销:每个 DP 分片都复制了一份完整的模型参数、梯度和优化器状态,造成极大的显存负担,如何优化呢? 在优化显存前,需要先理清两个关键问题: 训练过程中 GPU 上存储了哪些内容? 分别在哪些阶段需要使用? 先看第一个问题。 显存开销计算 当训练一个神经网络时,需要在内存中存储以下内容:模型参数 W、模型梯度...
并行训练系列:2. 数据并行上篇(DP,DDP)
发表于2025-09-16|Parallelism
数据并行(DP) 思想:将模型复制到多个GPU上;在每个GPU上,对不同的micro batches执行前向/反向传播。 准备:在每个 GPU 上都拷贝一份完整的模型参数,将一个数据 batch 均分为多个 micro-batch,分别拷贝到不同 GPU 上(DP 分片); 前向传播/反向传播:每个 GPU 上对不同的 micro-batch 分别执行前向/反向传播,计算得到梯度 G; 聚合并下发梯度(All-Reduce): 每个 GPU 将本地梯度 G 发送给单个 GPU 做聚合(或者在不同的 GPU 上聚合梯度的某些部分);再将平均后的梯度下发到所有 GPU; 本地参数更新:所有 GPU 利用下发的梯度完成本地参数更新。 实现 DP 的经典框架为参数服务器:计算 GPU 称为 Worker,梯度聚合 GPU 称为 Server。 Worker 和 Server 是逻辑概念,分别可以对应一块或多块物理意义上的 GPU(当前讨论的基本都是对应一张 GPU...
RL 系列:2. 从 Bellman 算子的角度解释策略迭代/价值迭代
发表于2025-09-15|RL
看完策略迭代和价值迭代的定义后,我还是有点迷糊:为什么得到的策略一定会收敛呢?两种方法的本质区别是什么呢? 于是搜罗了一些更“数学”的解释,来阐明这个问题。 Bellman 算子 定义状态空间:\(S={\{s_1, s_2, ..., s_n \}}\);动作空间:\(A={\{a_1, a_2, ..., a_n \}}\) 贝尔曼期望方程: \[ V(s)=E_{a\sim\pi(a|s)}[r(s,a)+\gamma E_{s'\sim p(s'|s,a)}[V(s')]] \] 贝尔曼最优方程: \[ V(s)=\max_a(r(s,a)+\gamma E_{s'\sim p(s'|s,a)}[V(s')]) \] 根据以上方程,定义贝尔曼期望算子\(B_\pi\)和贝尔曼最优算子\(B_*\),分别代表对当前价值函数集\(V\)利用贝尔曼方程更新的操作: \[ B_\pi V(s)=E_{a\sim\pi(a|s)}[r(s,a)+\gamma...
RL 系列:1. Markov 决策过程
发表于2025-09-08|RL
本文旨在阐述基于 Markov 决策过程的强化学习原理,聚焦于关键公式(省去一些繁杂的数学推导),快速领会 RL 的核心理念。 RL 概述 强化学习的理念:Agent 根据 Environment 输出的 \(S_t\) 和 \(R_t\) 综合判断,产生当前步骤的动作 \(A_t\),放入 Environment 执行;Environment 根据 \(A_t\) 执行的结果,输出下一个状态 \(S_{t+1}\) 和当前动作带来的奖励 \(R_{t+1}\),返回给 Agent。 强化学习和监督学习的区别: RL 得到的时序数据不满足独立同分布; RL 无实时明确反馈当前 Action 是否正确,奖励信号延迟。(通过 rollout 过程从当前帧对 Action 进行采样,得到多个 observation, 每个 observe 对应一条 trajectory,即一个 State 和 Action 的序列 τ=(s0,a0,s1,a1,…);通过最终 reward 来观测当前 trajectory 是否合适) Markov...
并发系列:2. Go 的长连接
发表于2025-09-03|High Concurrency
TCP 连接的建立和关闭 绝大多数网络连接的建立都是基于 TCP 协议的,我们往往知道一个原则:建立 TCP 连接需要三次握手,其具体过程也是面试的一个常考点。那么“为什么 TCP 建立连接需要三次握手?”呢?这个问题很少深究。首先回顾一下建立连接的过程: TCP 连接是什么? 连接:用于保证可靠性和流控制的信息,包括 Socket、序列号和窗口大小。其中:Socket 由互联网地址标志符和端口组成;窗口大小主要用来做流控制;最后的序列号用于追踪通信发起方发送的数据包序号,接收方可以通过序列号向发送方确认某个数据包的成功接收。 TCP 所有的协议状态如下图: 建立 TCP 连接的三次握手 抽象成通俗语言就是: 你能听到吗? 我能听到,你听得到吗? 我也能听到。 第一次握手:SYN 报文:客户端随机初始化序列号 client_isn,放进TCP⾸部序列号段,然后把SYN置1。把SYN报⽂发送给服务端,表示 发起连接,之后客户端处于...
123…5
avatar
Liuyi Wen
文章
50
标签
5
分类
9
Follow Me
公告
The Journey Is the Reward.
最新文章
并行训练系列:7. Flash Attention V1/V22025-12-16
RL 系列:5. 从 TRPO 到 PPO 算法2025-12-08
并行训练系列:6. 序列并行上篇(Megatron-SP, DeepSpeed-Ulysses)2025-12-01
verl 框架:3. 加载数据与创建 batch2025-11-24
RL 系列:4. 策略梯度算法2025-11-17
分类
  • Database6
  • Distributed System1
  • High Concurrency2
  • Network1
  • OS3
  • Parallelism8
  • RL5
  • Transformer4
标签
KV Cache Go OOP Web Platforms Display C++
归档
  • 十二月 2025 3
  • 十一月 2025 3
  • 九月 2025 11
  • 七月 2025 5
  • 六月 2025 1
  • 五月 2025 4
  • 四月 2025 7
  • 三月 2025 16
网站信息
文章数目 :
50
本站访客数 :
本站总浏览量 :
最后更新时间 :
©2019 - 2026 By Liuyi Wen
框架 Hexo 7.3.0|主题 Butterfly 5.3.5
搜索