腾讯发布ProjectxDiT!打造DiT并行推理的vLLM
作者: PaperWeekly 来源: PaperWeekly
©PaperWeekly 原创 · 作者 | 方佳瑞
单位 | 腾讯
研究方向 | 机器学习系统
上半年,我们见证了国内视频生成领域的迅猛发展。四月份,生数科技的 ViDu [1] 成功生成了 16 秒的电影级视频,不仅在视频号上引发了热烈反响,更揭开了中国 Sora 们崭露头角的序幕。而到了六月份,快手可灵 [2] 的发布,以其逼真的老铁风格,让人一时间真假难辨,更难能可贵的是它面向公众开放使用,使得迟迟未敢公测的 Sora,被戏称为“美国可灵”。
与此同时,阿里 EMO [3]、智谱清影 [4] 等视频类产品也相继问世,共同推动了这一领域的繁荣发展。不能忽视的是,在传统的图片生成领域,SD3、Flux、Pixart 等等也持续发力,图片更加高清、细节更加逼真。
DiTs(Diffusion Transformers)作为文生图与文生视频的核心网络结构,是引领高清图像与长时一致性视频生成潮流之关键。
随着生成质量要求的不断提升,DiTs 的输入序列长度日益增长,序列增长导致Attention 机制的计算量也随之呈平方级膨胀,对推理延迟 SLA 的影响是灾难级的。在单卡 A800 上 0.6B pixart 模型生成 512px 图片需 2 秒,而生成 4096px 图片,则需3 分钟 !在 V100 上生成 1028px 图片,1.5B HunyuanDiT 需 3 分 38 秒!
对于视频生成,单卡推理必然无法满足需求。视频生成问题延迟问题更严重,采用 DiT 架构的 Sora 推理成本让人高不可攀。OpenAI 的 CTO Murati 今年三月接受 WSJ 采访 [5] 时承认,Sora 对外开放使用的瓶颈之一正是推理开销。Factorial Funds 估算 Sora 的推理需求 [6]:一个 H100 GPU 一小时生成大约 5 分钟的视频,理想扩展下,需要 12xH100 实现 1 秒钟生成一秒钟视频。
越来越多的视频生成应用等待落地,为了满足它们在线服务满足实时性的需求,多 GPU 乃至多机部署 DiT 已势在必行。 但是,我们却没有看到一个软件可以满足日益增多的 DiT 模型和实时性要求,更别说将 DiT 并行标准和实现统一起来。
大家目前都是基于 huggingface diffusers 库进行定制改造。正如 vLLM 出现之前,大家也都基于 huggingface transformers 库,增加并行逻辑去搭建推理流程,比如 deepspeed 和 accelerate 等,这些现在看来都是临时方案。势必需要一个性能好(满足实时性需求)的人人可用(易用性高)的 DiT 推理框架。
针对这个问题,我们将之前的 PipeFusion 项目升级成了通用的 DiT 推理引擎,命名为xDiT 。这个名字很像马斯克起的,不过我们是向 vLLM 致敬,这里的 X 是 Scalable 的意思。
论文标题:
xDiT: A Scalable Inference Engine for Diffusion Transformers (DiTs) on multi-GPU Clusters****
项目地址:
https://github.com/xdit-project/xDiT
论文地址:
https://arxiv.org/abs/2405.14430
我们希望xDiT 成为 DiT 推理领域的 vLLM。 正如一年前,LLM 推理最关键的问题是如何做 Batching,而业界缺少有效的方案,所以 vLLM 携创新 Paged Attention+前人 Continous Batching 横空出世。
现在,DiT 推理最关键的问题是如何高效并行,业界的方案也比较匮乏,xDiT 携我们创新的 PipeFusion+ 前人的 Sequence Parallel 亮相。做一个比喻,vLLM=huggingface transformers+Batching,xDiT=huggingface diffusers+Parallel。
DiT 和 LLM 推理任务特点不一样,这导致二者软件设计哲学也有差异:
-
LLM 有 Prefill 和 Decode 两阶段,分别是计算密集和访存密集的;而 DiT 的计算和 Prefill 相似是计算密集的。所以 Batching、Paged Attention 等为了增加 Decode 阶段计算密度的设计在 DiT 中不需要,其实也没有 KVCache 不断 Append 增长的现象。
-
LLM 模型很大,而序列长度有限,比如 ShareGPT 的任务生成顶多几百个 token。而 DiT 正好反过来,模型不大,推理时序列长度很长,甚至 Million 级别。这导致张量并行这种 vLLM 中第一优先级的并行方法,在 DiT 中性能很低。
-
LLM 模型大多收敛到微调 Llama 架构,而 DiT 架构则呈现出较大的差异性。例如,SD3、Latte 等网络与 Meta DiT 论文中的 DiT Block 在算子设计上存在显著差异,且 DiT Block 之间的连接方式也各不相同,常采用类似 U-Net 的 U 型结构进行链接。因此,DiT 模型的代码相对 LLM 不够简洁,往往涉及好多文件和函数,对其进行模型层面的改造也更具挑战性。
正如 vLLM 让 transformers 具备 Batching 的能力,xDiT 让 diffusers 有并行的能力。考虑到 DiT 的特点,我们首先提出了一系列创新的并行方式,并可以相互混合。更重要的是,xDiT 提供了一套优雅的开发接口,针对性解决了 DiT 模型更改难度高的问题,这套开发接口尽可能可能复用 diffusers 的现有逻辑,开发者通过一些 wrapper 实现复杂的混合并行,实现高效地扩展方法。
xDiT Overview
作为可扩展的高性能推理 DiT 引擎,xDiT 有如下核心能力:
第一,DiT 主干网络混合并行 :xDiT 支持任意混合四种基础并行策略方法。基础并行方法有:
-
Pipefusion Parallel [7]:TeraPipe 方式流水线并行方法,在弱互联,比如 pcie/以太网,的网络硬件上有优势,比如以太网互联的多机多卡情境下效率远高于其他方法。也是我们的创新工作。
-
Sequence Parallel:混合序列并行,使用 ring & ulysses sequence parallel 混合方式 USP [8]。
-
Data Parallel:在输入多个 prompt 或单个 prompt 生成多张图片时,在 image 间并行处理。
-
CFG Parallel, a.k.a Split Batch:在模型使用 classifier free guidance(CFG)时可以开启,并行度恒定为 2。
xDiT 中这四种并行方式可以以任何形式排列组合,混合策略在通信量和通信拓扑两方面可以取得最佳效果,使 xDiT 可达到近似线性的扩展性。
第二,Parallel VAE: 针对扩散模型后处理的解码 VAE 模块在高分辨率图像生成时 OOM 问题,xDiT 实现了 Patch Parallel 版本的 VAE。
第三,简单灵活的开发接口: xDiT 轻松帮助用户支持新的 DiT 模型。它尽可能复用开源社区 diffuser,完成对模型推理的并行化改造。这套接口也是让 xDiT 从之前的不同并行方法集合变成一个灵活开发工具。通过 xDiT 接口,实测 15 分钟可以让 Pixart-Sigma 模型并行起来!
xDiT 本次的重构的核心,由一名本科生 潘瑾哲 @Eigensystem 完成,瑾哲是华科超算队队长,架构功力超过了很多正式员工。关于项目更多细节,可以参考瑾哲文章 [9]。
▲ xDiT的方法
####PipeFusion
PipeFusion 是一种 TeraPipe 式的序列流水并行。但和针对 LLM 设计 TeraPipe 有问题有显著不同,它利用了 Input Temporal Redundancy——即扩散步骤间输入与激活之间的数值相似性,这是扩散模型特有的特性,同样被应用于 DistriFusion 中。
Input Temporal Redundancy 和序列流水并行结合,避免了 LLM 模型中因果注意力带来的负载均衡问题。PipeFusion 可以显著减少了通信量,它和序列并行、张量并行、DistriFusion 对比都是通信带宽需求都是最低的,从而特别适合在以太网连接的多节点设置和 PCIe 连接的多 GPU 上使用。
PipeFusion 原理可以参考本人如下文章:
https://zhuanlan.zhihu.com/p/699612077
PipeFusion 和 LLM 序列并行对比可以参考本人如下文章:
https://zhuanlan.zhihu.com/p/706475158
####USP:混合序列并行
序列并行我在之前写了太多文章,这里不在赘述,简单来说我们可以混合 ulysses 和 ring 两种并行,xDiT 的并行 args 也提供了 ring_degree 和 ulysses_degree 可以配置。
序列并行做大模型训练,你需要知道的六件事:
https://zhuanlan.zhihu.com/p/698031151
大模型训练之序列并行双雄:DeepSpeed Ulysses和Ring-Attention**
CFG Parallel
Classifier-Free Guidance(CFG)是扩散模型领域的一个重要的技巧,可以提供更广泛的条件控制、减少训练负担、增强生成内容的质量和细节,以及提高模型的实用性和适应性。
对于一个输入 prompt,使用 CFG 需要同时进行 unconditional guide 和 text guide 的生成 ,相当于输入 DiT blocks 的 input latents batch_size = 2。CFG Parallel 分离两个 latents 分别进行计算,在每个 Diffusion Step forward 完成后、Scheduler 执行前 Allgather 一次 latent space 结果。它通信量远小于 Pipefusion 和 Sequence Parallel。
因此,使用 CFG 一定要优先使用 CFG Parallel。DistriFusion 也用了 CFG,叫 split batch,也是性能提升关键。
Hybrid Parallel
xDiT 设计目标是扩展 DiT 推理过程到超大规模,我们目标不止单机多卡,而是考虑了异构网络互联条件下多机多卡,比如以太网+PCIe。单一并行方式,比如 PipeFusion 或者 SP,很难同时做到这两点,不同并行方式混合在一起变得尤为重要。
如前文所述 xDiT 支持四种并行方式:PipeFusion、Sequence、Data 和 CFG Parallel。其中,Data 和 CFG Parallel 在图像间并行相对简单,而 PipeFusion 和 Sequence 在图像内部的不同 Patch 间并行则较为复杂。能让着两种并行方式的混合使用,正式 xDiT 核心创新点之一。
PipeFusion 和 USP 混合并不简单,因为 PipeFusion 使用上一个 Diffusion Step 过时的 Stale KV(Stale KV)参与计算,而传统 SP 都是只使用最新的 Fresh KV 参与计算。xDiT 针对这个新问题进行了特殊设计,保证混合并行执行结果准确,可以参考项目的设计文档 [10]。
我们在之前也是实现了 Tensor Parallel 和 DistriFusion,但发现他们都不足以作为基础并行方法。TP 通信量太大,DistriFusion KV 内存消耗太大,在 NVLink 上性能和 USP 近似,在 PCIe 弱互联又逊于 PipeFusion。不过,我们后续也考虑加入 DistriFusion 作为基础并行。
Parallel VAE
上述优化是对 DiT backbone 设计的,其实 VAE 模块在高清图片生成式也有问题。diffusers 采用的 stabilityai/sd-vae-ft-mse [11] 在处理高分辨率图像(A100上的 8192px)时会导致内存溢出(OOM)。这在 diffusers/issues/5924 [12] 中有详细记录,但是一直悬而未决。
我们借着 xDiT 机会彻底把这个问题解决了,为此开发了 DistVAE,并行高效处理高分辨率图像的解决方案:
https://github.com/xdit-project/DistVAE
我们的方法结合了两种关键策略:
1. 序列并行: 我们将潜在空间中的特征图分割成多个 Patch,并在不同设备上进行序列并行 VAE 解码,就是序列并行。这种方法将中间激活所需的峰值内存减少到 1/N,其中 N 是使用的设备数量。
2. 分块输入处理: 类似于 MIT-patch-conv [13],我们将输入特征图分割成块,并依次送入卷积运算符。这种方法最小化了临时内存消耗。
通过整合这两种方法,我们显著扩展了 VAE 解码的能力。我们的实现成功处理了高达 10240px 的图像分辨率,与默认 VAE 实现相比,这有 11 倍提升。
未来工作
xDiT 项目我们未来计划做如下事情:
-
更多模型支持。比如,最近出现的文生图模型 Flux,视频模型比如 CogVideo、Latte 等。我们也正在和 hugginface diffusers 团队建立合作,毕竟 xDiT 设计初衷也是通过添加少量代码让 diffusers 拥有并行能力。
-
ComfyUI 界面支持,让平民玩家可以通过 xDiT 把大的模型玩起来。比如,家里台式机配两张显卡,xDiT 可以有加速一倍。
-
xDiT 也可以有些调度层面的事情可以探索,比如 PipeFusion 的 Warmup 阶段分离。PipeFusion 流水并行 Warmup 会影响流水线,可以将预热阶段用 SP 单独部署,其余 diffusion step 用 PipeFusion。另外,KV 内存 Offloading 策略,LoRA 等方向也可以在分布式 DiT 推理中进行研究。
-
和 Runtime 互补,比如 torch.compile,TensorRT,量化剪枝等。我们也正在和 OneDiff [14] 合作,进行编译优化方向的工作。xDiT 专注并行和存储管理,和计算加速兼容,可以组合成为最佳实践。
-
xDiT 也希望能汇聚更多 DiT Sys 方面最新研究,不仅仅是我们自己的方法。
希望对 xDiT 感兴趣的朋友与我们联系。我们也需要一些 researcher intern 一起做一些前沿方向。
参考文献
[1] https://www.shengshu-ai.com/vidu
[2] https://klingai.kuaishou.com/
[4] https://chatglm.cn/%3Fredirect%3D/video
[5] https://user.guancha.cn/main/content%3Fid%3D1198409
[6] https://www.factorialfunds.com/blog/under-the-hood-how-openai-s-sora-model-works
[7] https://arxiv.org/abs/2405.14430
[8] https://arxiv.org/abs/2405.07719
[9] https://zhuanlan.zhihu.com/p/713199948
[10] https://github.com/xdit-project/xDiT/blob/main/docs/methods/hybrid_zh.md
[11] https://huggingface.co/stabilityai/sd-vae-ft-mse
[12] https://github.com/huggingface/diffusers/issues/5924
[13] https://hanlab.mit.edu/blog/patch-conv
[14] https://github.com/siliconflow/onediff
更多阅读
#投 稿 通 道#
** 让你的文字被更多人看到**
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读 ,也可以是学术热点剖析 、科研心得 或竞赛经验讲解 等。我们的目的只有一个,让知识真正流动起来。
📝稿件基本要求:
• 文章确系个人原创作品 ,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬 ,具体依据文章阅读量和文章质量阶梯制结算
📬投稿通道:
• 投稿邮箱:[email protected]
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02 )快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在**「知乎」** 也能找到我们了
进入知乎首页搜索**「PaperWeekly」**
点击**「关注」** 订阅我们的专栏吧
·
·
·
·
更多AI工具,参考Github-AiBard123,国内AiBard123