TileLink: Generating Efficient Compute-Communication Overlapping Kernels using Tile-Centric Primitives

发表时间: 2025-03 · arXiv:2503.20313

原文: https://arxiv.org/abs/2503.20313

文章标题:TileLink:使用以 Tile 为中心的原语生成高效的计算-通信重叠内核
作者/机构:Size Zheng, Jin Fang, Xuegui Zheng, Qi Hou, Wenlei Bao, Ningxin Zheng, Ziheng Jiang, Dongyang Wang, Jianxi Ye, Haibin Lin, Li-Wen Chang, Xin Liu (均来自 ByteDance Seed)

速读

一句话结论 本文提出了一个名为 TileLink 的编译框架,通过引入以 Tile 为中心的原语将通信与计算的设计空间解耦,从而自动化生成高效的计算-通信重叠内核,在 8 卡 H800 上实现了最高 20.76 倍的单层加速和平均 1.32 倍的端到端模型加速。

要解决什么问题 大型模型分布式训练中,通信开销常占总执行时间的 10% 到 50%,严重限制计算效率,而现有计算与通信重叠技术在机制上均存在卡点。第一条路线是算子分解,即将算子切分为更细粒度的单元,让无数据依赖的计算与通信并行。此做法虽易实现,但算子过小会导致 L2 缓存利用率低及计算资源量化效率变差;且细粒度内核间的同步需主机频繁干预,引入了不可忽视的同步开销。第二条路线是核融合,即在同内核中划分部分核心用于通信,剩余用于计算,通过设备端屏障同步状态。此法无需主机干预且缓存利用率高,但开发门槛极高,需深通底层硬件指令;若融合设计不当,通信与计算核心间会发生资源冲突导致性能下降。此外,现有的代码生成编译器虽能生成重叠内核,但受限于固定的重叠模式,缺乏算子级别的编程灵活性,无法跟上算法的快速迭代。

怎么做的 TileLink 的核心思路是放弃计算与通信紧密耦合的传统优化,转而通过一套“以 Tile 为中心(Tile-centric)”的原语,将两者的设计空间彻底解耦,由编译器后端自动处理底层同步与映射。这种解耦设计允许通信和计算组件在三个子空间中独立做出最优选择:首先是 Tile 大小子空间,通信和计算可采用不同的分块大小(例如通信按 128x128 传输以占满带宽,计算按 128x256 消耗以对齐计算核心);其次是 Tile 顺序子空间,通信可采用环形或全网状顺序,而计算可灵活决定等待单个或多个节点的数据以平衡缓存效率与等待延迟;最后是资源绑定子空间,通信可映射到复制引擎(DMA)以避免核心冲突,也可映射到计算核心以消除主机开销。为了在解耦后维持正确的生产者-消费者依赖关系,TileLink 在前端设计了两类原语。第一类是信号原语(如 `producer_tile_notify`、`consumer_tile_wait`),用于管理通信与计算之间的屏障。这些原语带有严格的内存一致性语义(Release/Acquire),确保在后端编译进行多级流水线展开和算子重排序时,内存访问操作不会被错误地重排到屏障之前或之后。第二类是数据原语(如 `tile_push_data`),控制数据传输的资源映射和模式。在后端,TileLink 通过以 Tile 为中心的映射策略将前端原语编译为底层硬件指令。对于数据分片固定的工作负载,框架采用静态映射,通过仿射运算在编译期确定映射关系。例如生产者 Tile 的形状映射定义为: $$f_S(\text{tile\_id}_p) = [\text{tile\_id}_p \times T_{mp} : (\text{tile\_id}_p + 1) \times T_{mp}, 0 : K]$$ 对于需要动态路由的工作负载(如混合专家模型 MoE),由于编译期无法确定数据来源,框架采用动态映射,将其转换为在运行时由动态逻辑填充的查找表: $$f_S(\text{tile\_id}) = [f_{S\_low}[\text{tile\_id}] : f_{S\_high}[\text{tile\_id}]]$$ 通过这种前后端配合,开发者只需编写少量 Python 代码,即可自动生成包含复杂同步逻辑的底层 PTX 汇编代码。

效果如何 实验在单节点 8 卡和双节点 16 卡 H800 集群上进行,输入配置取自 LLaMA、Gemma 和 Qwen 等真实模型。对比基线明确划分为三类:代表无重叠路线的 cuBLAS+NCCL、代表算子分解路线的 Async-TP PyTorch,以及代表核融合路线的 FLUX 库。在单层性能测试中,对于多层感知机(MLP)的 GEMM+ReduceScatter 阶段,TileLink 凭借解耦优化表现最佳,分别比 cuBLAS+NCCL、Async-TP PyTorch 和 FLUX 加速 1.25 倍、2.22 倍和 1.28 倍,且仅需约 200 行 Python 代码(FLUX 需要约 2000 行 CUDA 代码)。对于现有库无法支持动态映射的 MoE 层,TileLink 成功重叠了三个内核,完整 MoE 层平均比 vLLM 快 1.14 倍,最大比 cuBLAS+NCCL 加速 20.76 倍。在 16K 到 128K 长序列自注意力测试中,TileLink 平均比 PyTorch 快 5.04 倍,比 RingAttention 快 1.97 倍,有效隐藏了 43.9% 的通信开销。在端到端评估中,将 TileLink 集成到 PyTorch 后,8 卡 H800 上 8 种大模型平均加速 1.32 倍(MoE 模型达 1.54 倍)。作者也指出了局限性:端到端加速幅度低于单层 MoE 加速,因为模型中未被极致优化的 MLP 层仍占约 50% 的执行时间;此外在 16 卡双节点环境下,由于额外的跨节点通信开销,整体平均加速微降至 1.29 倍。

A1 主要贡献

本文旨在解决大型深度学习模型分布式训练中,通信开销(占总执行开销的10%-50%)限制计算效率的核心问题。提升性能最有效的方法是计算与通信的重叠(Overlapping),现有技术主要分为两种:算子分解(operator decomposition)和核融合(kernel fusion)。算子分解易于实现,但常因内核分解过细、缓存利用率低和主机干预同步开销大而导致性能不佳。核融合性能更优,但需要深厚的硬件专业知识,开发难度大且难以跟上算法的快速迭代。

为了应对这些挑战,本文提出TileLink框架,其研究目标是通过编译技术高效地开发和生成计算-通信重叠内核。

本文的主要贡献和创新点如下
1. 提出TileLink框架:该框架包含前端和后端。
* 前端:通过以Tile为中心(tile-centric)的原语,将通信和计算的设计空间解耦。这允许通信和计算部分可以采用不同的优化策略和分块(tiling)方法,并通过定制的屏障控制来维持生产者-消费者依赖关系,从而在不直接编写底层汇编代码的情况下,实现通信与计算核的自动化融合。
* 后端:将前端的tile-centric原语编译成底层硬件指令,并集成通信与计算内核。通过以Tile为中心的映射策略(包括形状映射、rank映射和通道映射,支持静态和动态两种方式)来确保正确的数据交换和屏障操作。
2. 通用性和灵活性:通过TileLink实现了多种重叠工作负载,包括自注意力(self-attention)、多层感知机(MLP)和混合专家模型(MoE),展示了其灵活性和通用性。
3. 高性能实现:在8卡H800 GPU上的实验表明,与非重叠基线相比,TileLink实现了1.17倍至20.76倍的加速。其性能与当前最先进的重叠库(如FLUX和RingAttention)相当或更优。在端到端模型评估中,与PyTorch相比,TileLink在8卡H800上平均加速1.32倍,在16卡H800(双节点)上平均加速1.29倍。

图1 层内并行FFN示例。
图1 层内并行FFN示例。

A3 背景知识/关键Observation/设计原则

2.1 通信与层内并行

2.2 通信和计算的重叠

2.3 代码生成编译器

2.4 激励性示例

表1 TileLink与先前工作的特性比较。
表1 TileLink与先前工作的特性比较。

表2 激励性示例。
表2 激励性示例。

表3 TileLink中的以Tile为中心的原语
表3 TileLink中的以Tile为中心的原语

A2 方法细节

3.1 解耦的设计空间

图2 通信和计算的三个设计子空间示例。
图2 通信和计算的三个设计子空间示例。

图3 以Tile为中心的原语支持不同的信号控制和数据传输方向。
图3 以Tile为中心的原语支持不同的信号控制和数据传输方向。

3.2 以Tile为中心的原语

3.2.1 信号原语

3.2.2 数据原语

4.1 以Tile为中心的映射

4.2 内存一致性的编译

4.3 其他编译优化

图4 使用TileLink的GEMM+RS重叠内核。
图4 使用TileLink的GEMM+RS重叠内核。

图5 使用TileLink的AG + MoE重叠内核。
图5 使用TileLink的AG + MoE重叠内核。

图6 AG KV + self-attention overlapping Kernel.
图6 AG KV + self-attention overlapping Kernel.

6. 实现

图7 TileLink的编译和运行时。
图7 TileLink的编译和运行时。

表4 基准测试形状。S是序列长度,H是隐藏维度长度,I是中间大小,E是专家数量。
表4 基准测试形状。S是序列长度,H是隐藏维度长度,I是中间大小,E是专家数量。

A4 实验环境

A4 实验结果

单层性能

端到端评估

图8 8xH800上MLP层(AG+GEMM和GEMM+RS)的性能结果。
图8 8xH800上MLP层(AG+GEMM和GEMM+RS)的性能结果。

图9 8xH800上MoE层(AG + Gather + GroupGEMM和GroupGEMM + Scatter + Reduce + RS)的性能结果。
图9 8xH800上MoE层(AG + Gather + GroupGEMM和GroupGEMM + Scatter + Reduce + RS)的性能结果。

图10 8xH800上自注意力层的性能结果和重叠率。
图10 8xH800上自注意力层的性能结果和重叠率。

公式 重叠率
公式 重叠率

图11 8xH800和16xH800上端到端模型的性能结果。
图11 8xH800和16xH800上端到端模型的性能结果。

A5 结论

本文提出了TileLink,一个用于生成高性能计算-通信重叠内核的框架。为了解决大型DNN模型在分布式系统部署中通信与计算重叠的关键问题,TileLink通过一套以tile为中心的原语来提高开发效率,并通过以tile为中心的映射来自动生成底层代码。这种方法克服了现有重叠研究中性能次优或开发困难的缺点。实验结果表明,与非重叠基线相比,TileLink实现了1.17倍至20.76倍的显著加速,其性能与最先进的重叠库相当。这证明了TileLink在提高分布式深度学习系统效率方面的有效性和潜力。

方法细节中的引用汇总