You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

StableDiffusionPipeline批量生成图像返回黑图的原因问询

M2 Mac上Stable Diffusion批量生成图像异常的原因

你遇到的问题是Apple Silicon的MPS后端与Diffusers库批量张量处理逻辑的兼容性bug,具体原因如下:

  • MPS内存缓存的张量残留问题
    当使用批量prompt或num_images_per_prompt参数时,StableDiffusionPipeline会复用内部的张量缓冲区以提升效率,但MPS后端在连续处理批量请求时,没有正确清空或重新初始化部分中间张量(比如初始噪声张量、注意力层的缓存数据)。这些残留的垃圾数据被带入后续图像生成流程,最终导致输出黑块或随机噪点。而循环单次调用pipe时,每次都会重新初始化所有张量,避开了残留问题,所以生成正常。

  • 注意力切片与MPS的兼容性冲突
    你启用了pipe.enable_attention_slicing()来节省内存,但这个功能的切片逻辑在MPS后端的批量处理场景下,会干扰张量的内存分配与释放流程,进一步加剧了数据异常的概率。

  • 批量生成的底层逻辑共性
    无论是传入重复prompt的列表,还是设置num_images_per_prompt,底层都使用同一套批量张量处理流程,因此都会触发上述MPS后端的bug。

你的循环单次调用的代码是目前避开这个问题的有效临时方案,直到Diffusers库针对Apple Silicon的批量处理逻辑完成修复。

异常代码示例:

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipe = pipe.to("mps")  # for M1/M2 chips
pipe.enable_attention_slicing()

prompt = "a photo of an astronaut driving a car on mars"

# First-time "warmup" pass (because of weird M1 behaviour)
_ = pipe(prompt, num_inference_steps=1)

# generate images
n_imgs = 1
imgs = pipe([prompt] * n_imgs).images

正常运行的循环代码示例:

# generate images
n_imgs = 3
for i in range(n_imgs):
    img = pipe(prompt).images[0]
    # do something with img

内容的提问来源于stack exchange,提问作者Neele22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:25:46