概述
DeepSpeed-Ulysses(或称为Ulysses,一个非常长的小说),这是一种简单、易用且高效的方法,用于支持具有极长序列长度的高效可扩展LLM训练。
逻辑
其逻辑大概为:DeepSpeed-Ulysses将各个样本在序列维度上分割给参与的GPU。然后,在attention计算之前,它对已分割的查询(Q)、键(K)和值(V)执行all-to-all通信操作,以使每个GPU接收完整的序列,但仅用于注意力头的非重叠子集。这使得参与的GPU可以并行计算不同的注意力头。最后,DeepSpeed-Ulysses还使用另一个all2all来在注意力头上收集结果,同时重新在序列维度上进行分区。
总结来说,DeepSpeed Ulysess切分 Q、K、V 序列维度,核心卖点保持通信复杂度低,和 GPU 数无关,和序列长度呈线性关系。
设计
核心设计逻辑如下:

❝
我额外加了蓝色线与绿色线、黄色线,标识all-2-all与序列切分转置。
与已知的Transformer架构一样,设计由N个输入序列在P个可用设备上分区组成。每个本地N/P分区都被投影到查询()、键()和值()嵌入中。接下来,() 嵌入通过参与计算设备之间的高度优化的全对全集合(all-to-all collectives)进行全局的 QKV 收集。在全对全集合后,每个头的注意力计算形式为:
结合图来说,DS-Ulysses 对 沿着 N 维度切分成 P 份,三个分布式矩阵通过 All2All 变成沿 维度切分了。All2All 等价于一个分布式转置操作——之后就是注意力头的计算,得到结果再通过 All2All 转置回来。
❝
transformer计算参考:从维度出发:理解单头/多头注意力机制的计算[1]
all2all通信
展开All2All通信流程来说,主要的就是序列切分及转移。其流程可按如下分析:
-
如上蓝色框所示,在序列并行组中,原本是 维度,在all2all通信后被转化为 ; -
如绿框所示,拆分的维度是 ,每一份GPU上都有一份 ; -
随后按注意力头公式计算; -
如黄色框所示,最后再通过all2all聚合,再转置回原先的维度,得到了最终的注意力。 -
最后就是按多头注意力公式计算最终的输出。
因为 All2All 最大通信量是 O(n),n 是 message size,所以 DS-Ulysses 通信量位 O(Nxd),和 P 没关系。所以可以扩展到很多 GPU 上。
总结
引用原文的优点总结:
-
与现有系统相比,序列长度增加了 4 倍,支持训练超过百万个token的序列。 -
与现有系统相比,通信减少了超过 10 倍,导致吞吐量提高了高达2.5倍,并且每个 GPU 的持续吞吐量超过 175 TFlops(超过硬件峰值的54%)。 -
完全通用的 attention:DeepSpeed 序列并行支持密集和稀疏的注意力,并可与高效的注意力实现(如FlashAttention v2)一起工作。 -
支持大规模模型训练:DeepSpeed 序列并行不仅支持大序列长度,还可以与 ZeRO-3 并用支持大模型尺寸。 -
易于使用和迁移,最小化对现有训练框架的代码更改要求。
缺点:注意力头的个数需要能整除序列并行数。
长序列的支持,目前还不是很普及,只是在一部分的微调训练框架中有支持,譬如XTuner;而基座模型目前支持长上下文的也不是很多,InternLM2目前支持200K,算是很长的了。
从维度出发:理解单头/多头注意力机制的计算: https://zhuanlan.zhihu.com/p/686005777
原文始发于微信公众号(阿郎小哥的随笔驿站):聊聊大模型并行训练框架DeepSpeed-Ulysses长对话训练的原理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/291502.html