在OpenAI提供的公开信息中,Sora模型实际上是一个Diffusion Model+Transformer架构。本文基于B站在生成式TTV在自研道路上的探索、结合行业进展和工程实践,先后尝试了几种TTV(Text to video,后面将简称为TTV)模型。文中重点介绍由colossal-ai发布的类Sora模型Open-Sora,以及由智谱AI发布的CogVideoX模型。
考虑到CogVideoX模型虽然使用了视频信息与文字信息,但两种embedding是在单一维度进行拼接,并进行全局Attention计算的,因此本身属于单维Transformer。对于单维Transformer,我们选择实现了DS-UIysses方案,在实现上:
a. 先在Transformer Block之前,沿sequence维度进行切分,但只对视频的hidden state的seq维进行切分。文字embedding的部分不切分,并与切分后的视频embedding拼在一起。
b. 相对位置编码是需要对全序列长度进行计算的,因此在每个3D-Rope计算前,进行一次all-to-all通信,回收sequence维度的信息。
c. 因为每个seq段都拼接了文字embedding,因此首先需要通过remove_extra_encoder方法,移除每段seq冗余的text embedding。在计算完Attention后,进行一次all-to-all通信,在attention head维度回收信息,并回到sequence切分的状态。在MLP Block计算前,通过 add_text_encoder补上每段seq都有的文字embedding部分。
d. 在所有的Transformer Block后,进行gather sequence操作,合并SP组各组上的计算结果。
通过使用SP并行策略,CogVideoX由单机16卡只能训练45帧1080p的数据,提升至可训练221帧1080p的训练数据。
后续分析代码发现,训练中会默认使用torch.utils.checkpoint对全层数的transformer进行重计算,但基于如下几点原因可以对其优化:
A. 显存仍未用尽,有tradeoff的余地
B. 需要重计算的层数应该可控
C. 重计算作用在一个融合算子上,其中涉及MLP,GN,QKV计算,attention计算等,但其实只有attention计算使用该策略的价值最高
经过一系列的代码调整后,最终训练速度提升约12%。
b.融合算子替换
根据profiling分析,红框中gelu算⼦实际执⾏时是以多个⼩算⼦拼接的形式下发和执⾏的。