AttributeError: ‘NoneType’ object has no attribute ‘ndim’ when using num_images_per_prompt with batched prompts

该报错通常出现在 StableDiffusion3Pipeline 同时满足“批量 prompt(列表)+ 显式传入 num_images_per_prompt”时;根据 Issue 中的复现,真正触发崩溃的关键操作可能是调用了 pipe.transformer.fuse_qkv_projectio

快速结论:该报错通常出现在 StableDiffusion3Pipeline 同时满足“批量 prompt(列表)+ 显式传入 num_images_per_prompt”时;根据 Issue 中的复现,真正触发崩溃的关键操作可能是调用了 pipe.transformer.fuse_qkv_projections(),而不是 num_images_per_prompt 本身。

适用环境:diffusers 0.36.0、torch 2.8、Python 3.12、CUDA、Linux、StableDiffusion3Pipeline;未使用 prompt_embeds、自定义 embeddings 或 LoRA。

最快修复方案:Issue 中验证过:移除 pipe.transformer.fuse_qkv_projections() 后推理恢复正常。可优先尝试不调用该融合优化。

注意事项:该结论来自单个 Issue 的复现,官方未给出正式修复;如果必须使用 fuse_qkv_projections 优化,该问题可能仍然存在,需要等待上游修复或改用未融合路径。

问题场景

使用 StableDiffusion3Pipeline 加载 stabilityai/stable-diffusion-3-medium,以批量 prompt(prompt 为字符串列表)进行推理,并显式传入 num_images_per_prompt(即使值为 1)时触发崩溃。多个用户报告在未使用 num_images_per_prompt、单 prompt 推理或改用 SDXL、SD1.x、FLUX 等其他 pipeline 时不出现该问题。

Issue 评论进一步确认:只要调用了 pipe.transformer.fuse_qkv_projections(),即使保留批量 prompt 和 num_images_per_prompt=1,也会复现;移除 fuse_qkv_projections() 后推理正常。

报错原文

AttributeError: 'NoneType' object has no attribute 'ndim'

ERROR: <class 'AttributeError'>
Traceback (most recent call last):
  File "diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3.py", line 1064, in __call__
    noise_pred = self.transformer(
  File "diffusers/models/transformers/transformer_sd3.py", line 327, in forward
    encoder_hidden_states, hidden_states = block(
  File "diffusers/models/attention.py", line 715, in forward
    attn_output2 = self.attn2(hidden_states=norm_hidden_states2, **joint_attention_kwargs)

原因分析

根据 Issue 讨论,崩溃与 StableDiffusion3Pipeline 内部的 prompt/embedding 处理以及 transformer 的 QKV 投影融合有关。调用 pipe.transformer.fuse_qkv_projections() 后,批量 prompt 与 num_images_per_prompt 组合会让 attention 模块中的某个张量为 None,随后在 ndim 属性访问时抛出 AttributeError。具体是 pipeline 侧参数传递还是融合后 attention 前向逻辑的问题,Issue 中没有明确结论,属于可能原因。

环境排查

  • 确认 diffusers 版本是否为 0.36.0。
  • 确认 torch 版本是否为 2.8。
  • 确认 Python 版本是否为 3.12。
  • 确认运行设备为 CUDA,操作系统为 Linux。
  • 确认是否调用 pipe.transformer.fuse_qkv_projections()。
  • 确认是否使用批量 prompt,以及是否显式传入 num_images_per_prompt。
  • 确认是否使用 prompt_embeds、自定义 embeddings 或 LoRA;Issue 报告中这些均未使用。

解决步骤

  1. 检查推理脚本中是否包含 pipe.transformer.fuse_qkv_projections()。
  2. 如果包含,先移除该调用,保持其他参数不变。
  3. 重新以批量 prompt 和 num_images_per_prompt=1 运行最小复现代码,确认推理是否恢复正常。
  4. 如果移除后仍报错,再尝试暂时省略 num_images_per_prompt,确认是否与参数显式传入有关。
  5. 如果必须使用 QKV 融合优化,可关注 huggingface/diffusers #12895 的后续状态,或改用未融合路径。

验证方法

用批量 prompt 和 num_images_per_prompt=1 重新调用 StableDiffusion3Pipeline,观察是否仍抛出 AttributeError: 'NoneType' object has no attribute 'ndim';若不再报错并正常返回 images,说明问题已绕过。

参考来源

huggingface/diffusers #12895

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27283

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注