ComfyUI_stable_fast
stable-fast和TensorRT的实验性使用。
[!注意]
官方TensorRT节点 https://github.com/comfyanonymous/ComfyUI_TensorRT
本仓库仍处于实验阶段,只是想尝试不需要重复编译的TensorRT。
更新
- 2024-07-31:不幸的是,在不同模型上使用相同的引擎会导致结果略有变化或完全无法使用。添加了一个选项,允许为不同模型构建专用引擎。然而,某些模型的输出仍与PyTorch有所不同。
- 2024-07-29:在PyTorch 2.4.0上,当存在引擎缓存时,显著提高了TensorRT模型启动和切换的性能。添加了WEIGHT_STREAMING支持,您可以在6GB设备上运行SDXL与TensorRT。但是,VAE解码导致的引擎卸载可能会大大降低整体生成速度。
安装
git clone https://github.com/gameltb/ComfyUI_stable_fast custom_nodes/ComfyUI_stable_fast
stable-fast
您需要按照以下指南启用stable fast节点。
[!注意]
需要stable-fast >= 1.0.0。
TensorRT(测试中)
[!注意]
目前仅在Linux上测试过,未在Windows上测试。
使用TensorRT时需要安装以下内容。
pip install onnx zstandard onnxscript --upgrade
pip install --pre --upgrade --extra-index-url https://pypi.nvidia.com tensorrt==10.2.0
pip install onnx-graphsurgeon polygraphy --extra-index-url https://pypi.ngc.nvidia.com
使用方法
请参考截图
stable-fast
它可以与Lora、ControlNet和lcm一起工作。支持SD1.5和SSD-1B。SDXL应该可以工作。
使用--disable-cuda-malloc
运行ComfyUI可能可以进一步优化速度。
[!注意]
- FreeU和PatchModelAddDownscale现在已经实验性支持,只需正常使用comfy节点即可。
- stable fast与accelerate配合不佳,因此当显存较低时此节点无效。例如:6G显存卡运行SDXL。
- stable fast在第二次使用相同模型生成图像时会优化速度。如果您经常切换模型或Lora,请考虑禁用enable_cuda_graph。
- 最好将
Apply StableFast Unet
节点直接连接到KSampler
节点,它们之间不应该有会改变权重的节点,比如Load LoRA
节点,但对于某些节点,将其放在它们之间可以防止因修改节点参数而导致的无用重编译,比如FreeU
节点,您可以尝试使用其他节点,但我不能保证它会正常工作。
TensorRT
使用--disable-xformers --force-fp16 --fp16-vae
运行ComfyUI,并像使用Apply StableFast Unet
一样使用Apply TensorRT Unet
。
引擎将被缓存在tensorrt_engine_cache
中。
[!注意]
- 如果更新后遇到错误,可以尝试删除
tensorrt_engine_cache
。
Apply TensorRT Unet节点
- enable_cuda_graph
- 无论是否使用CUDA Graph,这都应该使其稍微更快,但目前实现存在问题,所以没有效果。此外,即使它能工作,也无法与WEIGHT_STREAMING一起使用。
- patch_type
UNET
将整个unet编译为一个模型,速度更快。然而,由于TensorRT不支持PyTorch中的某些操作,如FreeU节点,一些节点无法使用。另外,如果你没有足够的显存来放置整个模型,你需要选择这个选项来使用TensorRT,否则可能会比直接运行更慢。UNET_BLOCK
将unet拆分成几个小模型,以允许pytorch在它们之间执行TensorRT不支持的操作。编译和加载需要相当长的时间,但完成速度与UNET
相比并不相差太多。大多数情况下使用这个选项可能不太可取。
- keep_width
- keep_height
- keep_batch_size
- keep_embedding_block
- 上面以
keep_
开头的参数用于构建引擎时,它们指定了引擎接受的参数的最大值。同时,节点会根据这些值查找缓存的引擎,所以如果你想尽可能少地构建引擎,请根据不同类型的模型(如sd15或sdxl)保持一组固定的值。如果你使用的某个参数大于它们,就会触发构建。embedding_block与你的提示词长度有关,长度越长,值越大。
- 上面以
- use_dedicated_engine
- 为不同的模型构建专用引擎。
当你使用ControlNet时,不同的控制图像大小目前会导致引擎重新编译。
表格
特性
Stable Fast | TensorRT(UNET) | TensorRT(UNET_BLOCK) | |
---|---|---|---|
SD1.5 | ✓ | ✓ | ✓ |
SDXL | 未测试(应该可用) | ✓ | 未测试 |
SSD-1B | ✓ | ✓ | ✓ |
Lora | ✓ | ✓ | ✓ |
ControlNet Unet | ✓ | ✓ | ✓ |
VAE 解码 | 进行中 | ✓ | - |
ControlNet 模型 | 进行中 | 进行中 | - |
已测试节点
Stable Fast | TensorRT(UNET) | TensorRT(UNET_BLOCK) | |
---|---|---|---|
加载 LoRA | ✓ | ✓ | ✓ |
FreeU(FreeU_V2) | ✓ | ✗ | ✓ |
PatchModelAddDownscale | ✓ | 进行中 | ✓ |
速度测试
GeForce RTX 3060 移动版
GeForce RTX 3060 移动版 (80W) 6GB, Linux, torch 2.1.1, stable fast 0.0.14, tensorrt 9.2.0.post12.dev5, xformers 0.0.23.
工作流程: SD1.5, 512x512 批次大小 1, euler_ancestral karras, 20 步, 使用 fp16.
测试 Stable Fast 和 xformers 时使用 --disable-cuda-malloc
运行 ComfyUI。
测试 TensorRT 和 pytorch 时使用 --disable-xformers
运行 ComfyUI。
TensorRT 注意事项
对于 TensorRT 首次启动,构建引擎可能需要长达 10 分钟;使用时间缓存后,将减少到约 2-3 分钟;使用引擎缓存后,目前将减少到约 20-30 秒。
平均迭代速度
Stable Fast (enable_cuda_graph) | TensorRT (UNET) | TensorRT (UNET_BLOCK) | pytorch cross attention | xformers | |
---|---|---|---|---|---|
10.10 it/s | 10.95it/s | 10.66it/s | 7.02it/s | 7.90it/s | |
启用 FreeU | 9.42 it/s | ✗ | 10.04it/s | 6.75it/s | 7.54it/s |
启用 Patch Model Add Downscale | 10.81 it/s | ✗ | 11.30it/s | 7.46it/s | 8.41it/s |
平均耗时
工作流程 | Stable Fast (启用 cuda_graph) | TensorRT (UNET) | TensorRT (UNET_BLOCK) | PyTorch 交叉注意力 | xformers |
---|---|---|---|---|---|
2.21秒 (首次17秒) | 2.05秒 | 2.10秒 | 3.06秒 | 2.76秒 | |
启用 FreeU | 2.35秒 (首次18.5秒) | ✗ | 2.24秒 | 3.18秒 | 2.88秒 |
启用补丁模型添加下采样 | 2.08秒 (首次31.37秒) | ✗ | 2.03秒 | 2.89秒 | 2.61秒 |
截图