Paperspace Ubuntu虚拟机部署带xformers的Stable Diffusion遇 dtype不匹配错误
解决Stable Diffusion中attn_mask与query dtype不匹配问题
问题核心是注意力掩码attn_mask的浮点类型与查询张量query的BFloat16类型不兼容,提供三种可行解决方法:
方法一:修改OpenCLIP的注意力掩码类型
找到路径/home/paperspace/anaconda3/envs/ldm/lib/python3.10/site-packages/open_clip/transformer.py,修改attention函数,在传入掩码前强制转换为与查询张量一致的类型:
def attention(self, q_x, k_x=None, v_x=None, attn_mask=None): if k_x is None: k_x = q_x if v_x is None: v_x = q_x # 添加类型转换代码 if attn_mask is not None: attn_mask = attn_mask.to(q_x.dtype) return self.attn( q_x, k_x, v_x, need_weights=False, attn_mask=attn_mask )[0]
方法二:禁用自动混合精度运行
直接在生成命令中添加--no-half参数,强制模型使用float32精度运行,避免类型差异:
python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt model/768-v-ema.ckpt --config configs/stable-diffusion/v2-inference-v.yaml --H 768 --W 768 --no-half
方法三:修改PyTorch注意力函数(临时应急)
如果你之前已经修改了torch/nn/functional.py,可以在multi_head_attention_forward函数中,调用scaled_dot_product_attention前添加类型转换:
# 在attn_output = scaled_dot_product_attention(...)之前添加 if attn_mask is not None: attn_mask = attn_mask.to(q.dtype)
额外提示:检查xformers与PyTorch版本兼容性,你当前用的PyTorch 11.7建议搭配xformers 0.0.17或0.0.18版本,避免版本冲突引发异常。
内容的提问来源于stack exchange,提问作者rhJura
相关产品推荐
相关产品推荐

