大模型训练之序列并行双雄:DeepSpeed Ulysses和Ring-Attention

0827e3eb1fb542c7a7c864b458589e2d.gif

©作者 | 方佳瑞

单位 | 腾讯

研究方向 | 机器学习系统

随着 Gemini 1M context length 和 Sora 出世,如何训练超长上下文的大模型引起了大家广泛关注。

本文对比两种目前炙手可热长文本训练方法 DeepSpeed Ulysess [1] 和 Ring-Attention [2]。2023 年末,二者几乎同时出现,但是设计方法大相径庭,可谓一时瑜亮。

  • DeepSpeed Ulysess:切分 Q、K、V 序列维度,核心卖点保持通信复杂度低,和 GPU 数无关,和序列长度呈线性关系。 

  • Ring-Attention:切分 Q、K、V 序列维度,核心卖点是通信和计算重叠。 

下面,我用 FlashAttention Style 的示意图来对比二者区别。图中 N 表示序列长度,d 表示 hidden_size=(hc * hs),hc = head_cnt,hs=head_size,P 表示 GPU 数目(图中 P=4)。红色虚线表示通信,黑色虚线表示计算。


9e4a59dcfe39bf2c7d1d5f75b56113d9.png

DS-Ulysses

DS-Ulysses 对 Q、K、V 沿着 N 维度切分成 P 份,三个分布式矩阵通过 All2All 变成沿 d 维度切分了。参见我之前的文章 [3],All2All 等价于一个分布式转置操作。之后就是正常的 softmax(QK^T)V 计算,可以用 FlashAttention 加速,得到结果再通过 All2All 转置回来。 

因为 All2All 最有通信量是 O(n),n 是 message size,所以 DS-Ulysses 通信量位 O(Nxd),和 P 没关系。所以可以扩展到很多 GPU 上。Ulysses 可以和 ZeRO 正交使用,ZeRO 可以进一步切分 Q、K、V,减少显存消耗。 

Ulysses 也有明显缺点,就是转置后切分维度 d/P,我们希望 d/P=hc/P * head_size,即对 head_cnt 所在维度切分,这样 Attention 的计算都在一张卡上完成,从而可以使用 FlashAttention 等单卡优化。但是如果遇到 GQA 或者 MQA 情况,K、V 的 head_cnt 很小,导致 GPU 数目 P 也不能变得很大。

50fedfc74024bae86d496a584298f932.png

7e53533862c41f387b4fd365fbf8f30c.png

Ring-Attention

Ring-Attention 就是FlashAttention(FA)的分布式版本,利用了 online softmax 这个大杀器。FlashAttention 文章一搜一大把,我也解读过 [4]。这里推荐朱小霖的 Ring-Attention 文章,里面有一个非常好开源实现,在原始 Ring 基础上做了很多改进。

https://zhuanlan.zhihu.com/p/683714620

https://github.com/zhuzilin/ring-flash-attention

Ring-Attention 采用 FA 的双循环计算模式,外层循环循环遍历 Q,内层循环遍历 K、V,使用 online softmax 增量更新最终结果,这和 FA 一模一样。当 K、V 计算穿越下图虚线部分时候,需要 P2P 通信,向相邻的 GPU 卡通信。通信和计算可以重叠起来。下图只画了一个 head 的 Attention 计算,可以并行做 head_cnt 个这样的计算。

Ring-Attention 的分块大小 (下图中的参数 c) 是可调节的。红色箭头表示的 fp16 格式 KVCache 的 P2P 通信量是 bytes。QKV 分块计算量是 FLOPS。所以只要满足计算量大于通信量,计算通信可以重叠起来,从而让通信开销消失。另外 K、V 的计算结果 intermediate tensor 只需要 c x c 大小部分,内存消耗很少。

772b3495aff9e5b8f15e62bc0ca580df.png

Ring-Attention 也有很多缺陷。比如 Self-Atention 计算有效部分一般是一个下三角,所以均匀切分 Q 的话,负载是不均衡的。这个问题 @朱小霖 的实现做了优化。另外处理变长序列也不容易,这在 SFT 任务中比较常见。

dbea37b605446370c01847d96fc612dd.png

二者比较

通信量:Ulysses 完胜。 

  • DS-Ulysses 三次 All2All 通信量 3xO(Nxd)。 

  • Ring-Attention :N/P/c x (P-1)/PxO(Nxd)=O(N^2xd/(Pxc)),外层循环每个GPU需要N/P/c次迭代,内层循环每个GPU收发(P-1)/P x O(Nxd)数据。通信会随着序列长度增长而平方增长。所以非常依赖和计算重叠。 

通信方式:Ring-Attention 更鲁棒。 

  • DS-Ulysses 需要 All2All 通信,对底层 XCCL 实现和网络硬件拓扑要求比较。一般 All2All 跨机器涉及拥塞控制,带宽比较差。 

  • Ring-Attention 需要 P2P 通信,对网络需求很低。

内存使用:二者近似 

二者 Q、K、V 显存消耗一致,对于 QK 计算结果 intermediate tensor 也都可以和 FlashAttention 等 memory efficient attention 方法兼容。二者也都可以和 ZeRO、TP 等其他并行方式兼容,所以我认为二者内存消耗类似。 

网络硬件泛化型:Ring-Attention 更好 

  • Ulysses 没有重叠 All2All 和计算,不过这个并不是不可以做。 

  • Ring-Attention 重叠 P2P 和计算,对分块大小 c 需要调节。 

模型结构泛化性:Ring-Attention 更好 

  • Ulysses 会受到 head 数目限制,导致无法完成切分。尤其是和 TP 结合,有序列并行 degree * 张量并行 degree <= head_cnt 的限制。 

  • Ring-Attention 对网络结构参数不敏感。 

输入长度泛化性:Ulysses 更好

  • Ring-Attention 处理变长输入很难处理,Ulysses 无所谓。 

总体来说,Ring-Attention 侵入式修改 Attention 计算流程,实现复杂,同时对变长输入、并行分块大小选择、三角矩阵计算负载均衡等问题处理起来很麻烦。而 Ulysses 对 Attention 计算保持未动,实现简单,但是缺陷就是对 num head 参数敏感。 

用奥卡姆剃刀原理,我觉得 Ulysses 后面也许会是主流方案。

a8312e5804b5c76be68addbb36e95f24.png

混合并行

Ulysses 和 Ring 可以组成一个混合序列并行方案。同时克服并行度 <=num_head 的限制,和避免 P2P 低效带宽利用。比如,在下面 8xA100 NVLink, num_head=8 上可以相比 ring-flash-attn 有 18% 和 31% 的训练和推理性能提升。

210bf77cbca380e2650565a95bc44aa9.png

在下面 8xA100 NVLink, num_head=2 上,训练有 54% 训练性能提升,得益于利用 All2All 高带宽利用率的特性。

4b63e608e6333d1d9d0536ec95184a2e.png

实现参见本人 repo:

https://github.com/feifeibear/long-context-attention

outside_default.png

参考文献

outside_default.png

[1] https://arxiv.org/abs/2309.14509

[2] https://arxiv.org/abs/2310.01889

[3] https://zhuanlan.zhihu.com/p/653968730

[4] https://zhuanlan.zhihu.com/p/664061672

更多阅读

7d85545e6c2fe4a550e85814639af65e.png

50e7eb2da9cbf8e75b5496a6f5ea84c2.png

6651d8c4941df82db5193a2fa6167fb6.png

1d2de3a72d86170c50f027b8e87465e7.gif

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿

d7e26ae72fb52405a3515e0563f4b757.png

△长按添加PaperWeekly小编

🔍

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

·

·

22103eadc393aaae063b2e496bff041c.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值