分布式训练可以通过将计算工作负载分配到多个 GPU 或机器上来应用于扩散模型,从而实现更快的训练并扩展到更大的数据集和模型尺寸。关键的方法包括数据并行、模型并行以及针对扩散过程定制的专门策略。这些方法解决了扩散模型高计算需求的问题,扩散模型涉及在许多时间步长和大型神经网络(如 U-Nets)上进行迭代去噪步骤。
一种常见的方法是数据并行,其中每个 GPU 处理一部分训练数据。例如,一批图像可以分配到多个 GPU 上,每个设备计算其部分的梯度。PyTorch Distributed 或 Horovod 等框架在设备之间同步梯度,以保持模型一致性更新。在扩散模型中,每个训练步骤都涉及采样随机时间步并应用噪声,因此同步必须考虑跨 GPU 的不同时间步分布。像 Hugging Face 的 Diffusers 这样的库使用 PyTorch 的 DistributedDataParallel
来处理这个问题,确保来自所有时间步的梯度得到正确聚合。当模型适合单个 GPU 时,此方法效果很好,但如果模型本身过大,则扩展性较差。
对于更大的模型,模型并行将网络分割到多个设备上。例如,可以将 U-Net 的编码器和解码器层放置在不同的 GPU 上,并在前向和后向传播过程中在它们之间传递激活。NVIDIA 的 EDM 框架使用此策略来训练大规模扩散模型,将 U-Net 分割成多个部分以减少每个 GPU 的内存使用量。管道并行是一种模型并行的变体,它将模型划分为多个阶段(例如,按顺序处理不同的时间步),以重叠计算和通信。然而,这需要仔细管理以避免瓶颈,尤其是在时间步之间相互依赖的扩散模型中。
最后,专门策略解决了扩散模型的独特方面。例如,由于扩散涉及许多时间步,分布去噪过程本身可以提供帮助。一种方法是将时间步的子集分配给不同的 GPU,每个设备处理一系列噪声水平。另一种方法使用参数高效技术,例如将噪声预测网络分布在设备上。像 DeepSpeed 或 FairScale 这样的框架可以通过零冗余优化器 (Zero Redundancy Optimizer, ZeRO) 来优化内存使用,该优化器将优化器状态分配到多个 GPU 上。例如,Stability AI 的 Stable Diffusion 可能结合了这些技术在大型集群上进行训练,尽管具体实现细节并未公开。开发者在选择策略时应平衡通信开销、内存限制和模型架构。