[AI Era] 7호. ComfyUI 입문용 안내서
오늘은,
너도 나도 이야기하는 이 ‘ComfyUI’라는 녀석이 도대체 뭔지 궁금하실 분들을 위해,
제가 이해한 수준의 아주 쉬운 ‘ComfyUI 입문용 안내서’를 공유해 보려 합니다.
1. ‘ComfyUI’가 뭐죠?
Text-to-Image AI에는 양대 산맥이 있습니다.
폐쇄형 ‘Midjourney’와 개방형의 ‘Stable Diffusion’
(마치 애플 iOS vs. 구글 Android처럼)
폐쇄형의 ‘Midjourney’는 ‘유료’ 서비스인 대신, 누구나 사용하기 쉽게 진입과 사용이 간결하고 대중적이나, 디테일한 수정이 어려운 ‘컨트롤의 한계’가 있으며 API 공개에 ‘제한적’입니다.
개방형의 ‘Stable Diffusion’은 사용자들에 의해 수용과 변형을 거듭하며 빠르고 다양하게 기술을 발전시키기 위해, ‘개발 API를 오픈’하였고, ‘무료’를 지향하며 ‘개발자’들의 언어와 커뮤니티에 최적화되어 있습니다. 특이하게도 사용 프로그램UX가 Stable Diffusion의 개발사인 Stability.ai에 의해서가 아니라 오픈 소스 커뮤니티를 통해 개발되었고, 그것이 바로 ‘ComfyUI’*입니다.
*라디오 기판 납땜 좀 해본 Geek들 입장에서 이 UI는, 마치 이리저리 전선과 CPU를 연결해 붙여 놓은 PC 마더보드처럼, 아름답고(!) 편리하게 느껴져서 ‘Comfy(Comfortable)’라고 이름을 지은 듯합니다.
로그인만 하면 바로 사용 가능한 Midjourney와 달리, 90년대 윈도 PC 프로그램 같은 복잡한 설치과정과 C:\언어 입력창, 전선을 이리 저리 이은 것 같은 복잡한 UI가 열리는 순간, ‘아 나는 못하겠다. 걍 미드저니나 쓸래 ㅠㅠ’ 하는 한탄을 자아내며 중도 포기를 유발하곤 했죠.
요즘은 일반인들에게 익숙한 Web UI버전의 ‘Automatic1111’, ’Invoke AI’와 같은 무/유료의 Web UI서비스들이 개발되었고, 초기 설치 진입장벽을 해소하기 위해 ‘Stability Matrix’와 같은 원스탑 설치 유틸리티가 개발되어 예전보다는 UX가 많이 편리해진 상태입니다.
2. 그냥 미드저니 쓰면 안 되나요?
됩니다.
하지만 Midjourney 가 하지 못하는 섬세한 제어가 가능하기 때문에 조금 더 고급 기능을 구현하고 싶어 하는 전문가들이라면 반드시 익혀 두어야 할 코스로 여겨지는 것이 또한 ComfyUI입니다.
가령 아래 예시처럼, 레퍼런스 이미지를 주고, 그 이미지에서 참조하고 싶은 영역이 ‘Style(아트풍)’인지, ’Composition(구조나 포즈)’인지, 또는 둘 다인지를 자유 자재로 설정할 수 있습니다.
이뿐만이 아니라 우리가 참조하고자 하는 영역이 Canny(외곽선) 인지, Depth(깊이감) 인지, Pose(자세) 인지 등의, 이미지를 구성하고 있는 ‘정보’를 디테일하고 세밀하게 특정하여 지정할 수도 있습니다.
여기서 매우 중요한, 이미지가 ‘정보’라는 개념에 대해 이해하시면, 이제 Midjourney나 Stable Diffusion의 작동 원리이자 기반 모델인 ‘Diffusion’ 모델을 반은 이해하신 것이나 다름없습니다.
3. Diffusion 모델요? 그것까지 알아야 하나요??
네. ComfyUI가 한눈에 이해되니까요.
여러분 중 혹시 위 이미지의 좌측 이미지를 보고 우측 고흐를 연상하신 분이 계실까요?
네, 저는 연상했습니다. 저는 위의 ‘컬러 칩’과 ‘포즈’만으로도 고흐를 연상하였습니다. 왜냐하면 이미 제 뇌는 고흐 초상화 이미지를 학습하여 일정 정보를 알고 있기 때문이죠.
이렇듯 이미지에는 이미지의 특징을 구성하는 많은 정보가 들어있습니다. 앞서 나열되었던 포즈, 외곽선, 깊이감이나 RGB값 등등. 컴퓨터는 그것을 ‘1010101011110001111’**과 같이 컴퓨터가 이해하는 ‘정보’로 치환하여 저장을 하게 됩니다. 수학적으로.
**디지털 정보를 표현하기 위한 은유적 예시입니다. 실제는 엄청난 복잡도의 데이터 구조이며 이를 tensor라 합니다.
텍스트도 마찬가지입니다. ‘고흐의 자화상’이라는 텍스트를 컴퓨터는 ‘101010101O110001111’ 정도로 이해했을 수 있습니다. 그래서 컴퓨터에게 프롬프트 명령어로 /Imagine ‘고흐의 자화상’이라고 치면 ‘이미지 학습 모델 탱크’에 가서 이리저리 뒤지다가 흠, ‘1010101011110001111’이 제일 비슷한데 하고 찾아 나오는 겁니다.
그런데 문제는 이 이미지란 것의 학습량과 정보가 너무 많습니다. 프롬프트 입력 값으로 들어온 ‘반고흐 자화상’ 하나 찾자고 지구상에 존재하는 모든 이미지 정보들을 일일이 대조하며 일치값을 찾으려니 시간이 너무 많이 소요됩니다.
그래서 Diffusion모델은 특정 시작 지점을 설정 해놓고 거기서 이리 저리 변형을 가하며 최대한 프롬프트 요구사항과 일치할 것 같은 이미지를 샘플링해서 제시합니다. 이때 가해지는 수학적 변형이 노이즈이며 그 노이즈가 마치 디퓨저 향 확산되듯 무작위로 생성되는 듯 보여 이름을 그렇게 붙였습니다. (무작위는 실은 철저히 수학적이고 계획적인 계산 값 이지만요)
Diffusion 모델이 시중의 서비스화되기까지에는 이를 가능하게 하는 핵심 기술이론과 과정의 흐름이 존재하는데요 개요를 도식화하면 위와 같습니다. 먼저 생성하려고 하는 이미지들의 선(先) 학습모델 탱크인 ①Checkpoint 모델을 불러옵니다. 여기에는 이미지를 압축하여 정보로 치환하는 ②VAE(Variational Autoencoder)기술로 연산을 최소화하게끔 압축된 이미지 정보들이 들어있습니다. 제 뇌가 위의 픽셀 이미지 만으로도 고흐를 예측했듯, 수학적으로 이미지의 특징을 압축하는 모델이며, 압축을 해서 Encoding 한 방식을 역산으로 Decoding 하여, 정보를 이미지화 하는데 다시 쓰입니다.
다음으로 프롬프트가 들어오면 이를 이미지의 정보로 이해해 내는 기술이 ③CLIP(Contrastive Language-Image Pre-training). 연산 손실을 줄이기 위해 걸러낼 이미지(Negative,非표출)에 대한 요청을 함께 넣습니다.
그럼 이제 생성이 시작되는 데요, Checkpoint에서 CLIP의 요청 이미지 정보와 근사한 값들이 몰려 있는 지점을 찾아 샘플링을 시작할 시작 지점(그래서 checkpoint라고함)을 찾고, 일정 규칙(④U-Net Scheduler)을 가지고 노이즈를 가해 샘플링을 시작합니다.
이때 샘플을 수학적으로 ‘1010101011110001111’, ‘1110101011110001111’과 같이 난수 생성하듯 만들어 낼 수 있겠죠. 하지만 이 또한 아무 난수나 생성하면 너무 손실이 크니, 최대한 이미지 정보 값과 근사치의 노이즈(변형)를 주면서 일정 규칙대로 샘플링을 할 수 있는데, 샘플링 방식에 따라 다양한 ⑤Sampler 모델들이 존재합니다(가령 그림을 그릴 때 외곽 스케치부터 하고 들어갈지 채색을 해나가며 진행할지 다른 것처럼). 또한 샘플링을 n 번에 걸쳐 할지의 단계(Step), CLIP의 텍스트 프롬프트 준수 강도를 지정하는 Cfg값*** 등의 옵션을 통해 일종의 가상공간 개념인 Latent Space에서 이 일련의 대조 작업을 수행하게 됩니다.
***가령 { 주황색 머리 고흐가 민트색 양복과 단추 3개의 조끼를 입고 측면으로 보고 있는 초상화를 그려줘 } 라는 프롬프트에서 Cfg 값을 7과 13로 세팅할 때의 차이는, 7은 문장의 의미 단위 중 핵심만 추려 { 고흐, 측면, 초상화 } 정도만 준수하는 것이고, 13은 색깔이나 단추, 3개 같은 문장내 마이너한 모든 정보 단위를 모두 준수하는 것입니다.
1로 세팅하면 프롬프트는 안중에 두지 말라는 의미가 되고 마구 자유로운 이미지를 생성하게 되겠죠.
그렇게 해서 요청에 부합하는 가장 적합한 이미지 ‘정보’를 생성하면 이를 다시 VAE 역산 방식으로 Decoding하여 ‘이미지’로 만들고 이것이 생성 결과가 되는 것입니다. 참 쉽다 그죠.
4. 그래서, ComfyUI는 어떻게 돌리는데요?
자. 그럼 이제 ComfyUI를 열어보겠습니다.
방금 말한 이 논문 한 권을 그대로 UI 로 만들어 놓은 것을 발견하게 되실 겁니다.
일반인들을 위한 친절한 이름 ‘개명’ 따위는 없습니다. 괜히 헷갈리기만 할 테니까.
당신이 제일 먼저 할 일은 ‘Checkpoint 모델’을 선택하는 것입니다.
얼굴 중심 모델, 건물 중심, 자동차 중심, 애니메 중심 등등 이미 수많은 개발자들이 선행학습을 시켜놓은 모델들이 존재합니다. 이들은 군집 클러스터뿐만 아니라 Stable Diffusion(SD)의 제너레이션 모델 별로 SD 1.5, SD XL, FLUX(독일 블랙포레스트사가 만든 가장 최신 세대) 등등의 학습모델로도 존재합니다. 그래서 초짜 입문자가 여기서 잘못된 모델을 선택하고 시작하면 결과물이 잘 나오지 않습니다. 그리고 애석하게도, VAE나 Sampler도 각 SD 제너레이션에 최적화된 별도의 Tool kit들이 존해해서 옵션을 선택할 때마다, 이런 것들을 맞춰주지 않으면 에러가 난다는 함정이 존재합니다.
ComfyUI를 열고 <Load Default>란 버튼을 누르면 가장 기본 구조인 위의 네모 박스들(노드라고 함)들이 자동 세팅됩니다. 이제 앞서 설명 드린 ‘Diffusion’ 모델에 대입해 이 구조를 들여다보면 한눈에 이해가 되실 겁니다.
A. Load Checkpoint : 시작점이 될 이미지 학습모델을 선택
B. CLIP: Positive(표출,위쪽)/Negative(非표출,아래쪽) 프롬프트를 입력
C. Empty Latent Image: 생성할 이미지 사이즈와 개수 옵션 설정(512x512,1장)
D. KSampler: UNet Scheduler의 샘플링 생성 옵션 설정 (단계, cfg, 샘플러, 노이즈 추가방식)
E. VAE decode: 생성된 이미지 ‘정보’를 이미지로 치환
F. Save Image: 최종 결과값 나오는 창
Midjourney에서 프롬프트 입력 값 한 줄로 끝날 일을 참 거대하게 만들어 놓았습니다.
이것은 가장 기본적인 노드일 뿐이고 사실, ComfyUI의 세계에는 훨씬 복잡하고 많은 노드들이 있습니다. 각 개발자들이 자신들의 필요해 의해 연구하고 만들어 놓은 수많은 응용 모델과 노드들이 존재하며 Checkpoint 모델 거래소인 ‘Civit AI’나, 전세계 개발자들의 커뮤니티인 ‘Github’, 한국 개발자가 만든 ‘Nordi.ai’ 등에서 필요한 노드들을 인스톨해 그때그때 사용해 볼 수 있습니다. 마치 저희가 인생네컷에서 활용한 FaceSwap노드 처럼요.
그중 가장 많이 사용하는 것이 ‘IP Adapter’ 와 ‘ControlNet’ 인데, 이름이 Geek 해서 그렇지 사실 IP Adapter는 레퍼런스 이미지를 업로드해 ‘style’을 참조하는 옵션 노드이고, ‘ControlNet’은 ‘프롬프트’로 들어온 이미지의 ‘정보’ 중 Canny(외곽선), Depth(깊이감), Pose(자세) 같은 것들을 디테일하게 ‘제어’하는 노드입니다.
오늘은 ‘ComfyUI를 시작하려는 사람들을 위한 안내서’이다 보니 더 이상의 설명은 생략하겠습니다.
마치며,
긴 글을 따라오시느라 수고하셨습니다.
어떤 분은 중도 포기, 어떤 분은 한번 도전해보고 싶은 생각이 드실 수도 있으실 텐데요
당장 써보고 싶다고 느끼신 분들은, 이 유투버를 참고하여 직접 설치해 보셔도 됩니다.
잠깐, 그전에 당신의 노트북에 GPU가 있는지, GPU사양이 최소 NVIDIA RTX 이상인지는 확인해보셔요.
제 울트라북의 경우 GPU가 NVIDIA GTX사양인데 매우 느리게 쉭쉭 소리를 내며 돌아는 갔습니다.
그럼 이만.
💡 참고하면 좋은 자료
- Stability.AI (링크)
- Invoke Blog (링크)
- Stability Matrix (링크)
- FLUX (링크)
- Civit AI (링크)
- Nordy.ai (링크)
- Stable Diffusion 설치하는 가장 쉬운 방법_San AI 연구소 (링크)
Editor : AI LABS 김효진 책임