ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ComfyUI_TensorRT 随机出黑图?原来是 CUDA 流没同步

ComfyUI_TensorRT 随机出黑图?原来是 CUDA 流没同步 ComfyUI_TensorRT 随机出黑图原来是 CUDA 流没同步【免费下载链接】ComfyUI_TensorRT项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_TensorRT最近在 ComfyUI 里挂上 ComfyUI_TensorRT 节点想把显卡性能榨干结果 SD1.5 的动态引擎跑着跑着开始抽风同一套工作流有时出图正常有时直接给我一张纯黑的图刷新几次还能好纯看运气。终端里还飘着一行RuntimeWarning: invalid value encountered in castcast 就是类型转换意思是转成图片时数据已经烂了。最坑的是它不固定复现batch 调大调小、换个 prompt 都可能中招社区里也有不少人反馈了同样的情况。排查过程先怀疑 CFG 和批处理结果白忙一场第一反应是配置问题。我把 CFG即 Classifier-Free Guidance引导强度调回 1黑图确实消失了——但图也糊得没法看等于没修。又去折腾批处理把 batch 从 8 一路降到 1、2黑图变少了却没能绝迹。这一步反而帮我们排除了纯参数填错的嫌疑不是某个数值不对而是代码本身偶尔会算出脏数据。invalid value 警告到底卡在哪一步回到那行invalid value encountered in cast。cast 是类型转换说明模型算出来的 latent潜空间张量里混进了 NaN一个不存在的数等转成 8 位像素时就全废了。所以问题不在保存图片环节而在更早的推理环节UNet 前向传播输出的张量本身就不干净。我顺着 ComfyUI 的调用链往回走最后把目光锁定在 tensorrt_loader.py 里的TrTUnet——正是它负责把 PyTorch 张量喂给 TensorRT 引擎。翻到源码才发现是 CUDA 流没对齐打开 tensorrt_loader.py 一看TrTUnet在初始化时自己new了一条私有的torch.cuda.Stream()推理时让 TensorRT 在这条私有流上异步执行最后才同步一次。坑就在这输入张量x、context 这些是在 PyTorch 的默认流上准备好的而 TensorRT 却在另一条流上跑两条流之间没有任何事件event来保证先后顺序。于是出现竞态——私有流很可能在默认流还没把输入算完时就去读读到的就是还没就绪的脏内存输出自然带 NaN。这也解释了为什么是随机黑图全看 GPU 上两条流谁快谁慢时好时坏。修复与验证作者后来在 commit41e28c6提交信息就叫 Fix issue with black images.里把这条私有流直接干掉了改成用torch.cuda.default_stream(x.device)——也就是让 TensorRT 和 PyTorch 共用默认流。输入准备和引擎执行天然在同一个队列里排队竞态随之消失。核心改动就在 tensorrt_loader.py 的__call__方法里只有三行删掉私有 Stream、改用默认流、在默认流上同步。升级之后再跑SD1.5 和 SDXL 两个模型分别用 batch 1、2、4、8 各压了几轮终端那行invalid value再没冒出来出图全程正常之前时灵时不灵的随机黑图也彻底没了。避坑清单✅ 升级 ComfyUI_TensorRT 后先清掉旧的 .engine 缓存用动态引擎重新 build 一遍再出图。⚠️ 看到invalid value encountered in cast别急着怪 VAE那是张量里已经有 NaN要往推理上游查。批处理尽量取引擎 opt 参数能整除的 batch别用超出 max 的 batch 逼它强行拆分。验证修复时固定 seed同一个 prompt 连跑 20 次比只跑一次更能暴露随机性问题。换 TensorRT / CUDA 大版本后建议重新 build 引擎避免旧 kernel 的数值行为漂移。【免费下载链接】ComfyUI_TensorRT项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_TensorRT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表