diffusers 如何用 accelerate 在多 GPU 上分发提示词做数据并行推理
【免费下载链接】diffusers🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers
你手上有一批提示词(prompts)要跑同一个扩散管线,模型本身已经能放进单卡显存,但逐条串行处理太慢。用 🤗 Diffusers 搭配 Accelerate 做数据并行推理可以解决这个问题:每张 GPU 各加载一份完整的DiffusionPipeline副本,Accelerate 自动把提示词列表切分到各个 GPU 进程,每个进程处理自己那份提示词。结果是总吞吐随 GPU 数量提升,单条提示词的延迟不变。以下内容依据仓库中的 分布式推理文档 和 安装文档 整理。
什么情况下用数据并行
分布式推理文档在 "Choosing a strategy" 小节给出了一张策略对照表。Accelerate / DDP 这一行的定位是:
| 维度 | 文档中的说明 |
|---|---|
| 切分对象 | prompts across replicas(把提示词切给各副本) |
| 减少的开销 | nothing — each device holds a full copy(每张卡持有完整模型副本,不减少显存占用) |
| 单条提示词延迟 | unchanged(不变) |
| 适用场景 | the model already fits and you have many prompts(模型已能放进单卡、且提示词量大) |
文档同时给出实践建议:如果你追求的是大量提示词下的吞吐,且模型已经放得下,就用数据并行。它是这些策略中唯一不改动模型就能让吞吐线性扩展的方式,且不影响单条提示词的延迟。如果你的问题是模型放不下单卡,这条路不适用,应查看同一文档中的device_map、Context parallelism 或 Tensor parallelism 小节——它们解决的是显存装不下的问题,与本文目标不同。
准备环境
文档示例在多卡 CUDA 环境上运行(accelerate launch --num_processes=2即使用 2 张 GPU)。先安装 diffusers 与 transformers,再安装 accelerate:
uv pip install diffusers["torch"] transformers uv pip install accelerate这两条命令分别来自 安装文档(pip 安装选项)和分布式推理文档的 Accelerate 小节。
编写分布式推理脚本
脚本包含三个关键点,均按文档 Accelerate 小节的说明实现:
- 初始化
accelerate.PartialState:它负责创建分布式环境,管理进程管理、设备分配与进程协调(process management, device control and distribution, and process coordination)。你不需要手动计算 rank 或 world_size。 - 把 pipeline 移到
distributed_state.device:这一步为每个进程分配一块 GPU,即pipeline.to(distributed_state.device)。 - 用
split_between_processes分发提示词:把它作为上下文管理器使用,Accelerate 会自动按进程数切分提示词列表,with块内的prompt就是当前进程分到的那一份。文档中用distributed_state.process_index给每个进程的结果文件命名。
按文档示例拼出的完整脚本如下(模型 ID 与提示词均取自文档示例,实际使用时换成你自己的模型和提示词列表):
import torch from accelerate import PartialState from diffusers import DiffusionPipeline pipeline = DiffusionPipeline.from_pretrained( "Qwen/Qwen-Image", dtype=torch.float16 ) distributed_state = PartialState() pipeline.to(distributed_state.device) with distributed_state.split_between_processes(["a dog", "a cat"]) as prompt: result = pipeline(prompt).images[0] result.save(f"result_{distributed_state.process_index}.png")注意split_between_processes的入参就是完整提示词列表。文档示例传入 2 条提示词,配合--num_processes=2运行时,每个进程分到 1 条。
用 accelerate launch 启动
把脚本保存为run_distributed.py(文档启动命令中使用的文件名),然后执行:
accelerate launch run_distributed.py --num_processes=2文档说明:--num_processes参数用于设置要使用的 GPU 数量。如果你的脚本用了别的文件名,命令中的run_distributed.py相应替换即可。
确认结果
文档代码中每个进程把生成的图片保存为result_{process_index}.png。以上面 2 进程、2 条提示词的示例运行后,预期产物是result_0.png和result_1.png,分别由 0 号和 1 号进程写出——检查这两个文件即是对应的文档示例输出。进程数增多时同理,每个进程各产出自己编号命名的文件。
替代路径:不用 accelerate 的 DDP 写法
同一文档的 PyTorch Distributed 小节给出等价的数据并行示例:手动init_process_group("nccl", rank=rank, world_size=world_size)建进程组,用mp.spawn派生进程,每个进程处理不同提示词,启动命令为:
torchrun --nproc_per_node=2 run_distributed.py如果你不想引入 accelerate 依赖、想自己控制进程组初始化,可以参考该小节;两条路径的并行方式相同(模型全量复制到每张卡、按提示词切分负载)。
边界与限制
- 数据并行不降低单卡显存占用:每张卡都持有完整模型副本,"Best when" 的前提是模型已经放得下。
- 单条提示词延迟保持不变,提升的是总吞吐,不是单图速度。
- 文档中其余策略(
device_map、Context parallelism、Tensor parallelism)面向"模型装不下"的场景,不要与数据并行混用在同一条推理链路上;选型判断以文档 "Choosing a strategy" 小节的对照表为准。
【免费下载链接】diffusers🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考