AI 이미지/ComfyUI

Efficiency Nodes for ComfyUI

하늘이푸른오늘 2023. 10. 24. 16:29

얼마 전 ComfyUI를 이용해서 무한 줌 영상을 만드는 글에는 아래와 같이 [Efficient Loader] 노드와 [KSampler (Efficient)] 노드를 사용했습니다. 그 글에서는 자세하게 설명하지 않았지만, 아래에서 보시는 것처럼 [Efficient Loader] 노드는 체크포인트 모델, VAE, LoRA  모델, 프롬프트, 레이턴트 이미지 등 모델에 관련된 거의 대부분의 기능이 합쳐져 있는 노드입니다. 이 노드를 [KSmapler (Efficient)] 노드와 함께 사용하면 워크플로를 아주 깔끔하게 구성할 수 있어 편리한 듯합니다.

참고: 얼마전 Efficiency Node 를 관리하던 LucianoCirino님이  이 노드 관리를 포기하신다고 선언해서, jags111 님의 GitHub 사이트에서 다운받으셔야 합니다. 기존에 사용하셨던 분들은 ComfyUI Manager를 통해서 기존 설치된 Efficiency 노드를 삭제하고 새로 설치하여야 합니다.

[Efficient Loader] 노드와 [KSampler (Efficient)] 노드

이 글에서는 이 두 가지 노드를 포함해서 Efficiency 관련 노드를 좀 더 자세하게 설명합니다. 이 글에서 다루는 내용은 아래와 같습니다.

Efficiency 커스텀 노드 설치

Efficiency 커스텀 노드ComfyUI Manager를 통해 설치할 수 있습니다. 메뉴 맨 아래에 있는 [Manager] 버튼을 누르면 아래와 같이 [ComfyUI Manger Menu]가 나타납니다.

여기에서 [Install Custom Nodes]를 누르면 목록이 나타나는데, Efficiency로 검색한 후 아래와 같이 Efficiency Nods for ComfyUI Version 2.0+ 를 찾아 맨 오른쪽에 있는 [Install] 버튼을 누르면 설치가 됩니다. 설치 후에는 ComfyUI를 새로 시작해 주어야 사용할 수 있습니다.

커스톰 노드를 직접 설치하는 방법 등 설치와 관련된 자세한 내용은 이 글을 읽어보시기 바랍니다.

Efficiency 커스톰 노드의 구성

Efficiency 커스톰 노드를 설치하면, 아래와 같이 여러가지 노드들을 사용할 수 있게 됩니다. 총 37개의 노드가 추가되네요.

Efficiency 커스톰 노드의 구성

  • Sampling - 여러가지 KSampler 노드가 포함되어 있습니다. [KSampler (Efficient)]는 SD 1.5용이고, 나머지는 SDXL용입니다.
  • Loaders - SD 1.5용 및 SDXL용 모델 로더 노드가 포함되어 있습니다.
  • Stakers - 여러개의 LoRA 또는 여러개의 ControlNet을 사용할 때 사용하는 노드입니다. Loaders와 함께 사용합니다.
  • Misc - ???
  • Scripts - XY Inputs와 함께 사용하는 스크립트가 있습니다.
  • XY Inputs - AUTOMATIC1111에서 XY Plot을 구현할 수 있는 노드인 [XY Plot] 노드와 [HighRes-Fix Script]가 포함되어 있습니다.
  • Image - ???
  • Simple Eval - ????

이상에서 보시는 것처럼 대충 Loaders + Stacker, Sampling, XY Inputs 등으로 나누어볼 수 있는데(???는 읽어봐도 아무 내용이 없어서 모르겠습니다) XY Inputs은 다음 글에서 다루겠습니다.

Loader 노드

Add node -> Efficiency Nodes -> Loaders 로 들어가면 [Efficient Loader] 노드와 [Eff. Loader SDXL] 노드가 있습니다.

[Efficient Loader] 노드

이중 아래에 있는 SD1.5 모델에서 사용하는 [Efficient Loader] 노드입니다. 

[Efficient Loader] 노드의 입력 위젯을 살펴보면 아래와 같습니다.

  • 체크포인트 모델 - 체크포인트 모델을 선택합니다. SD 1.5 모델만 사용해야 합니다.
  • VAE 모델 - VAE 모델을 별도로 지정할 때 사용합니다. Baked VAE란, 체크포인트에 포함되어 있는 VAE를 사용한다는 뜻입니다.
  • clip_skip - CLIP이 여러개의 레이어로 구성되어 있는데, -1이면 모두 사용하고 -2면 한개의 레이어를 건너뛴다는(사용하지 않는다는) 내용입니다. 원래 학습할 때 건너뛴 모델이라면 -2를 사용하는 게 맞고, 아닐 때는 -1로 사용하는데, 요즘은 -1로 사용하는 걸로 알고 있습니다.
  • lora-name -  사용할 LoRA 모델을 지정합니다.
  • Positive/Negative -프롬프트를 입력합니다.
  • empty_latent_width/height - 잠재 이미지의 크기, 결과적으로 최종 이미지 크기를 설정합니다.
  • batch_size - 한번에 생성할 이미지 수를 지정합니다.
  • 기타 token_normalization/weight_interpretation은 프롬프트를 인코딩하는 방법이라고 합니다. 자세한 내용은 여기를 읽어보시면 됩니다.

이상에서 보시는 것처럼 여기에는 아래의 5개 기본 노드가 한꺼번에 포함된 노드라고 보시면 됩니다(LoRA도 하나 포함되지만, 여러개의 LoRA를 사용하려면 다른 방법이 필요합니다). 참고로, 아래는 [Load Default] 명령으로 불러온 기본 워크플로에 [Load VAE]노드를 추가한 것입니다.

Efficient Loader에 해당하는 기본 노드들

또한, [Efficient Loader] 노드의 입력 슬롯에는 아래와 같이 lora_stack 및 cnet_stack이 있는데, 여러개의  LoRA를 한꺼번에 지정할 수 있는 [LoRA Stacker] 노드와, 여러개의 ControlNet 을 연쇄적으로 지정하는 [Control Net Stacker] 노드를 아래와 같이 연결할 수 있습니다. 이렇게 되면 Loader와 KSampler 사이에 끼어들어갈 필요가 없어서 훨씬 깔끔합니다.

[LoRA Stacker] 노드와 [Control Net Stacker] 노드

[Eff. Loader SDXL] 노드

두 번째 로더는 SDXL 모델에 사용하는  [Eff. Loader SDXL] 노드입니다. 이 노드의 입력 슬롯과 입력 위젯은 SD1.5용 [Efficient Loader]와 동일합니다. 다만 출력 슬롯만 다릅니다(출력슬롯은 아래에서 설명합니다.)

이 노드도 [LoRA Stacker] 노드와 [Control Net Stacker] 노드는 동일한 방법으로 사용할 수 있습니다. 

[LoRA Stacker] 노드와 [Control Net Stacker] 노드 사용방법

KSampler 노드

Add nodes -> Efficient nodes -> Sampleing 에 들어가면 [KSampler (Efficient)] 노드, [KSampler Adv. (Efficient)] 노드, [KSampler SDXL (Eff)] 노드 등 3가지 노드가 있습니다.

[KSampler (Efficient)] 노드

이중 [KSampler (Efficient)] 노드는 위에서 설명한 [Efficient Loader] 노드와 함께 사용합니다. 연결도 간단합니다. 그냥 수평으로 다섯줄만 연결해 주면 됩니다. 이렇게 간단하니까 워크플로가 간단해집니다.

[KSampler (Efficient)] 노드와 [Efficient Loader] 노드

입력 위젯은 아래와 같습니다. 대부분 AUTOMATIC1111의 설정과 거의 비슷합니다. 이 글을 읽어보시면 좀 더 자세한 내용을 아실 수 있습니다.

  • Sampler_state - Sample/Script/Hold 등 세가지 중 하나를 선택할 수 있습니다. 일반적인 이미지를 생성할 때는 Sample을 사용하면 됩니다. 
  • Seed - 씨드 번호를 입력합니다. -1을 입력하면 다음부터 무작위로 변경됩니다.
  • Randomize/ Last Queued Seed - Randomize를 누르면 현재 나와있는 씨드값을 취소하고 -1로 바꿔줍니다. Last Queued Seed는 바로전 실행에 사용된 씨드 번호를 다시 불러옵니다. 
  • Steps - 잡음제거 단계 수를 설정합니다.
  • cfg - CFG 척도를 입력합니다.
  • sampler_name - 샘플링 알고리즘 이름을 지정합니다.
  • scheduler - 샘플링 수행 방법을 지정합니다. 일정하게 줄이는 방법, 처음엔 많이 줄이고 나중에는 천천히 줄이는 방법등이 있습니다. normal/karras/exponential/sgm_uniform/simple/ddim_uniform 등이 있습니다.
  • denoise - 노이즈 줄이는 양입니다. 높일수록 달라집니다. 특히 img2img에서 이 값을 높이면 원본과 달라질 확률이 커집니다.
  • preview_method - 자동 이미지 프리뷰 방법을 지정합니다.
  • vae_decode - true는 생성된 잠재 이미지에 VAE 디코딩을 적용해 일반 이미지로 바꿉니다. false의 경우 일반 이미지로 바꾸지 않는데, 생성된 이미지를 사용해서 다른 처리를 할 때 사용합니다.

 [KSampler Adv. (Efficient)] 노드

다음은 [KSampler Adv. (Efficient)] 노드는 SDXL에서 사용하는 노드입니다. SDXL 모델을 사용할 때 base 모델과 refiner 모델에 대해 각각 잡음 제거 샘플링을 시킬 때 사용하는 노드인 [KSampler Advanced)] 노드에 대한 Efficient 판입니다. [KSampler (Advanced)] 노드는 아래와 같은 형태로 사용합니다. (자세한 내용은 이 글을 참고하세요) 

base + refiner Sampler 연결

즉, 위의 그림은 총 25 단계의 샘플링 단계를 수행하는데, 이중 1~18 단계는 base 모델을 사용한 샘플링, 18~25 단계는 refiner 모델을 사용한 2차 샘플링을 수행합니다. 

[KSampler SDXL (Eff)] 노드

마지막으로 [KSampler SDXL (Eff)] 노드입니다. 위의 [KSampelr Adv. (Efficient)]노드는 두개를 함께 사용해야 하고 항목도 많아서 사용하기 복잡하지만, 아래 그림과 같이 이 [KSampler SDXL (Eff)] 노드는 [Eff. Loader SDXL]과 연결해 사용하면 base + refiner모델을 한꺼번에 설정할 수 있어 편리합니다. 

즉 아래와 같이 설정할 경우, 총 20 단계에서 0~14단계는 base 모델을, 15~19단계는 refiner 모델을 사용해 잡음 제거가 이루어진다는 뜻입니다.

[Eff. Loader SDXL] 노드와 [KSampler SDXL (Eff).] 노드 설정

결론적으로, SD1.5를 사용할 때에는 [Efficient Loader] 노드와 [KSampler (Efficient)] 노드를 사용하고, SDXL을 사용할 때에는 [Eff. Loader SDXL]과 [KSampler SDXL (Eff)] 노드를 연결해서 사용하면 제일 편리합니다. 

Script 노드

아래 그림에서 알 수 있는 것처럼, Script 노드는 XY Plot 노드와 Noise Control Script  등 총 5가지가 존재합니다. 

Script 노드

이들 스크립트들은 아래와 같이 서로 연결해서 사용할 수 있습니다.

XY Plot Script 노드

XY Plot은 예를 들면 X 축 방향으로는 여러가지 LoRA를 배치하고, Y 축 방향으로는 체크포인트 모델을 배치해서, 다른 조건은 동일할 때 LoRA/Checkpoint에 따라 어떤 결과가 나오는지 테스트하는데 사용합니다. LoRA가 4가지, Checkpoint가 3가지라면 총 12가지의 이미지가 생성되죠.

예를 들어, 아래는 인터넷에서 가져온 그림인데, 샘플링 단계수와 CFG 척도를 변경하면서 어떤 효과가 있는지 비교해 본 그림입니다. 이런 그림이 XY Plot을 사용해 생성한 것입니다.

XY Plot의 예

Efficiency Nodes에 포함된 [XY Plot] 노드는 아래와 같이 생겼습니다. 반드시 아래와 같이 연결해야 작동하며, [KSampler (Efficient)] 노드의 "sampler_state" 위젯은 "Script"로 설정해야 합니다.

[XY Plot] 노드

입력 슬롯인 X/Y 에는 아래와 같이 Add Node -> Efficient Nodes -> XY Inputs에 포함된 어떠한 노드를 연결해도 됩니다.

XY Inputs

XY Input 노드는 여러가지 종류가 있습니다. 아래는 값을 설정하는 노드들만 모아본 것입니다. 예를 들어 좌측위의 [XY Input: Steps]를 그림과 같이 설정하면 단계수가 10, 15, 20에 대해 이미지를 생성하라는 뜻입니다.

아래는 여러가지중 하나를 선택해야 하는 노드들만 모아본 것입니다. 예를 들면 좌측위는 아래에서 선택한 3가지 체크포인트 파일 써서 각각 이미지를 생성하라는 뜻입니다. 

예를 들어 아래와 같이 설정한다면 가로축은 샘플링 단계 10/15/20으로, 세로 축은 3개의 모델에 대해 이미지를 생성하므로 총 9개의 이미지가 생성됩니다. 여기에서 [XY Plot] 노드의 맨 아래 "ksampler_output_image"를 Images로 설정하면 9개의 이미지가 생성되고, "Plot"으로 설정하면 9개의 이미지가 XY로 배치된 한장의 이미지가 생성됩니다.

아래는 이 방식으로 [XY Plot] 노드를 실험해 본 결과입니다. 자세한 워크플로는 아래 그림을 ComfyUI 캔버스에 Drag & Drop 하면 확인하실 수 있습니다.

[XY Plot] 노드 테스트 결과

HighRes-Fix Script 노드

HighRes-Fix (High Resolution Fix) 는 이미지를 생성한 후, 다시 확대하면서 다시 잡음 제거 샘플링을 돌려서 고품질의 이미지를 생성하는 기법으로서, 2 패스 txt2img 기법이라고도 합니다. 자세한 내용은 Stable Diffusion - HiRes. Fix를 활용한 고품질 이미지 생성을 읽어 보시면 됩니다.

[HighRes-Fix Scirpt] 노드는 아래와 같이 생겼습니다. 위에서 세번째 있는 위젯은 확대할 때 내삽(interpolation) 방법을 지정합니다. nearest-exact/bilinear/area/bicubic/bislerp 등 중 하나를 선택하면 되는데,  bilinear 정도가 어떤 경우에도 쓸만한 걸로 보입니다. 가장 중요한 설정은 네번째인 확대 비율이고요. 나머지는 그냥 기본 값 상태로 써도 무방할 것입니다. 

[HighRes-Fix Scirpt] 노드

사용하는 방법은 간단합니다. 이 노드의 SCRIPT 출력 슬롯을 [KSampler Efficient] 노드의 script 입력 노드에 연결해 주고, [KSampler Efficient] 노드의 sampler_state를 Sample에서 Script로 바꿔 주기만 하면 됩니다. 더 자세한 [HighRes-Fix Scirpt] 노드 활용 방법은 여기를 읽어보세요.

Tiled Upscaler 노드

BlenderNeko의 ComfyUI_TiledKSampler  워크플로를 1개의 노드로 포함시킨 스크립트입니다. 

AnimateDiff 노드

이 스크립트를 사용하려면 먼저 Kosinkadink 님의 ComfyUI-AnimateDiff-Evolved 커스텀 노드가 설치되어 있어야 합니다. 이때 Efficient Loader의 batch_size가 전체 프레임숫자로 사용됨을 유의하세요.

아래는 실제로 사용해본 예제입니다. 간단하면서도 잘 나오네요.

Image Overlay 노드

Image Overlay 노드는 말그대로 ComfyUI로 생성한 이미지 위에, 로고 같은 임의의 그림을 덮어 씌워주는 노드입니다. 

입력 슬롯중 base_image는 원본 이미지이고, overlay_image와 optional_mask는 중첩시킬 이미지입니다. 아래 워크플로를 보시면 이해가 가실겁니다. (이 이미지를 ComfyUI 캔버스에 Drag&Drop하면 워크플로를 사용할 수 있습니다)

SimpleEval 노드

간단한 파이썬 수식을 작성할 수 있는 노드입니다. 아래와 같이 3가지 종류가 있습니다. 

기본적으로 사칙연산을 지원하지만, [Simple Eval Examples] 노드에 들어 있는 것처럼, simpleeval 라이브러리에 들어있는 다양한 연산을 지원합니다. 

SD1.5용 기본 워크플로

아래는 기본 워크플로에 LoRA를 추가한 워크플로입니다. 아주 깔끔해서 좋네요. 아래 그림을 다운로드 받은 후, ComfyUI에 Drag&Drop 하면 이 워크플로를 그대로 복원할 수 있습니다.

SD1.5 + LoRA 워크플로

이 워크플로에 현재 설정된 내용은 아래와 같습니다(물론 편한대로 수정해서 사용하면 됩니다). 이중 부정적 프롬프트는 인물 이미지를 생성할 때 일반적으로 사용하는 것입니다. 나머지 자세한 설정은 위의 이미지를 불러들이면 확인할 수 있습니다.

모델: Cyberrealistic_v33
프롬프트: A portrait of a fairy princess, tiara, long flowery hair, fantasy, soft background, sea-like , bluish dress, bare shoulders, UHD, 8k, beautiful composition, a modern surrealistic
부정적프롬프트: disfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w
LoRA: more_details.safetensors

그런데 저는 여기에 세 가지를 추가했습니다. (이 워크플로로 돌리면 약 6초만에 이미지가 생성됩니다)

[SDXL Prompty Styler] 노드는 스타일을 선택하면 입력된 프롬프트/부정적 프롬프트에 장식 관련 키워드를 추가해주는 노드입니다. 원래 SDXL 용이라고는 하지만, 프롬프트 텍스트를 수정만 하는 것이기 때문에 SD1.5에 사용해도 무방합니다. (일반 기본 워크플로에서는 사용하지 못합니다) 

SD1.5 + LoRA 기본 워크플로

[CR SD1.5 Aspect Ratio] 노드는 SD1.5 모델에 적합한 이미지 크기를 지정만하면 사용할 수 있는 노드입니다. 1024, 768, 512 등의 숫자를 직접 입력할 필요없이 클릭만으로 바꿀 수 있으니 편리합니다.

마지막으로 추가한 것은 [HighRes Fix Script]  노드입니다. 확대하면서 보다 섬세함을 추가하기 위한 목적입니다.

다른 설정은 위와 동일합니다. 아래는 이 워크플로를 사용해 생성한 이미지입니다. 이렇게 생성된 아래의 이미지를 ComfyUI 캔버스에 넣어도 설정을 복원할 수 있습니다.

SD1.5 + LoRA 기본 워크플로로 생성한 이미지

바로 이 워크플로가 편리한 ComfyUI 워크플로 모음 중, SD 1.5용 기본 워크플로입니다. SD1.5 모델을 사용할 경우, 이 워크플로가 있으면 80% 이상은 대응할 수 있을 걸로 예상합니다.

SDXL용 기본 워크플로

아래는 동일한 방식으로 생성한 SDXL  base+refiner 및 LoRA까지 적용한 기본 워크플로입니다. 이 워크플로는 대략 26초만에 이미지가 생성됩니다.

[Efficient Loader] 와 [KSampler Efficient] 노드를 SDXL용으로 바꿔치기만 한 거라, 위의 것과 동일합니다. 모델 (CrystalClearXL) 은 당연히 다르지만, 다른 설정은 거의 동일합니다. 아래 워크플로는 총 25단계중에서 base 모델은 18 단계, refiner 모델은 7단계를 수행합니다. (

SDXL+refiner + LoRA 기본 워크플로

아래는 이 워크플로로 생성한 이미지입니다. 당연히 이 이미지를 ComfyUI 캔버스에 떨어뜨려도 워크플로가 그대로 복원됩니다.

SDXL+refiner + LoRA 기본 워크플로로 생성한 이미지

이상입니다. 저는 주로 SDXL용 워크플로를 사용하지만, 가끔은 SD1.5 모델도 사용해야 해서 바꾸려면 번거러웠는데, 깔끔하게 정리되서 기분이 좋습니다. 특히, 원래 ComfyUI에서 제공하는 워크플로보다 깔끔하게 만들어져서 자주 사용할 수 있을 것 같습니다. 다른 워크플로도 조금씩 이것들을 기반으로 바꿔가야겠다... 싶네요.

민, 푸른하늘

이 글은 Efficiency Node의 Read.me 파일의 내용을 기초로 수정, 편집한 글입니다.