AI 이미지/ComfyUI

스테이블 디퓨전 - ComfyUI와 SDXL 사용법 - LoRA(4)

하늘이푸른오늘 2023. 9. 7. 15:26

이 글에서는 이전 글에서 만든 워크플로에 좀 더 고급 기법을 수용할 수 있도록 수정함과 동시에 ComfyUI를 좀더 효율적으로 사용하고, 필요에 따라 워크플로를 만들 수 있는 여러가지 방법을 소개합니다.

이 글은 아래와 같이 구성되어 있습니다. 

  1. 스테이블 디퓨전 - ComfyUI와 SDXL 사용법(1) - 기초 - 이 글. 아주 간단한 기본 SDXL 워크플로를 생성합니다.
  2. 스테이블 디퓨전 - ComfyUI와 SDXL 사용법(2) - 조건부여 - SDXL 에만 적용되는 조건부터를 추가하고, 조건부여 파라미터 변경에 따른 이미지 영향을 시험합니다.
  3. 스테이블 디퓨전 - ComfyUI와 SDXL 사용법(3) - Refiner - 완전한 SDXL 프로세스를 위해 refiner 모델을 추가합니다.
  4. 스테이블 디퓨전 - ComfyUI와 SDXL 사용법(4) - LoRA - 커스텀 노드를 설치하고 LoRA를 사용하는 워크플로를 생성합니다.
  5. 스테이블 디퓨전 - ComfyUI와 SDXL 사용법(5) - img2img - img2img 를 사용하는 워크플로를 생성합니다.

커스텀 노드와 comfyUI 매니저

커스텀 노드를 사용하면 ComfyUI를 훨씬 강력하게 만들 수 있습니다. 제가 즐겨 사용하는 Style Selector종횡비 자동 설정 노드도 커스텀 노드로서, 새로운 기능을 추가하거나, 기존의 노드의 활용성을 높여주는 역할을 할 수 있습니다. 대략기능적으로는 AUTOMATIC1111의 확장(extension)과 비슷하다고 할 수 있겠습니다. ComfyUI 사용자 그룹은 다양한 커스텀 노드를 개발하고 있습니다. 커스텀 노드는 너무 많기 때문에 일일히 소개하는 것은 불가능하지만, 이 글에서는 몇 가지 유용한 커스텀 노드를 사용할 것입니다.

CompyUI Manager 설치

수많은 커스텀 노드 중에서 ComfyUI Manager는  꼭 설치해야 할 목록에 빠지지 않는 아주 중요한 커스텀 노드입니다. 특히 이 커스텀 노드는 다른 여러가지 커스텀 노드의 설치/제거/업데이트 등을 관리할 수 있어, 여러가지 커스텀 노드를 등록해서 사용하는 분들은 반드시 설치해야 할 노드라고 생각됩니다.

1. 명령프롬프트(cmd)를 실행하고 ComfyUI/custom_nodes 폴더로 들어갑니다.

2. 다음의 명령을 실행합니다.

git clone https://github.com/ltdrdata/ComfyUI-Manager.git

3. ComfyUI를 처음부터 다시 실행합니다.

4. ComfyUI의 맨 오른쪽에 제어박스 아래에 아래와 같이 [Manager]라는 단추가 하나 더 추가되어 있습니다.

ComfyUI Manager
ComfyUI Manager

5. 이 단추를 누르면 아래와 같이 Manager 윈도가 실행됩니다. 여러가지 재미있는 기능이 많지만, 여기에서는 맨 위쪽에 있는 [Install Custom Nodes]를 사용합니다.

6. 이 단추를 누르면 아래와 같이 여러가지 커스텀 노드을 설치/제거할 수 있는 윈도가 나타납니다. 저는 현재 커스텀 노드를 별로 많이 설치하지 않았기 때문에 깨끗한 편이지만, 설치된 커스텀노드는 우상단에 있는 것처럼 [Disable]과 [Uninstall]이 표시됩니다. 아래로 내려보시면 오늘 현재 184개의 커스텀 노드가 등록되어 있네요(2023.12.7일 현재 327개로 증가했네요)

커스텀 노드 설치 관리 윈도
커스텀 노드 설치 관리 윈도

Simple Math 커스텀 노드 설치

커스텀 노드 설치 관리 윈도에서 아래로 내려가 74번을 보면 아래와 같이 Simple Math  커스텀 노드가 있습니다. 맨 오른쪽에 가서 Install 을 눌러주면 설치가 됩니다. 물론 사용하려면 먼저 ComfyUI를 새로 시작해야 하고요.

Simple Math 커스텀 노드 설치
Simple Math 커스텀 노드 설치

Comfyroll 커스텀 노드 설치

Comfyrolll  커스텀 노드도 비슷한 방법으로 설치할 수 있습니다. 우측 위에 있는 검색창에서 comfyroll을 찾아보셔도 됩니다. 번호는 64번입니다.

Comfyroll 커스텀 노드 설치
Comfyroll 커스텀 노드 설치

ComfyUI-Custom-Scripts 설치

Custom-Scripts 커스텀 노드는 61번입니다.

ComfyUI-Custom-Scripts 설치
ComfyUI-Custom-Scripts 설치

====

이 글은 지난 글 맨 마지막에 완성된 워크플로에서 시작합니다. 없으시면 아래 그림을 저장해서 ComfyUI 캔버스에 드래그&드롭하시면 됩니다.

fashion photography, a woman, face, 워크플로 포함
fashion photography, a woman, face, 워크플로 포함

기존 워크플로 수정

지난번의 워크플로에서 불편한 점이 몇가지 있어 수정하였습니다. 아래는 수정하는 방법입니다.

CFG, Steps, Seed Number

먼저 잡음제거 단계수(Steps), 분류 자유도 척도(CFG), 씨드 번호(Seed Number)는 자주 변경되어야 할 뿐 만아니라, base 샘플러와 refiner 샘플러를 변경하면 함께 변경되어야 하므로, 별도로 입력할 필요가 없습니다. 이들 6개(base 3개, refiner 3개) 의 입력 위젯을 슬롯으로 바꿉니다. KSamplerAdvanced 노드를 우클릭하고, [convert noise_seed to input] 등을 눌러주면 됩니다.

샘플러 노드 input 변경
샘플러 노드 input 변경

그 다음 새로 생긴 입력 슬롯을 드래그해서 캔버스에 떨어드린 후 [SimpleMath]를 선택합니다.

input 슬롯에 SimpleMath 노드 연결
input 슬롯에 SimpleMath 노드 연결

이렇게 3개의 SimpleMath 노드를 만들고, 아래와 같이 각각 Base 샘플러와 Refiner 샘플러에 연결시켜줍니다. 알아보기 쉽게 이름을 변경시켜두는 게 좋습니다. 여기에서 Steps와 Seed는 정수이므로 INT 출력 슬롯을, CFG는 소수이므로 FLOAT 출력 슬롯에 연결시켜야 합니다.

샘플러에 대한 씨드,CFG,steps 입력 노드 생성
샘플러에 대한 씨드,CFG,steps 입력 노드 생성

그런데 Seed, Steps 등의 노드를 보면 아래에 a,b 변수를 입력해주는 곳이 있습니다. 여기에서는 필요없이 자리만 차지하므로 모두 입력 슬롯으로 바꿔줍니다. 그리고 value 에 값을 넣어줍니다.

샘플러에 대한 씨드,CFG,steps 입력 노드 변경
샘플러에 대한 씨드,CFG,steps 입력 노드 변경

여기서 한가지 짜증스러운 것은  base 샘플러와 refiner 샘플러를 언제 시작하고(start_at_step), 언제 마쳐야 하는가(end_at_step) 하는 것입니다. base 샘플러의 시작시점은 항상 0이니 건들릴 필요가 없고, refiner 샘플러의 종료시점도 현재처럼 10000으로 두면 문제 없습니다. 그런데 base 샘플러의 종료시점과 refiner 샘플러의 시작시점은 항상 동일해야 하며, 전체 steps 수에 일정 비율(저의 경우 30%)로 설정해야 합니다. 이를 자동화 시켜 보겠습니다.

먼저 Simple Math 커스텀 노드를 하나 생성합니다. 그냥 생성할 때에는 아래 그림과 같이 빈 캔버스에서 우클릭하고 Add node -> utils -> Math op를 선택하면 생성됩니다.

아래와 같이 이름을 BasePropotion(base 샘플러의 비율)로 두고 값은 0.7로 입력합니다. a 와  b 는 입력 슬롯으로 변경해줍니다. 

BaseProposition 노드
BaseProposition 노드

또다시 Simple Math 커스텀 노드를 생성합니다. 이름은 StepCalculation으로 변경하고, a와 b를 입력슬롯으로 변경합니다. 다음으로, value 에 a*b라고 입력한 후, a와 b 입력 슬롯을 Steps 및 BasePropotion의 FLOAT 출력 슬롯에 연결합니다. 이렇게 하면 StepCalculation의 value는 Steps의 value(25)와 BasePropotion의 value(0.7)의 곱인 17.5가 됩니다.

StepCalculation 노드
StepCalculation 노드

이제 StepCalculation 의 INT 출력 슬롯을 base 샘플러의 stop_at_steps 입력노드, refiner 샘플러의 start_at_steps 입력노드에 연결해줍니다. StepCalculation의 value는 17.5이지만, INT이므로 17로 자동 설정됩니다.

Base 샘플러와 Refiner 샘플러 연동
Base 샘플러와 Refiner 샘플러 연동

다음으로 Empty Latent Image노드의 width와 height 위젯을 입력 슬롯으로 바꾸고, 여기에 Simple Math 노드를 추가해서 연결해줍니다. 

Image size  설정
Image size  설정

그런데, 지난 글에서 만들어둔 Aspect Ratio 노드의 경우, 실험 결과 이미지 사이즈를 그대로 사용하는 것이 가장 좋은 것 같다고 결론을 내렸습니다. 따라서 이 두개의 노드는 삭제시켜버리고, 대신 위에서 만든 Image width 와 Image height를 4개의 CLIP 노드에 연결시켜줍니다. 결국 Image width와  Image height는 총 5개의 입력 슬롯과 연결시켜야 합니다. 아래 그림은 그 결과입니다(너무 복잡해서 잘 구분이 안되네요. ㅠㅠ)

Image width/height 노드 연결
Image width/height 노드 연결

또, 별로 중요한 것은 아니지만, 어떤 글에 따르면 refiner의 ASCORE 값은 Positive에는 높은 값(6), Negative에는 낮은 값(2)를 두는 것이 좋다고 하여, Ascore 노드를 복사해서(^C, ^V) 편집해 주었습니다.

Ascore Conditioning 수정
Ascore Conditioning 수정

아래는 이렇게 완성된 워크플로입니다. 비슷한 기능을 하는 노드들을 함께 그룹으로 묶었습니다. 이 그림속에 실제 워크플로 메타데이터가 들어있으니, 다운로드 받아서 ComfyUI 캔버스에 떨어뜨리면 동일한 워크플로를 사용할 수 있습니다.

LoRA 추가

LoRA(Low-Rank Adaptation, 저 랭크 적응?)은 Stable Diffusion 모델을 세부 조정하기 위한 학습 기법으로서, 스테이블 디퓨전 모델 중 가장 중요한 부분인 교차 인지(cross-attention) 레이어에 작은 변화를 가합니다. 즉, 진짜 간단하게 축약해 말하자면 스테이블 디퓨전의 모델을 일부 수정하여 다른 형태로 이미지를 생성하는 것입니다. 이것을 ComfyUI 를 통해 알아보겠습니다. 

알아보기 전에 두가지 LoRA를 미리 다운로드 받겠습니다. Pixel Art XLCyborg Style SDXL입니다. 페이지로 들어가서 우측위에 있는 [Download]  버튼을 누르고 ComfyUI_windows_portable\ComfyUI\models\checkpoints 폴더에 넣어주시면 됩니다. (AUTOMATIC1111과 모델을 공유하는 경우에는 stable-diffusion-webui\models\Stable-diffusion 폴더에 넣어주셔도 됩니다) 다운로드가 완료된 후에는 ComfyUI를 새로 시작해줍니다.

먼저 ComfyUI에서 [Load Default] 버튼을 누릅니다. 그러면 아래와 같은 워크플로가 표시됩니다. 가장 왼쪽엔 체크포인트 모델이 있고, 중간에는 텍스트 인코더, 우측에는 샘플러가 있습니다. 모델과 텍스트 인코더를 사용해서 이미지를 생성한다는 것을 알 수 있습니다. 

디폴트 워크플로
디폴트 워크플로

아래는 [Load LoRA]  노드입니다. 이 노드는  캔버스를 우클릭하고 Add Node -> loaders -> Load LoRA를 선택하면 삽입할 수 있습니다. 보시는 것처럼 모델을 받아서 모델을 내보내고, CLIP을 받아서 CLIP을 내보냅니다. 수정된 Model과 CLIP을 내보내는 것입니다. 아래쪽에 있는 strength_mode과  strength_clip은 적용하는 가중치를 설정하는 위젯입니다.

Load LoRA 노드
Load LoRA 노드

이것을 생각하면 디폴트 워크플로에 LoRA 를 끼워넣는 것은 간단합니다. 즉, 아래와 같이 체크포인트 노드에서 나오는 모델과 CLIP 을 잡아온 다음, 여기에서 원래 목적지로 보내는 겁니다. 어떤 워크플로에 추가하던지, 이 방법대로만 하면 LoRA는 쉽게 추가할 수 있습니다. 

Default 워크플로에 LoRA 노드 삽입
Default 워크플로에 LoRA 노드 삽입

아래는  Pixel Art XL LoRA 를 적용하기 전과 후를 비교한 것입니다. 모델은 SDXL 1.0 base + refiner 입니다.

프롬프트: swordfish attacking, angry,  masterpiece, best quality, high quality, good
부정적 프롬프트: nsfw, drawing, worst quality, deformed, low quality, bad
씨드번호: 1984

보시는 것처럼 LoRA가 잘 적용되었습니다. 이제 워크플로를 약간 더 수정해 보겠습니다. 하나의 LoRA를 사용해도 좋지만 여러개를 적용해야 할 수도 있으니, 이를 대비하도록 하겠습니다. 아울러, 현재 워크플로에서는 LoRA를 제거하려면 해당 노드를 삭제하고 다시 링크를 연결해줘야 해서 무척 불편한데, Comfyroll 커스텀 노드를 사용하면 LoRA 를 켰다 껏다 할 수 있어서 무척 편리합니다. Add Node -> Comfyroll -> IO -> CR Load LoRA를 선택하면 Comfyroll에서 제공하는 LoRA 노드를 사용할 수 있습니다. 최대 6개까지 사용할 수 있다고 생각해서 추가해주고, 서로 꼬리를 물고 연결해주면 됩니다. 마지막 노드는 base KSampler 와 Positive/Negative TextEncoder에 연결해주면 되고요. 

아래는 이렇게 해서 생성한 워크플로입니다. 많이 복잡합니다. 사실 저도 너무 복잡해서 그냥 원본 글에 있는 워크플로를 가져와서 약간 수정했습니다.ㅠㅠ 지금 봐도 이렇게 복잡할 필요가 있나... 싶네요.

LoRA를 6개 넣은 워크플로
LoRA를 6개 넣은 워크플로

참고로, 동일한 워크플로를 아래와 같이 직선으로 바꿀 수도 있습니다. 우측에 있는 메뉴에서 오른쪽 위의 기어처럼 생긴 버튼(설정)을 누르면...

설정
설정

아래와 같은 설정이 나오는데, 여기에서 Link Render Mode를 Strait로 설정한 후(Link Render Mode 가 설정 메뉴에 없을 경우에는 ComfyUI-Custom-Scripts 커스텀 노드를 설치하시면 나타납니다), 워크플로를 다시 불러들이면...

Link Render Mode 설정
Link Render Mode 설정

아래와 같이 연결선이 직선으로 바뀝니다. 사실 이렇게 바꾸면 깔끔하기는 한데, 연결 상태를 알아보기는 쉽지 않습니다. 취향에 따라 사용하시면 될 것 같습니다.

링크를 직선으로 처리한 LoRA를 6개 넣은 워크플로
링크를 직선으로 처리한 LoRA를 6개 넣은 워크플로

이상입니다. 이 글은 followfox.ai 의 글중 앞부분만 정리한 글입니다. 뒷부분은 다시 정리하겠습니다.

민, 푸른하늘