- Published on
SDXL+LoRA 색감 붕괴 교정 - VAE·CLIP 스킵
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
SDXL에 LoRA를 적용하면 디테일은 좋아지는데, 갑자기 색이 탁해지거나 형광처럼 튀고, 피부톤이 회색으로 붕괴하거나 그림 전체가 누렇게 뜨는 문제가 자주 발생합니다. 이 현상은 흔히 “LoRA가 색을 망친다”로 단정되지만, 실제로는 VAE 디코딩 특성, 텍스트 인코더(특히 CLIP) 조건의 강도, LoRA가 학습된 베이스/해상도/프롬프트 스타일, 샘플러와 CFG 상호작용이 겹쳐서 생기는 경우가 많습니다.
이 글에서는 SDXL 파이프라인에서 색감 붕괴가 일어나는 지점을 분해해서 보고, VAE 교체와 CLIP 스킵(clip skip) 조정을 중심으로, 재현 가능한 체크리스트와 설정 조합을 제시합니다.
1) 증상별로 원인을 나누면 해결이 빨라진다
색감 붕괴라고 뭉뚱그리면 끝이 없습니다. 아래처럼 “겉으로 보이는 증상”을 기준으로 나누면, 손대야 할 레버가 명확해집니다.
1-1. 전체가 탁해지고 검게 눌리는 느낌
- 원인 후보
- VAE 디코딩에서 채널 스케일이 맞지 않거나(특정 VAE), 하이라이트가 눌림
- CFG가 높고 네거티브가 강해 조건이 과잉 제약됨
- LoRA가 스타일을 강하게 밀어붙이며 대비를 무너뜨림
1-2. 형광색, 과채도, 피부가 주황/핑크로 붕괴
- 원인 후보
- LoRA가 학습 당시 과채도 데이터를 많이 포함
- 프롬프트에
vivid,saturated,cinematic계열 토큰이 중첩 - 샘플러가 고CFG에서 색을 튀게 만드는 조합
1-3. 특정 색만 이상하게 뜨거나(예: 붉은기만 폭발) 밴딩이 생김
- 원인 후보
- VAE가 해당 베이스와 궁합이 나쁨
- 후처리 업스케일러/샤프닝에서 색 채널이 과증폭
핵심은, **SDXL에서 LoRA는 “조건을 바꾸는 것”**이고, VAE는 **“최종 색을 복원하는 디코더”**라서 둘 중 하나만 어긋나도 결과가 크게 흔들린다는 점입니다.
2) SDXL에서 VAE가 색감을 좌우하는 이유
Stable Diffusion 계열에서 VAE는 잠재공간(latent)을 RGB 이미지로 복원합니다. 같은 latent라도 VAE에 따라 색이 달라질 수 있습니다. SDXL은 기본적으로 전용 VAE 및 파이프라인이 있고, 체크포인트에 따라 권장 VAE가 다릅니다.
2-1. “체크포인트 내장 VAE”와 “외부 VAE 강제”의 함정
- 어떤 SDXL 계열 모델은 내장 VAE가 최적화되어 있습니다.
- 반대로, 특정 커스텀 SDXL 체크포인트는 외부 VAE를 권장하거나, 내장 VAE가 누락된 경우도 있습니다.
실전 팁은 단순합니다.
- 색이 무너졌다면 첫 번째로 VAE를 의심합니다.
- 그리고 외부 VAE를 강제 적용 중이라면 일단 해제해 봅니다.
2-2. VAE 교체 실험을 “통제된 조건”으로 해야 한다
VAE만 바꿔서 비교해야 원인 파악이 됩니다. 아래 항목을 고정하세요.
- 동일 seed
- 동일 sampler, steps, CFG
- 동일 해상도
- 동일 LoRA 가중치
- 동일 프롬프트(특히 네거티브 포함)
A1111(WebUI)에서 VAE 테스트용 추천 절차
- LoRA를 켠 상태에서 문제 이미지 1장을 재현
- VAE를
Automatic(또는 체크포인트 내장)으로 두고 1장 생성 - 외부 VAE로 바꿔 1장 생성
- 결과를 나란히 비교
3) CLIP 스킵(clip skip)이 SDXL+LoRA에서 색을 흔드는 메커니즘
clip skip은 텍스트 인코더의 마지막 레이어를 몇 개 건너뛰어 임베딩을 만드는 방식입니다. SD 1.5 계열에서는 스타일 변화나 과적합 완화에 자주 쓰였지만, SDXL에서는 구조가 다르고(텍스트 인코더가 2개인 구성 등), 체크포인트/파이프라인에 따라 효과가 달라집니다.
여기서 중요한 결론은 하나입니다.
- SDXL에서 clip skip을 무작정 2로 고정하는 습관은 색감 붕괴를 악화시킬 수 있습니다.
3-1. 왜 LoRA가 있을 때 더 민감해지나
LoRA는 UNet 또는 텍스트 인코더에 저랭크 어댑터를 추가해 “조건-특징 매핑”을 바꿉니다. 이때 clip skip으로 임베딩 분포가 달라지면,
- LoRA가 기대한 토큰 표현과 실제 토큰 표현이 어긋나고
- 그 어긋남이 색/조명 같은 전역 스타일로 나타나는 경우가 많습니다.
3-2. 권장 접근: clip skip은 “0 또는 1부터”
도구에 따라 표기가 다르지만, 실무적으로는 다음 순서가 안전합니다.
- SDXL 계열: 기본값(사실상 skip 없음)부터 시작
- 문제가 있으면 그때
clip skip을 1 단계만 변화
즉, “일단 2”가 아니라 **“일단 기본”**이 디폴트입니다.
4) 재현 가능한 교정 체크리스트(우선순위 순)
아래 순서대로 하면 시행착오가 크게 줄어듭니다.
4-1. VAE를 먼저 정상화
- 외부 VAE 강제 적용을 끄고
Automatic으로 복귀 - 체크포인트 제작자가 권장하는 VAE가 있다면 그걸 적용
- 여전히 탁하면 다른 SDXL 호환 VAE를 시도
4-2. clip skip을 기본으로 되돌리기
- SDXL에서
clip skip을 커스텀으로 건드렸다면 일단 기본값으로 - LoRA가 텍스트 인코더에 걸려 있다면(특히 스타일 LoRA)
clip skip영향이 더 큼
4-3. LoRA 가중치부터 낮춰 “색 안정 구간” 찾기
LoRA는 0.4에서 1.0 사이를 자주 쓰지만, 색이 무너지면 먼저 가중치부터 줄여 안정 구간을 찾는 게 빠릅니다.
- 예:
1.0에서 붕괴하면0.7→0.55→0.45로 내려가며 확인
4-4. CFG를 낮추고 네거티브를 정리
과도한 네거티브 프롬프트는 색을 “빼는 방향”으로 작동해 탁해질 수 있습니다.
- CFG가 높을수록 네거티브의 영향도 강해짐
- SDXL에서
CFG 4~7범위가 비교적 안정적인 편
4-5. 샘플러/스케줄러 조정
같은 steps라도 샘플러에 따라 채도/명암이 달라집니다. 특정 조합에서 LoRA가 색을 과증폭하는 경우가 있어 “샘플러 변경”이 의외로 큰 효과를 냅니다.
5) 실전 설정 예시(A1111/ComfyUI 공통 개념)
아래는 “색 안정”을 목표로 한 출발점입니다. 여기서 LoRA와 프롬프트를 얹어가며 조정합니다.
- 해상도: SDXL 권장(예: 1024 기반)
- Steps: 25~35
- CFG: 5~7
- clip skip: 기본값
- VAE: 체크포인트 내장 또는 권장 VAE
- LoRA weight: 0.5~0.8부터 시작
5-1. A1111 프롬프트 예시(색 붕괴 방지용)
아래 예시는 과채도 토큰을 줄이고, 조명/화이트밸런스를 안정화하는 방향입니다.
Prompt:
portrait photo, natural skin tone, soft daylight, neutral color grading, high dynamic range, realistic
Negative:
oversaturated, neon colors, orange skin, color banding, crushed blacks, muddy colors
여기서 중요한 포인트는 cinematic, vivid, ultra saturated 같은 토큰을 무심코 섞지 않는 것입니다. LoRA가 이미 스타일을 강하게 주는 경우, 이런 토큰은 색 붕괴를 가속합니다.
5-2. ComfyUI에서 VAE 교체를 명시하는 예시
ComfyUI는 노드로 VAE를 명확히 분리할 수 있어 원인 분리가 쉽습니다.
# 개념 예시(실제 노드 연결을 코드로 표현)
# 1) Checkpoint Loader에서 model, clip, vae를 로드
# 2) VAE Decode에 특정 VAE를 연결해 비교
# latent = KSampler(model, positive, negative, seed, steps, cfg, sampler)
# image_a = VAEDecode(vae_builtin, latent)
# image_b = VAEDecode(vae_external, latent)
# 비교: image_a vs image_b
위처럼 동일 latent를 서로 다른 VAE로 디코딩하면, “색 문제의 책임이 VAE인지”를 빠르게 확정할 수 있습니다.
6) LoRA가 텍스트 인코더에 적용될 때의 추가 주의점
SDXL LoRA는 UNet에만 걸린 것처럼 보여도, 패키지에 따라 텍스트 인코더까지 포함하는 경우가 있습니다. 텍스트 인코더 LoRA가 포함되면 다음이 더 민감해집니다.
clip skip- 프롬프트 토큰 선택
- 가중치(특히
1.0이상)
이때의 교정 우선순위는 아래가 효율적입니다.
- clip skip 기본값
- LoRA weight 낮추기
- 프롬프트에서 과채도/필름룩 토큰 제거
- VAE 재점검
7) “색감 붕괴”를 디버깅하듯 접근하는 팁
소프트웨어 장애 분석처럼, 생성도 “변수 통제”가 핵심입니다. 한 번에 여러 설정을 바꾸면 원인을 영영 못 찾습니다.
- 한 번에 하나만 바꾸고 결과를 기록
- seed 고정
- 변경 전후 이미지를 파일명에 설정값으로 남기기
대규모 실험을 자동화하려면 배치 생성이나 스크립팅이 유용합니다. 모델 실험/배포 파이프라인을 다룬 글로는 PyTorch PT2E 양자화로 INT8 모델 배포하기도 함께 참고하면, 실험을 “재현 가능한 작업”으로 만드는 감각을 얻는 데 도움이 됩니다.
8) 자주 묻는 케이스별 처방전
8-1. LoRA를 켜는 순간 피부가 회색/누렇게 뜬다
- LoRA weight를
0.6아래로 먼저 내림 - 네거티브에서
bad skin류 토큰 과다 사용 여부 점검 - VAE를 내장으로 복귀 후 비교
8-2. 특정 LoRA만 유독 형광색이 된다
- 해당 LoRA가 학습된 데이터셋/스타일 문제일 가능성 큼
- 해결은 “상쇄 프롬프트”보다 가중치 다운이 더 안정적
- 샘플러 변경으로 완화되는 경우도 있으니 1~2개만 바꿔 테스트
8-3. 다른 사람 설정을 그대로 따라 했더니 내 환경에서만 깨진다
- 체크포인트 버전, VAE 강제 적용 여부, clip skip 기본값이 다를 수 있음
- 특히 UI에서
clip skip이 글로벌 설정으로 남아 있는지 확인 - Node.js나 번들 환경에서 모듈 시스템 차이로 문제가 생기듯, 도구 체인도 “전역 설정”이 함정이 됩니다. 비슷한 맥락의 사례로 Node.js ESM/CJS 충돌 ERR_REQUIRE_ESM 해결법처럼 “환경 차이”가 원인을 만드는 패턴을 떠올리면 디버깅이 쉬워집니다.
9) 정리: VAE와 clip skip은 “색을 고치는 1순위 레버”다
SDXL+LoRA에서 색감 붕괴는 흔하지만, 무작정 프롬프트를 덧붙이거나 후처리로 덮으면 더 망가지는 경우가 많습니다. 가장 효율적인 순서는 다음입니다.
- VAE를 내장/권장으로 정상화하고 동일 seed로 비교
- clip skip을 기본값으로 복귀(특히 SDXL은 기본 우선)
- LoRA weight를 낮춰 안정 구간을 찾기
- CFG와 네거티브를 정리해서 과제약을 줄이기
- 필요 시 샘플러/스케줄러 변경으로 미세 조정
이 과정을 “변수 통제 실험”으로 반복하면, 특정 LoRA가 색을 망치는지, 내 VAE 설정이 문제인지, 혹은 텍스트 조건이 과한지 빠르게 결론에 도달할 수 있습니다.