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
相关产品推荐
相关产品推荐

