- Published on
ComfyUI 느릴 때 - CUDA VRAM·타일링 최적화
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
ComfyUI로 Stable Diffusion을 돌리다 보면, 같은 프롬프트·같은 체크포인트인데도 어느 순간부터 워크플로우가 눈에 띄게 느려지거나, GPU 사용률이 들쭉날쭉해지고, VRAM이 꽉 차면서 스왑처럼 버벅이는 상황을 자주 만납니다. 특히 고해상도, 업스케일, ControlNet, 여러 LoRA, 디테일러(ADetailer 계열)까지 얹으면 “느림”의 원인이 하나가 아니라 여러 병목이 연쇄적으로 발생합니다.
이 글은 ComfyUI 워크플로우가 느릴 때를 다음 3가지 축으로 나눠 접근합니다.
- CUDA 및 VRAM 관점: VRAM이 부족해지는 순간부터 속도는 급격히 무너집니다.
- 타일링 관점: 타일링은 만능이 아니라, 설정에 따라 오히려 더 느려질 수 있습니다.
- 워크플로우 관점: 노드 구성과 배치 전략이 병목을 만들기도 합니다.
1) 먼저 “느림”을 분류하자: 증상별 원인 맵
ComfyUI 성능 이슈는 대체로 아래 증상 중 하나로 나타납니다.
GPU 사용률이 0~100%로 요동친다
- GPU가 계산을 못 해서가 아니라, CPU 준비 작업(전처리, 디코딩, VAE, ControlNet 입력 생성) 또는 메모리 할당/해제에 발목 잡히는 경우가 많습니다.
- VRAM이 꽉 차서 프레임워크가 메모리 재배치를 반복하면 사용률이 출렁입니다.
특정 단계에서만 유독 느리다
- 샘플링은 빠른데 VAE Decode에서 멈춘다: VAE가 CPU로 떨어졌거나, 타일 VAE 설정이 과합니다.
- 업스케일에서만 느리다: 타일 크기/오버랩이 과도하거나, 업스케일 모델이 VRAM을 과점유합니다.
처음 몇 장은 빠른데, 점점 느려진다
- 캐시가 쌓이거나, 그래프가 커지면서 메모리 파편화가 생길 수 있습니다.
- 장시간 실행 시 다른 프로세스(브라우저, 게임, 캡처 툴)가 VRAM을 잠식하는 경우도 흔합니다.
서버 운영 관점에서 보면, 이 현상은 “메모리 부족으로 인한 성능 붕괴”와 매우 유사합니다. 쿠버네티스에서도 메모리가 임계치를 넘으면 OOMKilled로 터지기 전에 먼저 지연이 커지는데, 비슷한 패턴으로 이해하면 진단이 빨라집니다. 필요하면 K8s CrashLoopBackOff - OOMKilled·Probe 실패 진단처럼 증상 기반으로 원인을 좁히는 방식을 참고해도 좋습니다.
2) VRAM 병목: “해상도·배치·모델 조합”이 전부를 결정한다
Stable Diffusion에서 VRAM을 가장 크게 잡아먹는 요소는 보통 다음입니다.
- Latent 해상도(즉, 최종 이미지 해상도)
- 배치 크기(batch size)
- ControlNet 개수 및 입력 해상도
- LoRA/텍스트 인코더 부하(조합이 많을수록)
- 업스케일 모델(특히 4x 계열)과 타일 처리
2-1) 해상도는 “면적”으로 VRAM을 먹는다
예를 들어 1024x1024는 512x512 대비 픽셀 수가 4배입니다. 단순히 2배 느려지는 정도가 아니라, 중간 텐서가 커지면서 VRAM 압박으로 속도가 급락할 수 있습니다.
권장 전략은 다음과 같습니다.
- 베이스 생성은 768 또는 832 같은 중간 해상도에서 안정적으로 뽑고
- 업스케일은 별 단계로 분리하며
- 업스케일 단계는 타일로 안전장치를 건다
2-2) 배치 크기는 “속도”가 아니라 “리스크”다
배치 크기를 올리면 GPU가 잘 차서 빨라질 것 같지만, VRAM 임계치를 살짝만 넘어도 전체가 느려집니다.
- batch size
1에서 안정적으로 빠른지 확인 - 그 다음
2로 올려보고 - VRAM이 90% 이상 상시 점유되면 다시 내리는 식으로 접근하세요.
2-3) ControlNet 입력 해상도를 낮추면 체감이 크다
ControlNet은 입력 전처리와 추가 U-Net 경로로 비용이 큽니다.
- Canny, Depth 같은 전처리를 고해상도로 넣으면 CPU/GPU 모두 부담
- 입력 해상도를 베이스 생성 해상도에 맞추되, 필요 이상으로 높이지 않기
3) CUDA/파이토치 설정: “VRAM 절약”과 “속도”의 균형
ComfyUI는 내부적으로 PyTorch 기반이고, CUDA 커널 선택과 정밀도 설정에 따라 성능이 크게 달라집니다.
3-1) FP16, BF16, TF32의 의미
- FP16: VRAM 절약과 속도에 유리하지만, 일부 조합에서 품질/안정성 이슈 가능
- BF16: 지원 GPU에서 안정성이 좋고 속도도 준수
- TF32: Ampere 이후에서 행렬 연산을 빠르게(정밀도는 FP32보다 낮음)
체감 상, VRAM이 빡빡할수록 FP16 계열이 유리합니다. 다만 “속도가 느린데 VRAM은 남는다”면, 오히려 커널/정밀도 조합이 최적이 아닐 수 있습니다.
3-2) xFormers / SDP(Scaled Dot Product Attention)
Attention 최적화는 SD 성능에 직결됩니다.
- xFormers가 잘 잡히면 VRAM과 속도 모두 개선되는 경우가 많음
- PyTorch 2.x의 SDP가 더 안정적인 환경도 있음
환경마다 다르니, 동일 워크플로우로 아래처럼 A/B 테스트하는 것이 가장 확실합니다.
# 예시: 실행 시 플래그/환경변수로 attention 구현을 바꿔가며 테스트
# (실제 옵션은 설치/런처에 따라 다를 수 있음)
# 케이스 1: 기본
python main.py
# 케이스 2: xFormers 사용(환경에 따라)
export XFORMERS_FORCE_DISABLE=0
python main.py
# 케이스 3: xFormers 비활성화
export XFORMERS_FORCE_DISABLE=1
python main.py
중요한 건 “무조건 xFormers가 빠르다”가 아니라, 당신의 GPU·드라이버·PyTorch 조합에서 어떤 경로가 빠른지 확인하는 것입니다.
3-3) VRAM 여유가 없으면 “할당 스파이크”가 제일 위험하다
SD는 스텝 진행 중에도 순간적으로 메모리가 튈 수 있습니다. 이때 VRAM이 임계치면,
- 커널이 느려지거나
- CPU 오프로딩이 발생하거나
- 최악에는 OOM으로 작업이 중단됩니다.
따라서 “평균 VRAM”이 아니라 피크 VRAM을 줄이는 방향(해상도/타일/배치 조정)이 효과적입니다.
4) 타일링: 느릴 때의 구명줄이지만, 과하면 독이다
타일링은 업스케일, VAE Decode, 일부 후처리에서 VRAM을 나눠 쓰는 대표적인 기법입니다. 하지만 다음 이유로 느려질 수 있습니다.
- 타일 개수가 늘면 오버헤드가 선형으로 증가
- 오버랩이 크면 같은 영역을 여러 번 계산
- 타일 경계 블렌딩 비용 증가
4-1) 타일 크기와 오버랩의 실전 감각
- 타일 크기: 클수록 빠르지만 VRAM을 더 먹음
- 오버랩: 경계 아티팩트를 줄이지만 느려짐
권장 접근:
- VRAM이 터지지 않는 선에서 타일 크기를 최대한 키우기
- 오버랩은 최소부터 시작해서, 경계가 보일 때만 조금씩 올리기
예시로 4x 업스케일에서 다음처럼 단계적으로 시험합니다.
타일 512 / 오버랩 32 -> 경계 괜찮고 빠르면 유지
타일 384 / 오버랩 32 -> VRAM 부족하면 타일만 내림
타일 384 / 오버랩 64 -> 경계가 보이면 오버랩만 올림
4-2) “타일 VAE”는 마지막 수단으로
VAE Decode가 VRAM을 크게 먹어서 타일 VAE를 켜는 경우가 있는데,
- VRAM은 확실히 절약되지만
- 속도는 눈에 띄게 느려지는 경우가 많습니다.
가능하면 아래 우선순위로 처리하세요.
- 최종 해상도를 낮추고 업스케일로 분리
- 업스케일 단계만 타일링
- 정말 안 되면 VAE 타일링
5) 워크플로우 구조 최적화: “같은 계산을 반복”하지 않게 만들기
ComfyUI는 노드 그래프 기반이라, 구성에 따라 동일한 작업을 여러 번 수행할 수 있습니다.
5-1) 업스케일·디테일러를 “필요한 것만” 적용
흔한 실수:
- 전체 이미지를 업스케일한 뒤, 다시 전체에 디테일러를 돌림
- 디테일러가 마스크/크롭을 만들기 위해 또 전처리를 반복
개선 방향:
- 디테일이 필요한 영역만 인페인트/디테일러
- 업스케일은 최종 단계로 미루기
5-2) 프롬프트/시드 탐색과 고해상도 렌더를 분리
탐색 단계에서 고해상도로 돌리면 시간 낭비가 큽니다.
- 512~768에서 시드/구도/프롬프트 확정
- 확정된 조합만 1024 이상으로 렌더
- 필요 시 업스케일로 품질 끌어올림
5-3) 반복 실행에는 “캐시” 관점이 필요하다
ComfyUI 자체 캐시뿐 아니라, 모델 로딩/디스크 IO가 병목이 되는 경우도 있습니다.
- 체크포인트를 계속 바꿔 끼우면 로딩이 반복
- 네트워크 드라이브에 모델이 있으면 IO 지연
CI에서 캐시가 안 먹으면 빌드가 매번 느려지듯, 모델 파일도 로컬 SSD에 두고 로딩 경로를 단순화하는 것만으로도 체감이 큽니다. 캐시 관점은 GitHub Actions 캐시가 안 먹을 때 키·경로·권한에서 다루는 “경로·키·권한” 같은 사고방식이 은근히 그대로 적용됩니다.
6) “정말 느릴 때” 체크리스트: 10분 안에 원인 좁히기
아래 순서대로 보면 대부분 원인을 잡습니다.
6-1) VRAM 점유 프로세스부터 정리
- 브라우저(특히 GPU 가속), 게임 런처, 녹화 프로그램이 VRAM을 먹습니다.
- Windows라면 작업 관리자 GPU 메모리, Linux라면
nvidia-smi로 확인합니다.
# Linux에서 GPU 상태 확인
nvidia-smi
# 1초 간격으로 보기
nvidia-smi -l 1
6-2) 워크플로우를 반으로 쪼개서 범인 찾기
- 베이스 생성만 실행: 빠르면 업스케일/후처리 쪽 문제
- 업스케일만 실행: 타일링/업스케일 모델 문제
- ControlNet을 하나씩 끄기: 특정 전처리/컨트롤이 병목인지 확인
6-3) 해상도와 배치를 “내렸다가 올리기”
- 해상도를 20%만 내려도 VRAM 피크가 크게 줄어드는 경우가 많습니다.
- batch size는 반드시
1부터 안정화 후 올립니다.
7) 예시: 느린 업스케일 워크플로우를 빠르게 만드는 리팩터링
상황:
- 1024로 생성 후 4x 업스케일
- 업스케일에서만 GPU 사용률이 출렁이고 시간 폭증
개선안:
- 베이스 생성 해상도를 768로 낮춤
- 업스케일을 2x + 2x로 나눠 중간 결과를 확인
- 타일 크기를 가능한 크게, 오버랩을 최소로
개념 워크플로우(의사 구성):
KSampler(768) -> VAE Decode -> 2x Upscale(타일 512, overlap 32)
-> 2x Upscale(타일 384, overlap 32) -> 최종 샤프닝(필요 시)
이렇게 하면 “한 번에 4x”보다 중간 단계에서 실패를 줄이고, 타일 파라미터 튜닝도 쉬워집니다.
8) 결론: ComfyUI 최적화의 핵심은 “피크 VRAM” 관리
ComfyUI가 느릴 때 가장 흔한 본질은 GPU가 약해서가 아니라, VRAM 피크를 넘나들며 메모리 경로가 꼬이는 것입니다. 따라서 최적화는 다음 우선순위로 접근하는 게 효율적입니다.
- 해상도·배치·ControlNet 개수로 피크 VRAM을 먼저 낮추기
- 업스케일/후처리는 분리하고, 타일링은 “필요 최소”로 적용하기
- attention 최적화(xFormers 또는 SDP)를 A/B 테스트로 확정하기
- 워크플로우에서 동일 계산 반복을 제거하기
이 과정을 거치면, 같은 GPU에서도 “안정적으로 빠른” 워크플로우로 수렴합니다. 만약 현재 워크플로우의 노드 구성(스크린샷 또는 JSON)과 GPU 모델, 목표 해상도, ControlNet/LoRA 사용 개수를 알려주면, 병목 지점을 기준으로 더 구체적인 튜닝 지점을 짚어 최적화안을 제안할 수 있습니다.