- Published on
SDXL 로라·컨트롤넷 조합 성능 튜닝 실전
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
서로 다른 목적의 보조모델인 LoRA와 ControlNet을 SDXL에서 동시에 얹으면, “원하던 스타일은 나오는데 구도가 무너진다” 혹은 “구도는 맞는데 질감이 죽는다” 같은 상충 문제가 자주 발생합니다. 게다가 SDXL은 기본 베이스 자체가 무겁기 때문에, 조금만 욕심내면 속도 저하와 VRAM 부족까지 같이 옵니다.
이 글은 SDXL에서 LoRA·ControlNet 조합을 품질, 일관성, 속도, VRAM 네 축으로 나눠서 튜닝하는 실전 절차를 정리합니다. 목표는 감으로 만지는 슬라이더가 아니라, 원인별로 손대야 할 파라미터 우선순위를 세우는 것입니다.
전제: SDXL 파이프라인에서 충돌이 생기는 이유
SDXL에서 LoRA는 대개 “스타일/캐릭터/재질” 같은 분포를 바꾸는 힘이고, ControlNet은 “포즈/에지/깊이/구도” 같은 조건을 강제하는 힘입니다. 둘을 동시에 쓰면 다음의 힘들이 경쟁합니다.
- LoRA가 강하면: 스타일은 잘 먹지만 ControlNet 조건이 희미해지거나, 포즈가 틀어짐
- ControlNet이 강하면: 구도는 고정되지만 LoRA의 질감/표정/디테일이 눌리거나, 결과가 “딱딱한 합성”처럼 보임
- 샘플러/스텝이 낮으면: ControlNet이 만든 구조만 남고 디테일이 덜 올라옴
- CFG가 높으면: 프롬프트 충실도는 오르지만 과포화, 링잉, 인물 얼굴 붕괴가 늘어남
따라서 튜닝은 “둘 다 올려서 해결”이 아니라, 경쟁하는 구간을 분리하는 방향이 효율적입니다.
준비: 재현 가능한 실험 세팅 만들기
튜닝의 핵심은 “한 번에 하나만 바꾸는 것”입니다. 아래 체크리스트를 먼저 고정하세요.
- 시드 고정
- 해상도 고정(가능하면
1024x1024또는1216x832같은 SDXL 친화 비율) - 프롬프트 템플릿 고정(가급적 짧게)
- 동일한 ControlNet 입력(동일한 포즈/에지 이미지)
- 동일한 LoRA(하나부터 시작)
A/B 실험용 최소 프롬프트 템플릿
아래처럼 “콘텐츠”와 “스타일”을 분리해두면 LoRA 영향 관찰이 쉬워집니다.
Positive:
portrait photo, studio lighting, sharp focus, high detail
Negative:
lowres, blurry, bad anatomy, extra fingers, watermark
LoRA를 붙일 때는 우선 긍정 프롬프트에만 붙이고, 네거티브는 가능한 건드리지 마세요. 네거티브를 자주 바꾸면 원인 추적이 어려워집니다.
1단계: ControlNet을 먼저 “구도만 맞게” 세팅
LoRA를 올리기 전에 ControlNet만으로 “구도/포즈가 원하는 범위로 고정되는지”를 먼저 확인합니다.
ControlNet 타입별 추천 시작점
- OpenPose: 인물 포즈 고정에 강함
- Canny/Lineart: 윤곽과 구조 고정
- Depth: 원근과 덩어리 고정
시작점은 다음처럼 보수적으로 잡는 게 좋습니다.
- Control Weight:
0.6전후 - Start/End:
0.0~0.8 - Preprocessor 해상도: 입력이 뭉개지지 않을 정도로만
왜 End를 1.0이 아니라 0.8 근처로 끊느냐면, 후반 스텝에서 디테일을 올리는 구간까지 ControlNet이 과하게 개입하면 결과가 “조건에 붙잡힌 채 디테일이 못 올라오는” 패턴이 늘기 때문입니다.
흔한 실패와 처방
- 포즈는 맞는데 표정이 죽음:
End를 낮추거나 Weight를 낮추고 스텝을 올림 - 윤곽이 과하게 딱딱함: Canny 강도를 낮추거나 Lineart로 전환
- 깊이 조건이 과한 플라스틱 느낌: Depth Weight를 낮추고 CFG를 낮춤
VRAM이 터지는 경우는 튜닝 이전에 환경부터 정리해야 합니다. 아래 글의 체크리스트가 SDXL+ControlNet 조합에서 특히 유효합니다.
2단계: LoRA는 “낮은 강도 + 단계적 증폭”이 기본
ControlNet이 구도를 잡은 상태에서 LoRA를 얹을 때는, 처음부터 강하게 주면 충돌이 커집니다. 권장 절차는 다음입니다.
- LoRA weight를
0.4로 시작 - 결과가 “LoRA가 안 먹는다”면
0.55까지 - 그래도 부족하면
0.7이상을 고려하되, 그때부터는 ControlNet의End를 더 낮추거나 Weight를 낮춰 균형을 잡음
LoRA가 ControlNet을 이기는 패턴
- 포즈가 살짝 틀어짐
- 손/팔이 포즈에서 이탈
- 얼굴 방향이 바뀜
이때는 LoRA를 내리기 전에 아래 두 가지를 먼저 시도해보는 편이 결과가 더 깔끔합니다.
- ControlNet
Start/End를0.0~0.7로 당겨 “초중반에만 구도 고정” - 샘플링 스텝을 5~10 정도 올려 디테일 회복
3단계: 샘플러·스텝·CFG 우선순위
LoRA와 ControlNet이 함께 있을 때는 “CFG를 올려서 프롬프트를 더 먹이자”가 오히려 악수인 경우가 많습니다. 우선순위를 이렇게 잡으면 안정적입니다.
- 스텝: 디테일 부족이면 먼저 스텝을 올림
- CFG: 과포화/얼굴 붕괴가 생기면 CFG를 내림
- 샘플러: 결과가 거칠거나 구조가 흔들리면 샘플러 변경
추천 시작점(범용)
- Steps:
28~40 - CFG:
4.5~6.5
CFG를 8 이상으로 올리면 SDXL에서 피부/머리카락이 과하게 쪼개지거나, ControlNet 조건이 “강제된 상태로 과해석”되는 느낌이 늘어납니다.
4단계: 다중 ControlNet 조합은 “역할 분담”으로
ControlNet을 2개 이상 쓰면 성능은 올라가지만, 충돌도 기하급수로 늘어납니다. 원칙은 역할을 분담하는 것입니다.
- 1번 ControlNet: 큰 구조(Depth 또는 Pose)
- 2번 ControlNet: 윤곽 보정(Canny 또는 Lineart)
이때 두 ControlNet을 둘 다 1.0 근처로 주면 거의 반드시 “딱딱한 결과”가 됩니다. 예시로는 아래처럼 비대칭을 주는 편이 낫습니다.
- Pose Weight
0.65, End0.75 - Canny Weight
0.35, End0.55
즉, “큰 구조는 오래, 윤곽은 짧게”가 기본입니다.
5단계: 품질 저하 없이 속도·VRAM 줄이기
SDXL+LoRA+ControlNet은 조합만으로도 무거워서, 속도 최적화는 선택이 아니라 필수입니다. 아래는 체감이 큰 순서대로 정리한 실전 팁입니다.
해상도와 배치부터 관리
- 해상도는 가능하면 SDXL 권장 축(예:
1024기반)에서 시작 - 배치 사이즈는
1로 고정하고, 대신 시드를 바꿔 여러 장 생성
ControlNet 입력 전처리 해상도 과도하게 올리지 않기
전처리 해상도를 크게 올리면 VRAM과 시간이 동시에 증가합니다. 특히 Lineart/Canny에서 전처리 해상도는 “적당히 선이 살아있는 수준”이면 충분합니다.
LoRA를 여러 개 쓸 때의 규칙
LoRA를 2개, 3개로 늘리면 “각각의 weight 합”이 사실상 모델을 강하게 비트는 효과를 냅니다.
- LoRA 2개면 각각
0.3~0.5에서 시작 - 스타일 LoRA와 캐릭터 LoRA를 동시에 쓰면, 캐릭터 쪽을 더 낮게 시작
6단계: 실패 증상별 빠른 디버깅 표
아래 표는 “어떤 증상이면 무엇부터 만질지”를 빠르게 정리한 것입니다.
- 구도/포즈가 틀어짐: LoRA weight 내리기 → ControlNet End를 올리기(또는 Weight 소폭 올리기)
- 구도는 맞는데 결과가 딱딱함: ControlNet End 내리기 → ControlNet Weight 내리기 → 스텝 올리기
- 디테일이 안 올라옴: 스텝 올리기 → ControlNet End 내리기 → CFG 소폭 올리기
- 과포화/피부가 갈라짐: CFG 내리기 → LoRA weight 내리기
- 얼굴이 망가짐: CFG 내리기 → ControlNet이 얼굴을 건드리는 타입이면 End 내리기
핵심은 “ControlNet은 초중반 구조, LoRA는 후반 질감”이라는 역할을 유지시키는 것입니다.
7단계: 자동화 가능한 튜닝 루프(파라미터 스윕)
감으로 슬라이더를 옮기지 않으려면, 작은 범위의 스윕을 자동화하세요. 예를 들어 ComfyUI나 자동화 스크립트에서 다음 조합을 찍어보면 20~30장만으로도 최적점이 보입니다.
- LoRA weight:
0.35,0.45,0.55,0.65 - Control Weight:
0.45,0.6,0.75 - Control End:
0.6,0.75,0.9
아래는 파이썬으로 조합을 생성하는 간단한 예시입니다.
from itertools import product
lora_weights = [0.35, 0.45, 0.55, 0.65]
control_weights = [0.45, 0.60, 0.75]
control_ends = [0.60, 0.75, 0.90]
jobs = []
for lw, cw, ce in product(lora_weights, control_weights, control_ends):
jobs.append({
"lora_weight": lw,
"control_weight": cw,
"control_end": ce,
"steps": 32,
"cfg": 5.5,
"seed": 123456789,
})
print("job count:", len(jobs))
print(jobs[:3])
이렇게 뽑은 jobs를 WebUI API나 ComfyUI 워크플로우에 주입해 렌더링하면, “어느 축이 품질을 망치는지”가 눈에 띄게 드러납니다.
실전 레시피 3가지
마지막으로 자주 쓰는 목적별 레시피를 정리합니다.
1) 캐릭터 LoRA + OpenPose: 포즈 일관성 우선
- Pose Weight
0.65 - Pose End
0.75 - LoRA weight
0.45부터 시작 - Steps
34, CFG5.5
포즈가 흔들리면 LoRA를 올리기보다 Pose End를 0.85까지 늘려 먼저 고정하세요.
2) 스타일 LoRA + Depth: 분위기 유지 + 원근 고정
- Depth Weight
0.55 - Depth End
0.7 - LoRA weight
0.55 - Steps
36, CFG5.0
Depth가 강하면 재질이 플라스틱처럼 뜰 수 있으니 CFG는 낮게 시작하는 편이 안정적입니다.
3) Lineart + 스타일 LoRA: 일러스트 선 유지
- Lineart Weight
0.4 - Lineart End
0.55 - LoRA weight
0.6 - Steps
40, CFG6.0
선이 과하게 강제되면 “채색만 바뀐 복사본”처럼 보이기 쉬워 End를 짧게 가져가는 게 포인트입니다.
마무리: 튜닝의 요지는 ‘경쟁 구간 분리’
SDXL에서 LoRA와 ControlNet을 같이 쓰는 튜닝은 결국 “누가 어느 스텝 구간을 지배할지”를 설계하는 일입니다.
- ControlNet은 초중반에 구조를 잡고, 후반 개입을 줄이기
- LoRA는 낮은 강도에서 시작해 필요한 만큼만 올리기
- 디테일은 CFG보다 스텝으로 해결하기
- 다중 ControlNet은 역할 분담과 비대칭 가중치로 운영하기
VRAM과 속도가 발목을 잡는다면, 아래 글의 최적화 체크리스트를 먼저 적용한 뒤 튜닝을 진행하는 것이 가장 빠른 길입니다.