分布式推理
分布式推理将工作负载拆分到多个 GPU 上。它有助于在内存中容纳更大的模型,并同时处理更多提示。
Diffusers 支持四种策略。每种策略都有各自的指南,本页将帮助你选择其中一种。
选择策略
每种策略解决不同的问题,因此请根据限制你的资源选择一种。
| 策略 | 拆分 | 减少 | 单个提示词的延迟 | 最佳适用场景 |
|---|---|---|---|---|
| 数据并行 | 副本之间的提示 | 无,因为每个 GPU 都保存一份完整副本 | unchanged | 模型已经适配,并且您拥有许多提示 |
| device_map | 跨设备的组件 | 权重内存 | 略差 | 模型无法容纳,且互连速度较慢 |
| 上下文并行 | 输入序列 | 激活内存 | lower | 序列较长,例如高分辨率图像或视频 |
| 张量并行 | 权重矩阵 | 权重内存 | lower | 某个组件的权重无法容纳,且互连速度很快 |
一些实用建议:
- 如果模型本身已经能够装入显存,且你有大量提示词,请使用数据并行。它在不改动模型的情况下,通过增加 GPU 数量来提升吞吐量,同时不会影响单条提示词的延迟。你可以使用 Accelerate 或 PyTorch Distributed 来配置。
- 如果单个组件的权重无法容纳,请优先尝试张量并行,因为它能同时降低内存占用和延迟。张量并行在每个块边界处都需要通信,因此需要 NVLink 等高速互连。在 PCIe 上,每层的通信开销可能会超过其节省的计算量,此时
device_map是更好的选择。device_map还能处理各组件单独来看没问题、但整体规模过大的情况。 - 如果问题出在激活值而非权重上,请使用上下文并行。这有助于处理长序列,例如包含大量帧的大型图像和视频。请从上下文并行指南中的基准测试中选择一个后端。
- 如果权重和序列都过大,Diffusers 无法对同一模型同时应用张量并行和上下文并行。如果同时传入两个配置,
ParallelConfig会抛出错误,并且无法对已经并行化的模型第二次调用enable_parallelism。
xDiT 和 ParaAttention 社区集成提供了它们自己的上下文并行实现。
Update on GitHub