🤖 AI/ML

ComfyUI

노드 기반 Stable Diffusion 인터페이스

📖 상세 설명

ComfyUI는 Stable Diffusion을 위한 노드 기반 GUI 인터페이스로, 복잡한 이미지 생성 워크플로우를 시각적으로 설계할 수 있습니다. 각 기능이 독립적인 노드로 구성되어 있어 드래그 앤 드롭으로 연결하며, 프롬프트 입력부터 후처리까지 전체 파이프라인을 세밀하게 제어할 수 있습니다.

2023년 초 GitHub에 공개된 ComfyUI는 오픈소스 프로젝트로 시작해 빠르게 성장했습니다. AUTOMATIC1111 WebUI가 간편한 사용성에 집중한 반면, ComfyUI는 고급 사용자를 위한 유연성과 확장성에 초점을 맞췄습니다. 현재 GitHub 스타 5만 개 이상을 기록하며 활발한 커뮤니티를 형성하고 있습니다.

ComfyUI의 핵심 원리는 Dataflow 프로그래밍으로, 데이터가 노드 간 연결을 따라 흐르며 변환됩니다. 체크포인트 로딩, 프롬프트 인코딩, 샘플링, VAE 디코딩 등 각 단계가 독립적 노드로 분리되어 있어 중간 결과를 저장하거나, 여러 모델을 병렬로 실행하거나, 조건부 분기를 설정할 수 있습니다.

실무에서 ComfyUI는 배치 생성 자동화, ControlNet/LoRA 조합 실험, img2img 파이프라인 구축, 영상 프레임 일괄 처리 등에 활용됩니다. 워크플로우를 JSON으로 저장하고 공유할 수 있어 팀 협업에 유리하며, API 서버 모드로 실행하면 외부 시스템과 연동도 가능합니다.

💻 코드 예제

import json
import urllib.request
import urllib.parse

# ComfyUI API 서버 주소
COMFY_API = "http://127.0.0.1:8188"

def queue_prompt(workflow: dict) -> dict:
    """ComfyUI에 워크플로우 실행 요청"""
    data = json.dumps({"prompt": workflow}).encode('utf-8')
    req = urllib.request.Request(
        f"{COMFY_API}/prompt",
        data=data,
        headers={'Content-Type': 'application/json'}
    )
    return json.loads(urllib.request.urlopen(req).read())

# 간단한 txt2img 워크플로우 예시
workflow = {
    "3": {  # KSampler 노드
        "class_type": "KSampler",
        "inputs": {
            "seed": 42,
            "steps": 20,
            "cfg": 7.5,
            "sampler_name": "euler",
            "scheduler": "normal",
            "denoise": 1.0,
            "model": ["4", 0],     # CheckpointLoader 연결
            "positive": ["6", 0],  # CLIP 인코딩 연결
            "negative": ["7", 0],
            "latent_image": ["5", 0]
        }
    },
    "4": {  # 체크포인트 로더
        "class_type": "CheckpointLoaderSimple",
        "inputs": {"ckpt_name": "v1-5-pruned.safetensors"}
    },
    "5": {  # 빈 latent 이미지
        "class_type": "EmptyLatentImage",
        "inputs": {"width": 512, "height": 512, "batch_size": 1}
    },
    "6": {  # 긍정 프롬프트 인코딩
        "class_type": "CLIPTextEncode",
        "inputs": {
            "text": "a beautiful sunset over mountains, highly detailed",
            "clip": ["4", 1]
        }
    }
}

result = queue_prompt(workflow)
print(f"Prompt ID: {result['prompt_id']}")

🗣️ 실무 대화 예시

AI 아트 팀 미팅에서

"A1111보다 ComfyUI가 배치 작업에 훨씬 좋아요. 워크플로우 한번 만들어두면 프롬프트만 바꿔가며 수백 장 자동 생성할 수 있고, ControlNet 여러 개 조합하는 것도 노드 연결만 하면 끝이에요."

기술 블로그에서

"ComfyUI의 장점은 워크플로우 재사용성입니다. JSON으로 내보내서 팀원들과 공유하면 동일한 결과를 재현할 수 있어요. 버전 관리도 가능하고, API 모드로 서비스에 통합하기도 수월합니다."

Discord 커뮤니티에서

"ComfyUI Manager 설치하면 커스텀 노드 관리가 엄청 편해져요. 원클릭으로 노드팩 설치되고, 의존성 충돌도 자동으로 해결해줍니다. 이거 없이 ComfyUI 쓰는 건 비추해요."

⚠️ 주의사항

1
VRAM 관리 필수

복잡한 워크플로우는 VRAM을 빠르게 소진합니다. 모델 언로딩 노드를 적절히 배치하고, 8GB 이하 GPU에서는 --lowvram 옵션으로 실행하세요.

2
노드 버전 호환성

커스텀 노드 업데이트 시 기존 워크플로우가 깨질 수 있습니다. 중요한 프로젝트는 노드 버전을 고정하고, 업데이트 전 백업을 권장합니다.

3
경로 설정 정확히

모델, LoRA, VAE 파일 경로가 정확해야 합니다. extra_model_paths.yaml에서 경로를 설정하고, A1111과 모델 폴더를 공유하면 저장공간을 절약할 수 있습니다.

🔗 관련 용어

📚 더 배우기