【A卡/ROCm】7900 XTX 跑 ComfyUI 启用 SageAttention 出黑图 (NaN) 修复指南
-
【A卡/ROCm】7900 XTX 跑 ComfyUI 启用 SageAttention 出黑图 (NaN) 修复指南
本篇指南记录了在 AMD Radeon RX 7900 XTX (RDNA3 / gfx1100) 显卡、Ubuntu/Linux (ROCm 7.x + PyTorch 2.x) 环境下,运行 ComfyUI 启用 SageAttention (v1.0.6) 导致生成图片“全黑(无报错静默失败)”的硬核排障过程与解决方案。
如果你也遇到了开加速器必黑图、关掉就正常的灵异事件,本篇笔记能帮你彻底解决。
我们的软硬件测试环境为便于对比排查,以下是本案所处的真实软硬件基础环境:
- GPU: AMD Radeon RX 7900 XTX (24GB GDDR6 / RDNA3 / gfx1100)
- CPU: 双路 Intel Xeon E5-2682 v4
- 内存: 64GB DDR4 REG ECC (全插满)
- 操作系统: Ubuntu (Kernel 5.15.0-181-generic)
- ROCm 运行环境:
torch 2.12.0+rocm7.2 - SageAttention 库版本:
1.0.6(纯 Triton JIT 动态编译版) - ComfyUI 版本: v0.24.0 (机智罗 A 卡专用整合版)
背景与受影响工作流在运行以下针对 AMD 优化的 ComfyUI 整合包(如机智罗 A 卡专用包)工作流时极易触发此问题:
- 机智罗 44号工作流(基于 Qwen-Image / Flux 架构的 GGUF 混合多模态工作流)
- 机智罗 14号工作流(Wan2.2 视频生成工作流,大分辨率开启 SageAttention 加速时)
故障现象- 表现:当且仅当在工作流中接入
XB_SageAttentionAccelerator(SageAttention 算子加速器) 节点时,最终输出的图片(或视频帧)100% 是一片漆黑。 - 控制台警告:生图结束、准备输出图像的瞬间,终端会静默弹出一行 RuntimeWarning,没有其他任何 CUDA/ROCm 崩溃堆栈:
/home/peter/ComfyUI/nodes.py:1657: RuntimeWarning: invalid value encountered in cast img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
硬核根因分析通过拉取并审计 SageAttention (v1.0.6) 在 Linux AMD 环境下的底层源码,揪出了以下两个核心冲突:
1. 累加精度不足导致数值溢出(NaN)
目前 pip 直接安装的 SageAttention 1.0.6 是纯 Triton JIT 编译版本(无预编译
.so),它在 GPU 运行时动态编译 attention kernel。
在其attn_qk_int8_per_block.py源码中,矩阵乘法累加计算硬编码为:acc += tl.dot(p, v, out_dtype=tl.float16) # 默认使用半精度累加在 AMD RDNA3 (7900 XTX) 的 Triton 编译器后端上,半精度累加在长序列或特定激活值下极易发生数值精度溢出,产生大量 NaN(非数)。
NaN 顺着 KSampler 扩散到整个 latent,最终 VAE 解码时把 NaN 全部强制截断为0,导致最终渲染出来的图片全黑。2. Shared Memory 硬件超限
原版 SageAttention 的 block 大小硬编码为
BLOCK_M=128, BLOCK_N=64,这在编译时需要约 106KB 的 Shared Memory(共享内存)。
而 AMD RDNA3 显卡(7900 XTX)的物理 Shared Memory 单个 Workgroup 上限只有 65KB,这会导致 Triton 编译器在分配寄存器和共享内存时崩溃,或发生隐式内存回滚,进一步拉低速度并加剧精度混乱。
️ 终极解决方案(手动打补丁)既然知道了是因为 “Shared Memory 超限” 和 “Triton 浮点累加溢出”,解决办法就是给 SageAttention 的 python 库手动替换补丁文件。
第一步:定位 SageAttention 库路径
在你的 ComfyUI 运行虚拟环境(venv)下,找到
sageattention包的实际安装路径:source /home/peter/ComfyUI/venv/bin/activate SA_DIR=$(python3 -c 'import sageattention, os; print(os.path.dirname(sageattention.__file__))') echo "你的包路径在: $SA_DIR"第二步:备份原始文件(安全第一)
cp $SA_DIR/attn_qk_int8_per_block.py $SA_DIR/attn_qk_int8_per_block.py.bak cp $SA_DIR/attn_qk_int8_per_block_causal.py $SA_DIR/attn_qk_int8_per_block_causal.py.bak cp $SA_DIR/quant_per_block.py $SA_DIR/quant_per_block.py.bak第三步:下载并覆盖 Zluda-AMD 优化版补丁
使用社区(来自
patientx/ComfyUI-Zluda)针对 AMD 显卡优化过的 Triton 参数补丁,直接覆盖本地文件:BASE_URL='https://raw.githubusercontent.com/patientx/ComfyUI-Zluda/refs/heads/master/comfy/customzluda/sa' curl -fsSL $BASE_URL/attn_qk_int8_per_block.py -o $SA_DIR/attn_qk_int8_per_block.py curl -fsSL $BASE_URL/attn_qk_int8_per_block_causal.py -o $SA_DIR/attn_qk_int8_per_block_causal.py curl -fsSL $BASE_URL/quant_per_block.py -o $SA_DIR/quant_per_block.py第四步:清空 Triton 缓存(核心步骤)
为了让刚刚覆盖的补丁生效,必须清空 Triton 之前的旧编译缓存,强迫它在下次启动时重新编译 kernel:
rm -rf ~/.triton/cache
补丁到底改了什么?out_dtype: tl.float16➔tl.float32:累加矩阵全部改用 Float32 全精度。这一步彻底消灭了 A 卡上的精度溢出,是解决黑图(NaN)的核心!BLOCK_M=128, BLOCK_N=64➔BLOCK_M=32, BLOCK_N=16:将 Block 大小缩到极小。这使得单个 Workgroup 占用的 Shared Memory 从 106KB 暴降到 ~8KB,完美躲开 gfx1100 显卡的 65KB 硬件上限。- 引入 Autotune(自动寻优):新增了对
qo_len、kv_len、h_qo的 Triton 动态 autotune 查找,网卡会根据你的生成分辨率自动寻找效率最高的线程分配方案,不再死板硬编码。
🧪 验证与收尾
-
导入冒烟测试:
在命令行运行以下测试代码,确认没有 NaN 且有数据输出:python3 -c " import torch, sageattention from sageattention import sageattn q = torch.randn(1, 16, 256, 128, dtype=torch.float16, device='cuda') k = torch.randn(1, 16, 256, 128, dtype=torch.float16, device='cuda') v = torch.randn(1, 16, 256, 128, dtype=torch.float16, device='cuda') out = sageattn(q, k, v, tensor_layout='HND') print('是否有NaN:', torch.isnan(out).any().item()) print('是否全为零:', (out == 0).all().item()) " # 输出:是否有NaN: False,是否全为零: False ➔ ✅ 算法通路畅通! -
重新运行 ComfyUI:
重启你的 ComfyUI 进程,在网页上接回并点亮XB_SageAttentionAccelerator节点,重新点击“Queue Prompt”。生图不仅完全恢复了色彩,而且由于 Triton 自动寻优,7900 XTX 终于能满血享受 SageAttention 带来的显存带宽减半与推理无痛加速了!


一开始agent建议我直接bypass掉


终于判断出来问题所在

解决方案出来了

测试成功

-
,
T terry 固定了此主题
-
,系统 取消固定了此主题
谢谢支持,然而我只是工程狗,只是一个从小学开始就喜欢折腾电脑的大叔而已拉
谢谢站长~




多加幾把風扇吧