개발 노트

ComfyUI로 화풍을 찾고, Toonkit으로 고정하기

워크플로에 흩어진 화풍을 하나의 스타일로 고정하기까지

ComfyUI로 화풍을 찾고, Toonkit으로 고정하기

안녕하세요. Toonkit 개발팀입니다.

지난 글에서는 Toonkit의 My Style LoRA 학습하기 기능을 활용하기 위한 데이터셋 구성 방법과 학습 파라미터 설정 방법을 소개했습니다.

그 글을 읽고 나면 자연스럽게 이런 질문이 생깁니다. 스타일은 일관되고 내용은 다양한 이미지 20장을 어디서 구해야 할까요?

가장 확실한 방법은 직접 만드는 것입니다. 그리고 그 도구로 가장 널리 쓰이는 것이 ComfyUI입니다.

여기서 한 가지 짚고 시작하겠습니다. ComfyUI로 원하는 화풍을 찾아냈다고 해서 그 화풍을 손에 넣은 것은 아닙니다.

ComfyUI에서 만들어 낸 화풍은 결과물이 아니라 절차로 남습니다. 체크포인트 하나, LoRA 몇 개와 각각의 강도, 샘플러와 스케줄러, 업스케일 경로, 노드 연결 순서까지 그 조합 전체가 갖춰져야 같은 그림이 다시 나옵니다. LoRA 하나를 빼거나 강도를 조금 바꾸면 화풍이 흔들립니다. 워크플로를 옮기거나 커스텀 노드 버전이 달라져도 마찬가지입니다. 화풍이 파일이 아니라 워크플로에 묶여 있는 상태입니다.

컷을 여러 장 만들어야 하는 작업에서는 이 의존성이 그대로 비용이 됩니다. 컷마다 같은 조건을 다시 맞춰야 하고, 조금이라도 어긋나면 선화와 색감이 컷 사이에서 달라집니다.

Toonkit의 My Style은 이 지점을 해결합니다. 워크플로로 찾아낸 화풍을 20장의 이미지로 학습시키면, 그 화풍이 LoRA 파일 하나로 확정됩니다. 이후에는 노드 구성을 재현할 필요 없이 그 스타일을 불러오기만 하면 됩니다. 절차로 흩어져 있던 화풍이 고정된 스타일이 되는 것입니다.

그래서 이 글의 목적은 ComfyUI를 능숙하게 다루는 것이 아닙니다. 내 화풍을 정의할 20장을 만들 수 있을 만큼만 ComfyUI를 이해하는 것입니다. CivitAI와 ComfyUI의 관계부터 워크플로를 읽는 방법, LoRA를 쌓고 섞는 방법, 업스케일 방법, 그리고 애니메이션 스타일 이미지를 만들 때 알아두면 좋은 내용까지 차근차근 설명하겠습니다.

ComfyUI는 노드가 복잡하게 연결된 화면 때문에 어렵게 느껴지기 쉽습니다. 하지만 모든 워크플로는 공통된 여섯 단계로 이루어져 있습니다. 이 골격만 이해하면 처음 보는 워크플로도 읽을 수 있습니다.

또한 이번 글에서 소개하는 설정값은 모든 상황에 적용되는 절대적인 정답이 아닙니다. 사용하는 모델과 목표 스타일에 따라 적절한 값은 달라질 수 있으므로, 학습과 생성을 시작할 때 참고할 수 있는 기준으로 활용해 주세요.

ComfyUI 설치 방법은 공식 문서에 잘 정리되어 있으므로 이번 글에서는 다루지 않고, 설치 이후의 사용 방법에 집중하겠습니다.

1. ComfyUI와 CivitAI는 어떤 관계인가요?

ComfyUI를 시작할 때 가장 많이 혼란을 겪는 부분이 이 두 서비스의 역할입니다. 이름이 함께 언급되는 경우가 많지만 하는 일이 완전히 다릅니다.

1.1 역할이 서로 다릅니다

CivitAI는 모델 저장소이면서 결과물 갤러리입니다. 다른 사람들이 만든 모델을 내려받고, 그 모델로 생성한 이미지와 설정값을 살펴보는 곳입니다. CivitAI가 이미지를 만들어 주는 것은 아닙니다.

ComfyUI는 실행 엔진입니다. 내려받은 모델을 조립해서 실제로 이미지를 생성하는 프로그램입니다.

비유하자면 CivitAI는 식자재 마트와 요리 사진 게시판을 합친 곳이고, ComfyUI는 내 주방입니다. 마트에서 재료를 사고 다른 사람의 요리 사진과 레시피를 참고한 뒤, 실제 조리는 내 주방에서 하는 구조입니다.

1.2 베이스 모델 계열을 먼저 확인해 주세요

모델에는 계열이 있습니다. 계열이 서로 맞지 않으면 LoRA를 불러와도 아무 변화가 생기지 않거나 오류가 발생합니다.

  • SDXL: 범용 계열입니다. 자연어와 태그를 함께 사용하고 네거티브 프롬프트를 사용합니다.
  • Pony: score_9, score_8_up처럼 점수 태그를 사용하는 문법이 특징입니다.
  • Illustrious / NoobAI: 애니메이션 스타일에 특화된 계열입니다. Danbooru 태그를 기준으로 프롬프트를 작성합니다.
  • Flux.1: 자연어 문장을 잘 이해하는 계열입니다. 네거티브 프롬프트가 없습니다.
  • Anima: 애니메이션 일러스트를 중심으로 학습된 계열입니다. Flux처럼 모델 본체와 텍스트 인코더, VAE를 각각 따로 불러오며, 텍스트 인코더로 Qwen 계열을 사용합니다.

즉, SDXL용 LoRA를 Flux 모델에 사용할 수는 없습니다. 반대의 경우도 마찬가지입니다. LoRA를 내려받기 전에 모델 페이지에 표시된 베이스 모델을 확인하는 습관을 들이면 이런 문제를 피할 수 있습니다.

2. 생성 정보를 읽는 방법

CivitAI에서 마음에 드는 이미지를 발견했을 때, 그 이미지를 어떻게 만들었는지 확인할 수 있습니다. 이것이 생성 정보입니다.

2.1 생성 정보에는 무엇이 들어 있나요?

이미지 상세 페이지에서 다음과 같은 항목을 확인할 수 있습니다.

Screenshot 2026-08-05 at 12.23.44 PM.pngScreenshot 2026-08-05 at 12.23.44 PM.png

  • 프롬프트(긍정 조건)
  • 네거티브 프롬프트(부정 조건)
  • Steps
  • Sampler와 Scheduler
  • CFG Scale
  • Seed
  • 이미지 크기
  • 사용한 모델 이름
  • 사용한 LoRA와 가중치
  • Clip skip
  • 업스케일 관련 설정

이 값들을 ComfyUI의 해당 노드에 그대로 옮기면 비슷한 결과를 얻을 수 있습니다.

다만 완전한 재현을 목표로 삼을 필요는 없습니다. 노드 연결이나 커스텀 노드처럼 생성 정보에 기록되지 않는 항목이 있기 때문에, 다른 사람의 이미지를 똑같이 되살리는 것은 대체로 불가능합니다. 우리의 목적은 원하는 화풍의 이미지를 원하는 만큼 만드는 것이므로, 생성 정보는 출발점을 알려 주는 참고 자료로 활용하면 충분합니다.

2.2 각 항목은 무엇을 의미하나요?

지난 글에서 다룬 Training Step이나 Learning Rate는 학습에 사용하는 값입니다. 여기서 설명하는 값은 이미지를 생성할 때 사용하는 값이므로 서로 다릅니다.

Steps는 이미지를 몇 단계에 걸쳐 완성할지 정하는 값입니다. 보통 20에서 35 사이를 사용합니다. Flux 계열은 비교적 적은 단계로도 결과가 나옵니다. 무조건 높일수록 좋아지는 것은 아니며, 일정 수준을 넘으면 시간만 늘어납니다.

CFG Scale은 프롬프트를 얼마나 강하게 따를지 정하는 값입니다. 값이 낮으면 모델이 자유롭게 그리고, 높으면 프롬프트를 강하게 따르지만 색이 과하게 진해지거나 이미지가 부자연스러워질 수 있습니다. 계열별로 적정 범위가 다릅니다.

Flux 계열은 CFG 대신 FluxGuidance라는 값을 사용합니다. 이 값은 대체로 3.5를 사용합니다. Flux 워크플로를 여러 개 살펴보면 이 값이 거의 예외 없이 3.5로 설정되어 있는 것을 확인할 수 있습니다. 특별한 이유가 없다면 이 값을 그대로 두고 시작해 주세요.

Sampler와 Scheduler는 이미지를 완성해 가는 방식입니다. 계열별로 관례가 뚜렷합니다.

  • SDXL과 Illustrious 계열: dpmpp_2m + karras 조합이 널리 쓰입니다.
  • Flux 계열: euler + simple 조합을 사용합니다.
  • Anima 계열: res_2s, res_3m, er_sde처럼 다소 생소한 Sampler와 beta57 Scheduler를 사용하는 경우가 있습니다.

Clip skip은 텍스트 인코더의 마지막 몇 단계를 건너뛰는 설정입니다. 애니메이션 스타일 모델에서는 -2를 사용하는 것이 관례입니다. ComfyUI에서는 CLIPSetLastLayer 노드로 설정합니다.

Seed는 이미지의 시작점이 되는 무작위 값입니다. 같은 설정에 같은 Seed를 넣으면 같은 결과가 나옵니다. 이 값 하나로 재현 여부가 갈립니다.

이미지 크기는 모델이 학습된 크기에 맞추는 것이 좋습니다. SDXL 계열에서는 832×1216, 1024×1024, 896×1152 같은 크기가 널리 쓰입니다. 이 범위를 크게 벗어나면 인물이 여러 명 생기거나 구도가 무너질 수 있습니다.

3. 워크플로를 읽는 방법

3.1 모든 워크플로는 여섯 단계입니다

처음 ComfyUI 화면을 보면 노드와 선이 복잡하게 얽혀 있어 막막하게 느껴집니다. 하지만 어떤 워크플로든 다음 여섯 단계로 정리됩니다.

  1. 모델 로드: 사용할 모델을 불러옵니다.

    Screenshot 2026-08-05 at 12.25.28 PM.pngScreenshot 2026-08-05 at 12.25.28 PM.png

    Screenshot 2026-08-05 at 12.25.17 PM.pngScreenshot 2026-08-05 at 12.25.17 PM.png

  2. 프롬프트 인코딩: 텍스트를 모델이 이해하는 형태로 바꿉니다.

    Screenshot 2026-08-05 at 12.25.38 PM.pngScreenshot 2026-08-05 at 12.25.38 PM.png

  3. 빈 캔버스 생성: 만들 이미지의 크기를 정합니다.

    Screenshot 2026-08-05 at 12.27.53 PM.pngScreenshot 2026-08-05 at 12.27.53 PM.png

  4. 샘플링: 실제로 이미지를 만드는 단계입니다.

    Screenshot 2026-08-05 at 12.25.58 PM.pngScreenshot 2026-08-05 at 12.25.58 PM.png

  5. 디코드: 결과를 눈에 보이는 이미지로 변환합니다.

    Screenshot 2026-08-05 at 12.26.03 PM.pngScreenshot 2026-08-05 at 12.26.03 PM.png

  6. 저장: 파일로 저장합니다.

처음 보는 워크플로를 만나면 각 노드를 이 여섯 칸에 나누어 넣어 보세요. 노드가 30개가 넘어가더라도 대부분은 4번 샘플링 앞뒤에 붙은 보조 단계입니다.

3.2 가장 단순한 형태 — SDXL 계열

Screenshot 2026-08-05 at 12.30.46 PM.pngScreenshot 2026-08-05 at 12.30.46 PM.png

SDXL이나 Illustrious 계열은 구조가 단순합니다.

CheckpointLoaderSimple
  → CLIPSetLastLayer(-2)
  → LoraLoader
  → CLIPTextEncode(긍정) / CLIPTextEncode(부정)
  → KSampler
  → VAEDecode
  → SaveImage

노드가 열 개 남짓이면 이 형태입니다. Checkpoint 하나에 필요한 요소가 모두 들어 있어서 로드 단계가 간단합니다.

실제 예를 살펴보면 다음과 같은 설정을 사용합니다.

  • 이미지 크기: 832×1216
  • Clip skip: 2
  • Steps: 25
  • CFG: 2.5
  • Sampler와 Scheduler: dpmpp_2m + karras

여기서 한 가지 눈여겨볼 점이 있습니다. 이 예에서는 디테일을 추가하는 LoRA의 가중치를 1.75로 설정했습니다. LoRA 가중치의 상한은 1.0이 아닙니다. 1.0을 넘겨 사용하는 경우도 있습니다. 다만 값을 높일수록 이미지가 불안정해질 수 있으므로 조금씩 올리며 확인해 주세요.

3.3 Flux 계열은 생김새가 다릅니다

Screenshot 2026-08-05 at 12.33.17 PM.pngScreenshot 2026-08-05 at 12.33.17 PM.png

Flux 워크플로를 처음 보면 SDXL과 너무 달라서 당황하기 쉽습니다. 다른 점은 세 가지입니다.

첫째, 로드 노드가 세 개로 나뉘어 있습니다.

UNETLoader(모델 본체)
DualCLIPLoader(텍스트 인코더 두 개)
VAELoader(VAE)

파일을 넣는 폴더도 각각 다릅니다. 모델 본체는 models/unet/, 텍스트 인코더는 models/clip/, VAE는 models/vae/에 넣어야 합니다. 폴더를 잘못 넣으면 파일을 제대로 내려받았는데도 목록에 나타나지 않습니다.

둘째, 네거티브 프롬프트가 없습니다. Flux 계열에는 부정 프롬프트를 입력하는 노드가 없습니다. SDXL을 쓰던 분들이 가장 당황하는 부분입니다. 원하지 않는 요소를 제거하려면 긍정 프롬프트를 더 구체적으로 작성하는 방향으로 접근해야 합니다.

셋째, CFG 대신 FluxGuidance를 사용합니다. 앞서 설명한 것처럼 3.5를 기본값으로 두고 시작하면 됩니다.

또한 Flux 워크플로에서는 LoraLoader 대신 LoraLoaderModelOnly를 사용하는 경우가 많습니다. 이 노드는 모델 쪽에만 LoRA를 적용하고 텍스트 인코더에는 적용하지 않습니다.

3.4 Anima 계열은 무엇이 다른가요?

Screenshot 2026-08-05 at 12.23.44 PM.pngScreenshot 2026-08-05 at 12.23.44 PM.png

Anima 계열은 Flux처럼 로드 노드가 나뉘어 있지만 불러오는 파일이 다릅니다.

UNETLoader(anima 계열 모델)
CLIPLoader(qwen 계열 텍스트 인코더)
VAELoader(qwen 계열 VAE)

CLIPLoader 노드에는 type을 선택하는 항목이 있습니다. 이 값을 qwen_image로 맞춰 주세요. 다른 값으로 설정하면 프롬프트가 제대로 반영되지 않습니다.

실제로 사용되는 설정은 다음과 같습니다.

  • Steps: 25 전후
  • CFG: 4에서 4.5 사이
  • Sampler와 Scheduler: res_3m + beta57

Anima 계열은 텍스트 인코더가 다르기 때문에 프롬프트를 작성하는 감각도 조금 다릅니다. 태그를 나열하는 방식과 문장으로 서술하는 방식을 모두 시도해 보고 결과를 비교하는 것이 좋습니다.

로드 노드가 나뉘어 있는 계열은 처음부터 노드를 직접 연결하면 실수하기 쉽습니다. 이미 만들어진 워크플로를 불러와 값만 조정하는 방식을 권장합니다.

4. LoRA를 쌓고 섞는 방법

지난 글에서는 LoRA를 학습하는 방법을 다뤘습니다. 이번에는 학습된 LoRA를 사용하는 방법입니다.

4.1 LoRA는 체인처럼 이어집니다

Screenshot 2026-08-05 at 12.35.29 PM.pngScreenshot 2026-08-05 at 12.35.29 PM.png

LoRA는 여러 개를 이어서 사용할 수 있습니다. 모델이 첫 번째 LoRA를 지나고, 그 결과가 두 번째 LoRA를 지나는 방식입니다.

모델 → LoRA 1 → LoRA 2 → LoRA 3 → 샘플러

LoRA를 불러오는 노드에는 강도를 조절하는 항목이 두 개 있습니다.

  • strength_model: 모델 본체에 적용하는 강도입니다. 형태와 생김새에 영향을 줍니다.
  • strength_clip: 텍스트 인코더에 적용하는 강도입니다. 프롬프트를 해석하는 방식에 영향을 줍니다.

이 두 값을 따로 조절할 수 있다는 점이 중요합니다. strength_clip을 지나치게 높이면 프롬프트의 의미가 왜곡되어 원하는 내용이 생성되지 않을 수 있습니다.

4.2 어느 정도 강도로 시작하면 좋을까요?

처음에는 다음 값을 기준으로 시작해 볼 수 있습니다.

  • 스타일 LoRA: 0.6 전후
  • 캐릭터 LoRA: strength_model 0.9 / strength_clip 0.7
  • 의상이나 소품 LoRA: 0.4 전후

그리고 다음 두 가지 원칙을 지켜 주세요.

첫째, 캐릭터 LoRA는 한 번에 하나만 사용해 주세요. 스타일이나 배경 LoRA는 여러 개를 겹쳐도 괜찮지만, 캐릭터 LoRA를 두 개 이상 켜면 얼굴이 섞여 무너지는 경우가 많습니다.

둘째, 반드시 하나씩 단독으로 시험한 뒤 합쳐 주세요. LoRA 다섯 개를 한꺼번에 켜고 결과가 이상하면 어떤 LoRA가 원인인지 알 수 없습니다. 하나씩 켜서 각각의 효과를 확인하고, 그다음에 조합해 주세요.

비교할 때는 Seed를 고정해야 합니다. Seed가 바뀌면 LoRA 때문에 달라진 것인지 Seed 때문에 달라진 것인지 구분할 수 없습니다.

4.3 LoRA를 몇 개까지 쌓아도 될까요?

실제 사례를 두 가지 비교해 보겠습니다.

LoRA를 하나만 사용한 경우가 있습니다. 배경 스타일 LoRA 하나를 강도 1.0으로 사용했습니다. 구성이 단순하지만 결과는 충분히 나옵니다.

LoRA를 열 개 쌓은 경우도 있습니다. 손 보정, 블러 억제, 디테일 추가, 애니메이션 스타일, 색감 강화 등을 각각 담당하는 LoRA를 강도 0.25에서 1.0 사이로 조합했습니다. 화면은 화려하지만 문제가 있습니다.

  • 어떤 LoRA가 어떤 역할을 하는지 파악하기 어렵습니다.
  • 하나를 바꾸면 전체 균형이 무너집니다.
  • 같은 조합을 다시 만들어 내기 어렵습니다.
  • 무엇이 목표 스타일인지 정의되지 않습니다.

특히 마지막 항목이 중요합니다. 이 상태가 바로 앞에서 말한 워크플로 의존성입니다. 화풍이 열 개의 파일과 열 개의 숫자에 흩어져 있고, 그중 하나만 어긋나도 결과가 달라집니다.

학습 데이터를 만들 목적이라면 LoRA를 적게 사용하는 쪽이 유리합니다. 지난 글에서 여러 스타일을 하나의 데이터셋에 섞지 말라고 안내했는데, LoRA를 열 개 겹치면 그 자체로 여러 스타일이 뒤섞인 상태가 됩니다.

4.4 트리거 단어를 빼먹지 말아 주세요

Screenshot 2026-08-05 at 12.37.24 PM.pngScreenshot 2026-08-05 at 12.37.24 PM.png

LoRA를 불러왔는데도 아무 변화가 없다면 트리거 단어를 확인해 주세요.

지난 글에서 설명했듯이 트리거 단어는 학습한 스타일을 불러오기 위한 고유한 단어입니다. LoRA를 만든 사람이 학습할 때 사용한 단어를 프롬프트에 넣어야 효과가 나타나는 경우가 많습니다.

CivitAI 모델 페이지에는 Trigger Words 항목이 표시되어 있습니다. LoRA를 내려받을 때 이 항목을 함께 확인하는 습관을 들여 주세요.

4.5 쌓기와 섞기는 다릅니다

여기까지는 LoRA를 그냥 이어 붙이는 방법이었습니다. 이것을 쌓기라고 하겠습니다.

그런데 LoRA를 쌓다 보면 이런 문제를 만나게 됩니다.

  • 스타일 LoRA 두 개를 함께 켜면 화질이 무너집니다.
  • 캐릭터 LoRA를 켜면 화풍까지 함께 바뀝니다.
  • 강도를 낮추면 효과가 사라지고, 높이면 다른 요소를 망칩니다.

강도만 조절해서는 해결되지 않는 문제들입니다. 이럴 때 사용할 수 있는 방법을 난이도 순으로 소개하겠습니다.

1단계: 강도를 분리합니다

가장 간단하고 효과가 빠른 방법입니다.

캐릭터 LoRA가 화풍까지 바꿔 버린다면 strength_clip만 낮춰 보세요. 모델 쪽 강도는 유지하면서 프롬프트 해석에 미치는 영향만 줄일 수 있습니다.

앞서 소개한 0.9 / 0.7 조합이 이 원리를 적용한 예입니다.

2단계: 순서와 강도를 고정 조건에서 비교합니다

LoRA를 이어 붙이는 순서에 따라 결과가 달라집니다. Seed를 고정한 상태에서 순서만 바꿔 비교해 보세요.

ComfyUI-Inspire-Pack에 포함된 XY Input: Lora Block Weight 노드를 사용하면 여러 설정을 격자 형태로 자동 비교할 수 있습니다. 하나씩 손으로 돌려 볼 필요가 없어집니다.

3단계: 블록 단위로 적용 범위를 제한합니다

가장 실용적인 방법입니다.

ComfyUI-Inspire-PackLora Loader (Block Weight) 노드를 사용하면 LoRA를 모델 전체가 아니라 일부 블록에만 적용할 수 있습니다.

이 노드가 만들어진 목적이 바로 여러 LoRA를 함께 사용할 때 발생하는 화질 저하를 완화하는 것입니다.

스타일 LoRA 두 개가 충돌할 때, 한쪽을 일부 블록으로 제한하면 두 스타일을 모두 살릴 수 있습니다.

설정은 블록별 가중치를 나열하는 방식으로 입력합니다. 예를 들어 특정 블록만 값을 주고 나머지를 0으로 두는 형태입니다. 모델 계열에 따라 블록 개수가 다르며, 하위 블록까지 세분해서 지정할 수도 있습니다.

다만 어느 블록이 화풍을 담당하고 어느 블록이 구도를 담당하는지는 공식적으로 정리되어 있지 않습니다. 커뮤니티에서 경험적으로 공유되는 내용만 있는 상태이므로, 앞서 소개한 XY 비교 노드로 직접 돌려 보며 찾는 방식을 권장합니다.

4단계: 적용 구간을 나눕니다

이미지 생성은 여러 단계에 걸쳐 진행됩니다. 그리고 앞쪽 단계에서 전체 구도가 결정되고, 뒤쪽 단계에서 세부 묘사가 결정됩니다.

이 성질을 이용하면 LoRA를 필요한 구간에만 적용할 수 있습니다.

  • 캐릭터 LoRA를 뒤쪽 구간에만 적용하면, 구도는 베이스 모델이 잡고 얼굴만 캐릭터 특징을 따르게 됩니다.
  • 스타일 LoRA를 앞쪽 구간에만 적용하면, 화풍은 잡히고 세부 묘사 단계는 자유롭게 진행됩니다.
  • 강도를 0에서 1로 서서히 올리는 방식도 가능합니다.

이 기능은 ComfyUI에 기본으로 포함되어 있어 커스텀 노드를 설치할 필요가 없습니다. 다음 노드를 연결해서 사용합니다.

Create Hook LoRA
  → Create Hook Keyframes Interp.
  → Set Hook Keyframes
  → Set CLIP Hooks → Cond Pair Set Props → 샘플러

start_percent로 적용 시점을 지정합니다. 0.0이 시작, 1.0이 끝이며 0.5는 중간 지점입니다. strength_mult로 그 시점의 강도를 조절합니다.

한 가지 주의할 점이 있습니다. schedule_clip 항목을 켜면 생성 시간이 크게 늘어납니다. 필요한 경우에만 사용해 주세요.

5단계: 영역별 적용과 파일 병합

여기까지 오면 활용 범위가 상당히 넓어집니다. 이번 글에서는 어떤 방법이 있는지만 소개하겠습니다.

영역별 적용은 이미지의 영역마다 다른 LoRA를 적용하는 방법입니다. 화면에 캐릭터가 두 명 등장할 때 각각에게 다른 캐릭터 LoRA를 적용할 수 있습니다. 두 캐릭터의 자세를 일관되게 유지하기 위해 ControlNet을 함께 사용합니다. 이때 마스크를 지정하지 않은 영역은 색이 뜬 것처럼 보이는 얼룩이 생길 수 있으므로 기본값을 지정하는 노드를 함께 사용해야 합니다.

파일 병합은 여러 LoRA를 하나의 파일로 합치는 방법입니다. LoRA Power-Merger 같은 커스텀 노드를 사용하며, 단순히 가중치를 더하는 방식부터 특이값 분해를 이용하는 정교한 방식까지 여러 알고리즘을 선택할 수 있습니다.

5. 업스케일과 하이레스

5.1 네 가지 방식이 있습니다

해상도를 높이는 방법은 크게 네 가지입니다. 성격이 서로 다릅니다.

첫째, 업스케일 모델만 사용하는 방식입니다. UpscaleModelLoaderImageUpscaleWithModel 노드를 사용합니다. 빠르지만 없던 세부 묘사가 생기지는 않습니다. 애니메이션 선화의 경우 선이 뭉개질 위험이 있습니다.

둘째, 잠재 공간에서 확대하는 방식입니다. LatentUpscaleBy 노드를 사용합니다. 원본과 완전히 같은 결과가 나오지는 않습니다.

셋째, 2패스 하이레스 방식입니다. 한 번 생성한 뒤 확대하고, 낮은 강도로 다시 생성합니다. 세부 묘사가 실제로 추가되므로 결과가 가장 좋습니다. 학습 데이터를 만들 목적이라면 이 방식을 권장합니다.

넷째, Ultimate SD Upscale입니다. ComfyUI_UltimateSDUpscale 커스텀 노드를 사용합니다. 이미지를 타일로 나누어 처리하기 때문에 큰 해상도에서도 메모리 부담이 적습니다. 다만 재생성 강도를 낮게 설정해도 세부 묘사에 변형이 발생하므로, 20장 사이에서 처리 방식이 달라지지 않도록 모든 이미지에 같은 설정을 적용해 주세요.

5.2 2패스 하이레스가 무엇인가요?

가장 권장하는 방식이므로 자세히 설명하겠습니다.

1차 샘플링 (강도 1.0으로 이미지 생성)
  → VAEDecode
  → 업스케일 모델로 확대
  → 원하는 크기로 조정
  → VAEEncode
  → 2차 샘플링 (낮은 강도로 다시 생성)   ← 여기가 핵심입니다

핵심은 2차 샘플링의 강도, 즉 denoise 값입니다.

  • 0.3보다 낮으면 세부 묘사가 거의 추가되지 않고 흐릿한 상태로 남습니다.
  • 0.4에서 0.5 사이가 일반적으로 권장되는 구간입니다.
  • 0.35 전후는 원래 구도를 최대한 지키면서 세부 묘사만 얹는 보수적인 설정입니다.

너무 높이면 원래 이미지와 다른 이미지가 되어 버립니다. 학습 데이터를 만들 때는 구도가 유지되는 것이 중요하므로 낮은 쪽에서 시작해 조금씩 올려 주세요.

5.3 애니메이션은 전용 업스케일 모델을 사용해 주세요

업스케일 모델은 어떤 이미지로 학습했는지에 따라 성격이 다릅니다. 실사 사진용 모델을 애니메이션 이미지에 사용하면 선이 부러지거나 노이즈가 생깁니다.

애니메이션 스타일이라면 다음 모델을 먼저 시도해 보세요.

  • RealESRGAN_x4plus_anime_6B: 애니메이션 전용입니다. 선화를 잘 보존합니다.
  • 4x-AnimeSharp 또는 2x-AnimeSharpV2: 애니메이션 전용이며 결과가 선명합니다.
  • 4x_NMKD-Siax_200k: 실사와 애니메이션 모두 무난하게 처리합니다.
  • 4x-UltraSharp: 선명한 디지털 아트에 적합합니다.
  • remacri_original: 비교적 부드러운 질감을 만듭니다.

업스케일 결과는 반드시 100퍼센트 크기로 확대해서 확인해 주세요. 축소된 화면에서는 선이 뭉개진 것을 알아채기 어렵습니다.

6. 애니메이션 스타일 이미지를 만들 때 알아두면 좋은 것

Toonkit을 사용하시는 분들께 가장 실용적인 내용입니다.

6.1 계열마다 프롬프트 문법이 다릅니다

같은 프롬프트를 다른 계열 모델에 넣으면 결과가 크게 달라집니다. 문법이 다르기 때문입니다.

Pony 계열은 점수 태그를 사용합니다.

score_9, score_8_up, score_7_up, ...

Illustrious 계열은 품질 태그를 사용합니다.

masterpiece, best quality, ...

여기서 반드시 알아 두어야 할 점이 있습니다. Illustrious 계열에 Pony의 점수 태그를 넣어도 모델이 이해하지 못합니다. 다른 계열에서 복사한 프롬프트를 그대로 사용하면 앞부분 태그가 전부 무의미해질 수 있습니다.

NoobAI 계열의 품질 태그는 학습 데이터의 품질 순위와 대응합니다.

  • masterpiece: 상위 5퍼센트
  • best quality: 상위 5에서 15퍼센트
  • good quality: 상위 15에서 40퍼센트
  • normal quality: 상위 40에서 70퍼센트
  • worst quality: 하위 30퍼센트

Flux 계열은 품질 태그가 의미를 갖지 않습니다. 태그를 나열하는 대신 문장으로 서술해 주세요.

6.2 Danbooru 태그 문법을 알아 두세요

Illustrious 계열은 Danbooru의 태그를 기준으로 학습되었습니다. 그래서 프롬프트도 그 태그 체계에 맞춰 작성해야 합니다.

  • 앞에 쓴 태그가 강하게 작용합니다. 뒤로 갈수록 영향이 약해집니다. 중요한 요소를 앞에 배치해 주세요.
  • 태그가 실제로 존재하는지 확인해 주세요. Danbooru에 없는 표현을 넣으면 모델이 반응하지 않습니다.
  • 캐릭터 이름은 Danbooru의 표기 순서를 그대로 사용해 주세요.
  • 색상은 대상 앞에 붙여 주세요. black coat처럼 작성합니다.
  • 괄호가 포함된 태그는 역슬래시로 처리해 주세요. star \(symbol\)처럼 작성합니다. 그렇지 않으면 강조 문법으로 해석됩니다.
  • 프롬프트가 지나치게 길어지면 뒷부분이 반영되지 않습니다. 대략 250단어 정도를 상한으로 생각해 주세요.

6.3 연도 태그로 화풍의 시대를 바꿀 수 있습니다

Illustrious와 NoobAI 계열에는 그림이 그려진 시기를 나타내는 태그가 있습니다.

  • old: 2005년에서 2010년
  • early: 2011년에서 2014년
  • mid: 2014년에서 2017년
  • recent: 2018년에서 2020년
  • newest: 2021년에서 2024년

이 태그 하나만 바꿔도 화풍이 눈에 띄게 달라집니다. 눈의 표현, 선의 굵기, 채색 방식이 각 시대의 경향을 따르게 됩니다.

지난 글에서 1990년대 셀 애니메이션 느낌의 스타일을 예로 들었습니다. 그런 복고풍 화풍을 만들고 싶다면 이 태그가 직접적인 도구가 됩니다. 반대로 최신 경향의 그림을 원한다면 newest를 사용합니다.

다른 조건을 모두 고정하고 이 태그만 바꿔 비교해 보세요. 목표 스타일을 찾는 가장 빠른 방법 중 하나입니다.

6.4 권장 생성 설정

Illustrious 계열을 기준으로 다음 설정에서 시작해 볼 수 있습니다.

  • CFG는 6을 넘기지 마세요. 색이 과하게 진해집니다. 3에서 시작해 조금씩 올리는 방식을 권장합니다.
  • Steps는 20에서 32 사이를 사용합니다.
  • Samplereuler를 권장하는 자료도 있고, dpmpp_2m + karras 조합이 널리 쓰이기도 합니다. 두 가지를 직접 비교해 보세요.
  • Clip skip은 2 로 설정합니다.
  • 이미지 크기는 832×1216 같은 표준 크기를 사용합니다.

체크포인트 페이지에 제작자가 권장하는 설정이 적혀 있는 경우가 많습니다. 있다면 그 값을 우선 참고해 주세요.

6.5 네거티브 프롬프트와 임베딩

애니메이션 스타일 생성에서 널리 사용되는 네거티브 프롬프트 구성은 다음과 같습니다.

worst quality, low quality, lowres, jpeg artifacts, watermark, artist name,
bad anatomy, bad hands, extra fingers, fused fingers, missing fingers

특정 요소를 더 강하게 억제하려면 강조 문법을 사용할 수 있습니다.

(bad hands:1.3), (extra fingers:1.3), (six fingers:1.4)

또한 네거티브 프롬프트를 미리 묶어 놓은 임베딩 파일을 사용하는 방법도 있습니다. models/embeddings/ 폴더에 파일을 넣고 프롬프트에서 embedding:파일이름 형태로 호출합니다. 긴 네거티브 프롬프트를 짧게 정리할 수 있습니다.

다만 Flux 계열에는 네거티브 프롬프트가 없습니다. 계열을 먼저 확인한 뒤 사용해 주세요.

7. 자주 겪는 문제

빨간 노드가 표시됩니다. 커스텀 노드가 설치되지 않았습니다. ComfyUI Manager에서 Install Missing Custom Nodes를 실행하고 재시작해 주세요.

모델을 내려받았는데 목록에 없습니다. 폴더 위치를 확인해 주세요. Flux 계열 모델은 models/unet/에 넣어야 합니다.

LoRA를 켰는데 아무 변화가 없습니다. 베이스 모델 계열이 맞는지 확인해 주세요. SDXL용 LoRA는 Flux 모델에서 작동하지 않습니다.

LoRA를 켰는데 스타일만 나타나지 않습니다. 트리거 단어를 확인해 주세요. CivitAI 모델 페이지의 Trigger Words 항목을 프롬프트에 추가해야 합니다.

Flux에서 네거티브 프롬프트 입력란을 찾을 수 없습니다. Flux 계열에는 네거티브 프롬프트가 없습니다. FluxGuidance 값으로 조절해 주세요.

색이 뭉개지고 전체적으로 흐립니다. VAE가 모델과 맞지 않을 수 있습니다. Flux는 전용 VAE를, Anima는 qwen 계열 VAE를 사용해야 합니다.

프롬프트를 잘 따르지 않습니다. LoRA의 strength_clip이 너무 높을 수 있습니다. 낮춰서 비교해 주세요.

Illustrious 모델에서 score_9가 작동하지 않습니다. 점수 태그는 Pony 계열 문법입니다. masterpiece, best quality로 바꿔 주세요.

업스케일 후 선이 뭉개집니다. 실사용 업스케일 모델을 사용했을 가능성이 높습니다. 애니메이션 전용 모델로 바꾸고, 업스케일 모델만 쓰는 대신 2패스 하이레스를 사용해 주세요.

하이레스를 적용했는데도 흐립니다. 2차 샘플링의 denoise가 0.3보다 낮을 수 있습니다. 0.4에서 0.5 사이로 올려 보세요.

만든 이미지가 모두 비슷합니다. 프롬프트만 바꾸고 Seed를 고정하면 구도가 서로 닮습니다. Seed도 함께 바꿔 주세요.

8. 마무리

지금까지 ComfyUI로 이미지를 만드는 방법을 살펴보았습니다. 내용이 많았지만 핵심은 세 가지로 정리됩니다.

첫째, 모든 워크플로는 여섯 단계입니다. 모델 로드, 프롬프트 인코딩, 빈 캔버스, 샘플링, 디코드, 저장입니다. 처음 보는 워크플로도 이 여섯 칸에 나누어 넣으면 읽을 수 있습니다.

둘째, 계열마다 문법이 다릅니다. SDXL, Pony, Illustrious, Flux, Anima는 프롬프트 작성 방식과 노드 구성이 다릅니다. 다른 계열의 설정을 그대로 복사하면 작동하지 않습니다.

셋째, 여기서 찾아낸 화풍은 아직 워크플로에 묶여 있습니다. 체크포인트와 LoRA 조합, 강도, 샘플러, 업스케일 경로가 모두 갖춰져야 같은 그림이 다시 나옵니다. 컷이 늘어날수록 이 조건을 매번 맞추는 일이 부담이 되고, 조금만 어긋나도 컷 사이에서 화풍이 흔들립니다.

그래서 마지막 단계가 필요합니다. ComfyUI에서 찾아낸 화풍을 20장으로 정리해 Toonkit의 My Style LoRA 학습하기 기능에 올려 주세요. 학습이 끝나면 그 화풍은 절차가 아니라 스타일 하나로 확정됩니다. 이후에는 워크플로를 재현하지 않아도, 노드를 다시 연결하지 않아도, 컷을 만들 때 같은 화풍이 유지됩니다.

처음부터 완벽한 워크플로를 만들려고 하지 마세요. 공식 템플릿이나 CivitAI의 워크플로를 불러와서 값을 조금씩 바꾸며 결과를 비교하는 것이 가장 빠른 방법입니다. 목표는 완벽한 워크플로가 아니라, 내 화풍을 정의할 수 있는 20장입니다.

#Style LoRA#Civitai#ComfyUI