- Published on
Stable Diffusion LoRA 병합 후 색감 깨짐 해결
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
LoRA를 체크포인트에 병합(merge)한 뒤 결과 이미지의 색감이 갑자기 바래거나, 채도가 과하게 튀거나, 피부톤이 회색/초록으로 밀리는 현상을 겪는 경우가 많습니다. 이 문제는 단일 원인이라기보다 VAE 불일치, 색공간/정밀도 설정, 병합 방식(알고리즘)과 가중치 스케일, 베이스 모델/클립 텍스트 인코더 불일치가 겹치며 발생합니다.
이 글에서는 “왜 색이 깨지는지”를 원리 수준에서 짚고, WebUI(AUTOMATIC1111) 및 ComfyUI 기준으로 바로 적용 가능한 해결 절차를 제공합니다.
디버깅 관점은 인프라 장애 분석과 크게 다르지 않습니다. 증상을 고정(재현)하고, 변수를 하나씩 고립시키는 방식이 가장 빠릅니다. 비슷한 접근을 다룬 글로는 gRPC 마이크로서비스 503·데드라인 초과 디버깅도 참고할 만합니다.
1) 색감 깨짐의 대표 원인 5가지
1-1. VAE 불일치(가장 흔함)
Stable Diffusion에서 최종 색감은 VAE 디코딩에 크게 좌우됩니다. 병합 전에는 특정 VAE를 쓰고 있었는데, 병합 후 체크포인트에 내장된 VAE 또는 다른 VAE로 디코딩되면 색이 달라집니다.
특히 다음 조합에서 자주 터집니다.
- SD 1.5 계열인데
vae-ft-mse-840000-ema-pruned같은 외부 VAE를 쓰다가, 병합 후 내장 VAE로 돌아감 - SDXL 계열에서 베이스/리파이너/전용 VAE 혼용
징후
- 같은 시드, 같은 프롬프트인데도 색만 크게 달라짐
- 피부가 회색/녹색으로 뜨거나, 전체가 누렇게 변함
1-2. LoRA가 학습된 베이스 모델과 병합 대상이 다름
LoRA는 “어떤 베이스 모델의 가중치 공간에서” 학습됩니다. 예를 들어 AnyLoRA가 anything-v4.5 계열에서 학습됐는데, 이를 전혀 다른 리얼 계열 모델에 병합하면 색/명암이 무너질 수 있습니다.
징후
- 특정 스타일 LoRA만 병합하면 채도가 터지거나 명암이 붕괴
- LoRA를 로드만 했을 때는 괜찮은데, 병합하면 더 심해짐
1-3. 병합 방식/가중치 스케일 문제(과도한 주입)
병합은 결국 “베이스 가중치에 LoRA 델타를 더하는” 작업입니다. 이때 alpha 또는 multiplier가 과하면 색/콘트라스트가 비정상적으로 튈 수 있습니다.
multiplier가1.0이라도 LoRA마다 체감 강도가 다릅니다.- LoRA가 UNet뿐 아니라 텍스트 인코더(clip)까지 건드리면 색/톤이 더 크게 흔들립니다.
1-4. 정밀도(fp16, bf16) 및 클립/UNet 캐스팅 이슈
병합 과정에서 fp16으로 저장하거나 로드할 때, 일부 환경에서 정밀도 손실이 색감 변화로 체감되기도 합니다.
- 특히 병합 결과를
fp16으로 저장하고, 원본은fp32또는 다른 캐스팅 정책을 썼다면 차이가 납니다.
1-5. sRGB/선형 색공간과 후처리(하이레즈, 업스케일) 영향
일부 업스케일러, 후처리, 또는 뷰어(이미지 저장/미리보기)의 색관리 차이로 “색이 깨진 것처럼” 보일 수 있습니다.
- PNG 메타/ICC 프로파일 처리 차이
- WebUI 미리보기와 외부 뷰어 결과가 다름
2) 가장 빠른 진단 순서(체크리스트)
아래 순서대로 하면 원인 범위를 빠르게 좁힐 수 있습니다.
2-1. 재현을 고정한다
- 샘플러, 스텝, CFG, 해상도, 시드 고정
- 하이레즈/업스케일/후처리 전부 끄기
- 프롬프트는 단순하게(인물 1명 + 기본 조명 정도)
2-2. 병합 전/후를 “같은 VAE”로 디코딩해 비교한다
WebUI 기준
Settings에서VAE를 명시적으로 고정Automatic에 맡기지 말고 특정 파일을 선택
ComfyUI 기준
VAE Decode노드에 동일한 VAE를 연결
이 단계에서 색이 정상으로 돌아오면, 원인은 거의 확정적으로 VAE 불일치입니다.
2-3. LoRA를 “병합하지 말고” 로드해서 같은 강도로 비교한다
- 로드 방식에서 색이 정상인데 병합에서만 깨지면, 병합 파라미터(알고리즘/스케일/텍스트 인코더 포함)가 문제일 확률이 큽니다.
2-4. 텍스트 인코더(clip)까지 병합했는지 확인한다
- 텍스트 인코더까지 병합하면 스타일/색이 더 크게 바뀝니다.
- 색감 문제만 있다면 UNet만 병합하고 clip은 제외하는 전략이 유효합니다.
3) 해결 레시피 1: VAE를 고정해서 색감 복구
3-1. WebUI에서 VAE 강제 지정
Settings→VAE항목SD VAE를Automatic이 아닌 특정 VAE 파일로 선택Apply settings후Reload UI
권장 팁
- SD 1.5 계열에서 색이 떠 보이면
vae-ft-mse-840000-ema-pruned가 가장 무난한 편입니다. - 병합 체크포인트를 만들 때도 어떤 VAE를 기준으로 했는지를 메모해 두면 재현성이 올라갑니다.
3-2. 병합 체크포인트에 VAE를 같이 포함할지 결정
- “항상 같은 색을 내야 하는 배포용 모델”이면 VAE를 포함해 저장하는 편이 편합니다.
- 여러 워크플로에서 VAE를 바꿔가며 쓰면, 체크포인트엔 VAE를 포함하지 말고 외부에서 고정하는 편이 안전합니다.
4) 해결 레시피 2: 병합 강도를 낮추고 clip 병합을 피한다
LoRA는 “적당히”가 중요합니다. 병합은 되돌리기 어렵기 때문에, 아래처럼 단계적으로 접근하세요.
4-1. 권장 병합 강도 가이드
- 처음 시도:
0.6~0.8 - 스타일이 약하면:
0.9 1.0이상은 LoRA 성격에 따라 색이 튈 가능성이 빠르게 증가
4-2. UNet만 병합(clip 제외) 전략
- 색감/톤이 흔들리는 경우 clip 병합이 영향을 주는 일이 많습니다.
- 가능하면 UNet만 병합하고, 텍스트 인코더는 원본을 유지해 보세요.
5) 해결 레시피 3: 병합 툴/스크립트로 재현 가능한 병합 만들기
GUI 병합은 편하지만 “어떤 옵션으로 병합했는지”가 남지 않아 재현이 어렵습니다. 아래처럼 스크립트 기반으로 남겨두면, 색감 문제를 추적하기 쉬워집니다.
5-1. sd-scripts의 LoRA 병합 예시
아래는 예시이며, 환경에 따라 경로/옵션 이름이 다를 수 있습니다. 핵심은 dtype, multiplier, text encoder 포함 여부를 명시하는 것입니다.
python networks/merge_lora.py \
--sd_model "models/base.safetensors" \
--save_to "models/merged.safetensors" \
--models "lora/style.safetensors" \
--ratios 0.75 \
--precision "fp32"
추가 팁
- 색감이 미묘하게 깨지면
precision을fp32로 두고 먼저 확인하세요. - 문제가 없을 때만
fp16저장을 고려하는 편이 안전합니다.
5-2. 병합 로그를 남기는 습관
- 베이스 모델 해시
- LoRA 파일명/해시
- 병합 비율
- VAE 파일명
- WebUI/ComfyUI 버전
이런 메타는 나중에 “왜 이 모델만 색이 이상하지?”를 해결하는 지름길입니다. 운영 환경에서 장애 원인 추적을 위해 로그를 남기는 것과 같은 맥락이며, 배포 파이프라인 권한 문제를 추적하는 글인 GitHub Actions OIDC로 AWS 배포 권한 오류 해결과도 접근 방식이 유사합니다.
6) SDXL에서 특히 자주 하는 실수
SDXL은 구성요소가 더 많아 색감 이슈가 더 잘 드러납니다.
6-1. 베이스와 리파이너를 섞어 병합하려는 시도
- SDXL 베이스용 LoRA를 리파이너에 병합하면 결과가 쉽게 망가집니다.
- 베이스/리파이너는 역할이 달라서 LoRA 호환성이 제한적입니다.
6-2. SDXL 전용 VAE/노드 연결 실수
ComfyUI에서 SDXL 그래프를 만들 때
VAE Encode/Decode에 어떤 VAE가 연결됐는지- 체크포인트 로더가 내장 VAE를 쓰는지
이 연결 하나로 색이 확 바뀝니다.
7) “색감만” 깨질 때의 실전 처방 3단계
아래 3단계는 현장에서 가장 많이 통하는 조합입니다.
- VAE를 명시적으로 고정한다
- 병합 전/후 동일 VAE로 비교
- 병합 비율을
0.75전후로 낮춘다1.0병합은 마지막에
- clip 병합을 끄고 UNet만 병합한다
- 텍스트 인코더 변화가 색/톤을 크게 흔드는 경우가 많음
여기까지 했는데도 깨지면, 그 LoRA는 “병합에 부적합”하거나 “다른 베이스에서 학습된 LoRA”일 가능성이 큽니다. 이 경우 병합 대신 런타임 로드(필요할 때만 적용)로 운영하는 편이 낫습니다.
8) 부록: 문제 재현용 최소 워크플로(검증 템플릿)
8-1. WebUI 프롬프트 템플릿
- Positive
portrait photo, natural light, 35mm, detailed skin
- Negative
oversaturated, green skin, gray skin, color banding
- 고정
- Sampler:
DPM++ 2M Karras - Steps:
25 - CFG:
6 - Seed:
123456789 - Hires fix:
off
- Sampler:
이 템플릿으로 병합 전/후를 비교하면 색 변화가 과장 없이 드러납니다.
8-2. ComfyUI 검증 그래프 포인트
Checkpoint Loader→CLIP Text Encode→KSampler→VAE Decode- 여기서 VAE를 외부 파일로 고정하고, 동일 시드로 반복
9) 마무리
LoRA 병합 후 색감 깨짐은 대부분 “모델이 이상해졌다”기보다, VAE/병합 스케일/clip 포함 여부/정밀도 같은 변수가 바뀌면서 생기는 재현성 문제입니다.
가장 효과적인 해결은 다음 한 줄로 요약됩니다.
VAE를 고정하고, 병합 비율을 낮추고, clip 병합을 피하라
이 3가지만 지켜도 색감 이슈의 상당수를 빠르게 정리할 수 있습니다.