카테고리 없음

Latent Space란? ComfyUI에서 이미지가 바로 픽셀로 생성되지 않는 이유

GoingProdo 2026. 8. 25. 01:13

ComfyUI 워크플로우를 처음 보면 한 가지 이상한 점이 있습니다. KSampler에서 이미 생성이 끝난 것처럼 보이는데도 바로 Save Image로 연결할 수 없고, 중간에 VAE Decode가 반드시 들어갑니다.

이유는 Stable Diffusion 계열의 생성 모델이 우리가 보는 RGB 픽셀 위에서 직접 이미지를 만드는 것이 아니라, 압축된 표현 공간인 latent space에서 대부분의 생성 작업을 수행하기 때문입니다. 이 글에서는 이 latent space가 ComfyUI 안에서 실제로 어디에 존재하고 어떤 역할을 하는지만 정리합니다.

latent space에서 가장 먼저 볼 변화

Latent Space는 이미지의 압축된 표현 공간이다

이미지는 보통 가로×세로×RGB 채널이라는 거대한 픽셀 배열입니다. 생성 과정 전체를 이 원본 해상도에서 처리하면 계산량과 메모리 사용량이 크게 증가합니다.

Latent Diffusion 계열 모델은 이미지를 더 작은 내부 표현으로 바꾼 뒤, 그 공간에서 diffusion 연산을 수행합니다. 이 내부 표현을 저장하는 공간이 latent space입니다.

Latent는 단순히 작게 줄인 이미지가 아니다

Latent를 단순한 저해상도 썸네일로 이해하면 정확하지 않습니다. 사람이 직접 보기 위한 RGB 이미지가 아니라, 모델이 이미지의 특징을 처리하기 위해 학습한 수치 표현입니다.

즉 다음 두 개는 서로 다른 데이터입니다.

IMAGE: 사람이 볼 수 있는 픽셀 이미지

LATENT: 생성 모델이 연산하는 내부 표현

ComfyUI에서 포트 색상과 데이터 타입이 서로 다른 것도 이 때문입니다.

그래서 LATENT 출력을 Preview Image나 Save Image에 그대로 꽂을 수 없습니다. 먼저 사람이 볼 수 있는 픽셀 공간으로 변환해야 합니다.

latent space가 ComfyUI 워크플로우에 미치는 영향

ComfyUI KSampler는 LATENT를 처리한다

기존 방식과 비교해야 할 부분

기본 Text-to-Image 워크플로우를 보면 Empty Latent Image → KSampler → VAE Decode라는 흐름이 등장합니다.

여기서 실제 diffusion sampling이 수행되는 핵심 구간은 KSampler입니다. 하지만 KSampler의 결과물은 완성된 PNG나 RGB 이미지가 아니라 여전히 LATENT 데이터입니다.

Empty Latent Image가 만드는 것은 빈 그림이 아니다

Empty Latent Image라는 이름 때문에 검은 이미지를 하나 만든다고 생각하기 쉽습니다. 실제 역할은 KSampler가 작업할 latent의 크기와 batch를 정의하는 것입니다.

Text-to-Image에서는 이 latent를 바탕으로 seed에서 생성된 noise가 sampling 과정에 사용되고, 모델은 positive·negative conditioning을 참고하면서 단계적으로 denoising을 수행합니다.

간단하게 정리하면 흐름은 다음과 같습니다.

Latent 준비 → Noise → KSampler denoising → 생성된 Latent

아직 이 단계까지는 우리가 보는 최종 이미지가 아닙니다.

성능과 결과 품질에서 확인할 차이

이 구조를 알고 있으면 KSampler의 출력 포트가 왜 LATENT인지도 자연스럽게 이해됩니다. Sampler는 픽셀을 그리는 노드가 아니라 latent 상태를 변화시키는 노드에 가깝습니다.

워크플로우 구성에서 놓치기 쉬운 부분

VAE Decode가 LATENT를 실제 이미지로 바꾼다

KSampler 뒤에 VAE Decode가 들어가는 이유가 바로 여기에 있습니다.

ComfyUI의 VAE Decode는 LATENT를 받아 사람이 볼 수 있는 IMAGE 데이터로 변환합니다. 공식 ComfyUI 코드에서도 VAE Decode는 latent samples를 받아 vae.decode()를 수행한 뒤 IMAGE 타입을 반환하도록 구성되어 있습니다.

반대 방향도 존재합니다.

이미 존재하는 이미지를 latent space로 집어넣어야 하는 Img2Img 같은 워크플로우에서는 VAE Encode를 사용합니다.

VAE Encode와 Decode의 방향

방향을 다음처럼 기억하면 대부분의 기본 워크플로우를 읽을 수 있습니다.

IMAGE → VAE Encode → LATENT

LATENT → VAE Decode → IMAGE

실제로 적용할 때 체크할 점

Img2Img에서는 입력 사진을 VAE Encode로 latent로 바꾸고, KSampler가 그 latent를 수정한 뒤 다시 VAE Decode합니다.

이 때문에 checkpoint에서 VAE가 빠졌거나 잘못된 VAE를 연결하면 sampling 자체와 별개로 최종 이미지의 색이나 세부 표현에서 문제가 나타날 수도 있습니다.

Latent Space를 알면 ComfyUI 연결 구조가 보인다

Latent space라는 개념이 중요한 이유는 용어 자체보다 워크플로우를 읽는 방식이 달라지기 때문입니다.

예를 들어 Empty Latent Image는 이미지 노드처럼 보이지만 실제 출력은 LATENT입니다. KSampler 역시 최종 이미지를 직접 출력하지 않습니다. 반대로 Save Image는 IMAGE만 받기 때문에 중간에 VAE Decode가 필요합니다.

ComfyUI 워크플로우를 볼 때는 노드 이름보다 현재 데이터가 IMAGE인지 LATENT인지 먼저 확인하는 것이 좋습니다. 특히 커스텀 노드를 연결하다 타입 오류가 발생한다면 이 구분이 첫 번째 체크포인트입니다.

마지막 확인

Latent space는 Stable Diffusion이 최종 이미지를 저장해 두는 비밀 공간이라기보다, diffusion 연산을 효율적으로 수행하기 위한 학습된 내부 표현 공간에 가깝습니다.

ComfyUI에서는 Empty Latent Image → KSampler → VAE Decode → Save Image 흐름을 직접 열어보면 가장 빠르게 이해할 수 있습니다. 다음에 워크플로우를 볼 때는 연결선마다 LATENT와 IMAGE 타입을 확인해 보세요. 왜 VAE가 중간에 들어가는지 바로 보이기 시작합니다.