🛠️ 在线工具
📰 新闻动态

欢迎回来

登录你的 AI Flow 账号,继续创作之旅

还没有账号?立即注册

创建账号

加入 AI Flow,解锁全部 ComfyUI 教程与工作流

两次输入的密码不一致
验证码错误
已有账号?去登录

dafs

python main.py --lowvram --reserve-vram 

智能模型卸载机制

ComfyUI实现了基于引用计数的模型自动卸载逻辑,当显存不足时会优先卸载未使用的模型:

# 模型卸载实现(comfy/model_management.py L568-595)
def free_memory(memory_required, device, keep_loaded=[]):
    # 按优先级排序可卸载模型
    for x in sorted(can_unload):
        i = x[-1]
        logging.debug(f"Unloading {current_loaded_models[i].model.model.__class__.__name__}")
        if current_loaded_models[i].model_unload(memory_to_free):
            unloaded_model.append(i)

计算加速:从算法到硬件优化

注意力机制优化

ComfyUI提供多种注意力优化选项,可通过命令行启用:

# 注意力优化参数(comfy/cli_args.py L109-114)
attn_group = parser.add_mutually_exclusive_group()
attn_group.add_argument("--use-split-cross-attention", action="store_true", help="使用拆分交叉注意力优化")
attn_group.add_argument("--use-quad-cross-attention", action="store_true", help="使用二次交叉注意力优化")
attn_group.add_argument("--use-pytorch-cross-attention", action="store_true", help="使用PyTorch 2.0交叉注意力")
attn_group.add_argument("--use-flash-attention", action="store_true", help="使用FlashAttention")

Nvidia用户推荐启用xFormers加速:

python main.py --xformers

AMD用户(ROCm 6.4+)可启用PyTorch内置优化:

python main.py --use-pytorch-cross-attention

混合精度计算

通过调整模型精度可显著提升速度并降低显存占用:

# 精度设置参数(comfy/cli_args.py L63-70)
fpunet_group.add_argument("--fp16-unet", action="store_true", help="UNet使用FP16")
fpunet_group.add_argument("--bf16-unet", action="store_true", help="UNet使用BF16")
fpunet_group.add_argument("--fp8_e4m3fn-unet", action="store_true", help="UNet权重使用FP8")

推荐配置(Nvidia Ada Lovelace及以上):

python main.py --fp16-unet --bf16-vae --fp8_e4m3fn-text-enc

多GPU部署:设备管理与负载均衡

设备检测与配置

ComfyUI支持多种计算设备,包括Nvidia GPU、AMD GPU、Intel XPU等:

# 设备检测逻辑(comfy/model_management.py L169-188)
def get_torch_device():
    if directml_enabled:
        return directml_device
    if cpu_state == CPUState.MPS:
        return torch.device("mps")
    if cpu_state == CPUState.CPU:
        return torch.device("cpu")
    else:
        if is_intel_xpu():
            return torch.device("xpu", torch.xpu.current_device())
        elif is_ascend_npu():
            return torch.device("npu", torch.npu.current_device())
        elif is_mlu():
            return torch.device("mlu", torch.mlu.current_device())
        else:
            return torch.device(torch.cuda.current_device())

多GPU配置方法

虽然ComfyUI目前未实现自动多GPU负载均衡,但可通过环境变量和命令行参数指定设备:

  1. 指定主GPU:
CUDA_VISIBLE_DEVICES=0 python main.py --highvram
const greeting = "Hello World"; console.log(greeting); // 打印问候语
if(!defined('InEmpireCMS')) { exit(); } session_start(); //------------------ 参数开始 ------------------ //应用的APPID $app_id=$appr[$ss]; //应用的APPKEY $app_secret=$appr['appkey']; //成功授权后的回调地址 $my_url=$ReturnUrlQz."e/memberconnect/qq/loginend.php"; //------------------ 参数结束 ------------------ //state参数用于防止CSRF攻击,成功授权后回调时会原样带回 $_SESSION['state']=md5(uniqid(rand(),TRUE)); //拼接URL $gotologinurl="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&state=".$_SESSION['state'];
def hello_python(): print("Hello Python") # 默认按 Python 高亮

ComfyUI 是目前最灵活的 Stable Diffusion 图形界面之一,它采用节点式工作流设计,让你可以像搭积木一样自由组合各种 AI 处理模块。很多新手初次打开 ComfyUI 时会被满屏的节点和连线劝退,但其实只要理解了核心概念,搭建一个基础的文生图工作流只需要 5 个关键节点。

本教程将带你从零开始,一步步搭建出你的第一个 ComfyUI 文生图工作流,并详细解释每个节点的作用与参数含义。

💡
前置要求

请确保你已经成功安装了 ComfyUI 并能正常启动。如果尚未安装,请先阅读我们的 环境搭建教程。

一、理解核心概念

在动手之前,我们需要了解 ComfyUI 工作流的三个核心要素:

  • 节点(Node):每个节点代表一个独立的功能单元,如加载模型、编写提示词、采样生成等。
  • 连线(Link):节点之间通过彩色连线传递数据,颜色对应数据类型(如黄色=MODEL、紫色=LATENT、绿色=CONDITIONING)。
  • 执行顺序:ComfyUI 会根据连线关系自动推导执行顺序,无需手动排列。
ComfyUI 节点工作流示意图
图 1:ComfyUI 节点式工作流的基本组成结构

二、五个关键节点详解

一个最基础的文生图工作流由以下 5 个节点组成:

2.1 Load Checkpoint(加载模型)

这是整个工作流的起点,负责加载 Stable Diffusion 的权重文件(.safetensors 或 .ckpt)。该节点会输出三个接口:

  • MODEL:UNet 扩散模型,用于实际的图像去噪生成
  • CLIP:文本编码器,将你的提示词转换为模型可理解的向量
  • VAE:变分自编码器,负责潜空间与像素空间之间的转换

2.2 CLIP Text Encode(提示词编码)

你需要创建两个此节点,分别用于正向提示词(你想要的画面)和反向提示词(你不希望出现的元素)。它们接收 CLIP 输入,输出 CONDITIONING 数据。

2.3 Empty Latent Image(空白潜空间图像)

设置生成图片的尺寸(如 512×512、768×768)和批量大小。该节点输出一张纯噪声的潜空间图像作为采样的起点。

2.4 KSampler(K 采样器)

这是工作流的核心引擎,接收 MODEL、正向/反向 CONDITIONING 和 LATENT 四个输入,通过迭代去噪生成最终结果。关键参数包括:

  • seed:随机种子,决定生成结果的可复现性
  • steps:采样步数,越高细节越丰富但耗时更长
  • cfg:提示词引导系数,建议 7~12 之间
  • sampler_name:采样算法,推荐 euler_a 或 dpmpp_2m
  • scheduler:调度器,通常选 normal
  • denoise:去噪强度,文生图设为 1.0

2.5 VAE Decode(VAE 解码)

将 KSampler 输出的潜空间结果解码回像素图像,得到最终的 PNG/JPG 图片。

⚠️
常见错误

如果生成结果全黑或全灰,通常是 VAE Decode 节点的 VAE 输入未正确连接,或者加载的 Checkpoint 不包含内置 VAE。请检查连线是否完整。

三、通过 Python API 调用工作流

除了 GUI 操作,ComfyUI 还提供了 REST API,方便你用 Python 脚本批量提交生成任务。以下是完整的 API 调用示例:

import json
import urllib.request

# ComfyUI API 地址
COMFYUI_URL = "http://127.0.0.1:8188/prompt"

# 定义工作流 JSON(简化版文生图)
workflow = {
    "3": {
        "class_type": "KSampler",
        "inputs": {
            "seed": 42,
            "steps": 20,
            "cfg": 8.0,
            "sampler_name": "euler_a",
            "scheduler": "normal",
            "denoise": 1.0,
            "model": ["4", 0],
            "positive": ["6", 0],
            "negative": ["7", 0],
            "latent_image": ["5", 0]
        }
    },
    "4": {
        "class_type": "CheckpointLoaderSimple",
        "inputs": {
            "ckpt_name": "v1-5-pruned.safetensors"
        }
    },
    "5": {
        "class_type": "EmptyLatentImage",
        "inputs": {
            "width": 512,
            "height": 512,
            "batch_size": 1
        }
    },
    "6": {
        "class_type": "CLIPTextEncode",
        "inputs": {
            "text": "beautiful landscape, sunset, mountains",
            "clip": ["4", 1]
        }
    },
    "7": {
        "class_type": "CLIPTextEncode",
        "inputs": {
            "text": "blurry, low quality, watermark",
            "clip": ["4", 1]
        }
    },
    "8": {
        "class_type": "VAEDecode",
        "inputs": {
            "samples": ["3", 0],
            "vae": ["4", 2]
        }
    },
    "9": {
        "class_type": "SaveImage",
        "inputs": {
            "filename_prefix": "ComfyUI_Output",
            "images": ["8", 0]
        }
    }
}

# 发送请求到 ComfyUI
payload = json.dumps({"prompt": workflow}).encode("utf-8")
req = urllib.request.Request(
    COMFYUI_URL,
    data=payload,
    headers={"Content-Type": "application/json"}
)
response = urllib.request.urlopen(req)
print(json.loads(response.read()))

上述代码中,每个数字键("3"、"4"...)代表一个节点 ID,class_type 指定节点类型,inputs 中的数组引用格式 ["节点ID", 输出索引] 表示连线关系。

四、自定义节点开发入门

如果现有节点无法满足需求,你可以编写自定义节点。以下是一个最简单的自定义节点模板:

# custom_nodes/my_custom_node.py

class MyCustomNode:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "image": ("IMAGE",),
                "brightness": ("FLOAT", {
                    "default": 1.0,
                    "min": 0.0,
                    "max": 3.0,
                    "step": 0.05
                }),
            }
        }

    RETURN_TYPES = ("IMAGE",)
    FUNCTION = "adjust_brightness"
    CATEGORY = "MyCustomNodes"

    def adjust_brightness(self, image, brightness):
        # image 是 torch.Tensor, shape: [B, H, W, C]
        result = (image * brightness).clamp(0.0, 1.0)
        return (result,)

# 注册节点映射
NODE_CLASS_MAPPINGS = {
    "MyCustomBrightness": MyCustomNode
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "MyCustomBrightness": "亮度调节 🔆"
}

将上述文件放入 ComfyUI/custom_nodes/ 目录,重启 ComfyUI 后即可在右键菜单的 MyCustomNodes 分类下找到「亮度调节 🔆」节点。

💡
调试技巧

开发自定义节点时,建议使用 python main.py --listen 启动 ComfyUI,这样修改代码后只需刷新浏览器即可看到变化,无需完全重启。

五、总结与下一步

恭喜你!到这里你已经掌握了 ComfyUI 基础工作流的全部核心知识。让我们回顾一下要点:

  1. ComfyUI 的核心是节点 + 连线的数据流模型
  2. 文生图最少需要 5 个节点:Load Checkpoint → CLIP Encode ×2 → Empty Latent → KSampler → VAE Decode
  3. 可以通过 Python API 实现自动化批量生成
  4. 自定义节点扩展了 ComfyUI 的无限可能性
AI 生成示例作品
图 2:使用本教程基础工作流生成的 AI 风景画作品

接下来推荐你学习以下内容来进一步提升:

「ComfyUI 的学习曲线虽然陡峭,但一旦跨过门槛,你会发现它比任何 WebUI 都更强大、更自由。」—— 社区创作者 @PixelDreamer