最先利用这个特性来加速扩散模型并行推理的是MIT韩松和Lepton贾扬清合著的论文DistriFusion。他们指出这种特性被用来优化并行推理过程,通过分割输入图像为多个区域,并分配给不同的计算设备处理,同时利用局部fresh activation和one step stale activation混在一起进行Attention和Convolution操作最终生成效果近似,从而可以隐藏通信成本,实现很好的并行。但是我们发现,可能会导致内存使用效率低下,因为需要维护完整的注意力键(K)和值(V)的空间形状,这限制了其在多计算设备环境下的可扩展性。
下表对比了不同DiT并行方法的内存和通信性能。表中,
p
表示生成序列的长度(latent space中的像素数),
hs
代表模型的hidden size。
L
是网络层数,
P
是总参数数量。注意力模块中Query(Q)、Key(K)、Value(V)和Output(O)的参数数量相同,表中用
A
表示,峰值Activation内存与单个DiT层的成本相同,就是attention的峰值Activation,即Q、K、V、O的总量。在attn-KV列中,fresh表示使用当前扩散步骤的KV Activation,而stale表示使用前一步骤的部分KV Activation,stale-表示更偏向fresh。名称后的*表示该方法采用异步通信,通信成本可以通过计算隐藏。
PipeFusion将输入图像分割成
M
个不重叠的Patch,并将DiT网络均匀分成
N
个阶段,每个阶段由不同的计算设备顺序处理。切分与序列并行和DistriFusion略有不同,这里的M和N可以不相等。每个设备以流水线方式处理其分配阶段的一个Patch。这种需要均分网络的方法非常适合DiT模型,因为它们包含许多重复的Transformer块。比如,U-Net扩散模型没有这种重复结构,切分阶段就很费劲。
如下图所示,以
N
= 4和
M
= 4为例,展示了两个diffusion timestep的流水线工作流程,其中步骤T+1(浅灰色)的计算在步骤T(深灰色)之前完成。例如,Patch 0(P0)在deviuce 0上计算后传递给device 1,同时device 0并行计算P1(Patch 1)。由于Sampler的计算是逐元素操作,所有diffusion timestep都可以流水线化。利用输入时间冗余性质,设备无需等待接收当前流水线步骤的全空间形状KV Activation即可开始其阶段的计算,它使用前一步骤的stale activations代替fresh activations为当前步骤所用。因此,一旦流水线初始化,流水线内就没有等待时间。考虑到流水线中的气泡,流水线的有效计算比率也非常高,因为diffusion timestep通常是几十甚至几百。
不仅内存和通讯特性上更好,理论上PipeFusion在生成图像的准确性上理论上优于DistriFusion,因为它使用了更多的fresh activation信息。比如,当M=4时,一个Diffusion Timestep内不同时刻的fresh vs stale Activation的比例如下,深灰色是fresh activation,浅灰色是前一步的stale activation,可见fresh部分逐渐增大。而DistriFusion在整个Diffusion Timestep内一直只有1/N部分是fresh的。