| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- CityJSON
- Link Prediction
- Road network
- CNN
- Stable Diffusion #Image generation #Diffusion #AI #Generative model
- Consistent Video Depth Estimation
- Today
- Total
빙글빙글 돌아가는 바람개비
[Study] SDXL 살펴보기 본문
SDXL
2023년 7월, Stability AI 는 SDXL (Stable Diffusion XL) 을 공개했다. 기본 학습 해상도가 1024×1024 로 올라갔고, UNet 은 약 3배로 커졌고, 텍스트 인코더가 두 개로 늘었다. 이름이 XL 인 만큼 모델이 커진 건 사실이지만, 단순히 파라미터만 늘렸다면 메모리만 더 먹는 모델이 됐을 것이다. SDXL 의 변화는 크기보다 구조와 학습 방식 쪽에 더 많이 들어가 있다.
SD 1.5 와 비교해서 SDXL 이 무엇을 어떻게 바꿨는지 하나씩 본다.
1. SD 1.5 에서 자주 부딪히던 문제들
SDXL 이 어디를 손봤는지 보려면 SD 1.5 의 약점부터 짚는 게 빠르다. SD 1.5 를 써본 사람이라면 한 번쯤 마주쳤을 패턴들이다.
- 해상도가 올라가면 구도가 무너진다. 학습 해상도가 512×512 였기 때문에, 더 큰 크기로 생성하면 같은 인물이 두 번 나오거나 몸이 두 개로 분리되는 현상이 자주 나타났다.
- 긴 프롬프트를 잘 못 따라간다. CLIP ViT-L 하나만 쓰다 보니 키워드가 많아지면 일부가 무시되거나 약하게 반영됐다.
- 인물의 머리나 발이 잘려 나온다. 학습 데이터를 일정한 크기로 맞추려고 이미지를 중앙에서 잘랐는데, 모델이 그걸 그대로 학습해서 생성 결과에서도 비슷한 식으로 잘린 구도가 나왔다.
- 16:9, 9:16 같은 비율에서 품질이 떨어진다. 정사각형 외의 종횡비에서는 구도와 디테일이 모두 약했다.
SDXL 은 이 네 가지에 각각 다른 방식으로 대응한다.
2. SD 1.5 와의 차이
SDXL 의 UNet 은 약 2.6B 파라미터로 SD 1.5 의 약 860M 에서 3배가량 커졌다. 그런데 SDXL 이 단순히 모든 곳에 파라미터를 더 넣은 건 아니다. Transformer 블록의 배치를 바꿨다.
고해상도 단계는 줄이고, 저해상도 단계에 몰아줬다
SD 1.5 는 UNet 의 모든 해상도 단계에 Transformer 블록을 비슷하게 깔았다. SDXL 은 고해상도 단계의 Transformer 블록을 줄이고, 저해상도 단계에 더 많이 배치했다. 의미 처리가 UNet 안에서 어디서 일어나는지에 대한 관찰을 반영한 결정이다.
UNet 안에서 이미지가 가장 작게 다운샘플링된 지점이 가장 추상적인 정보가 모이는 곳이다. 여기서 "강아지가 소파에 앉아 있다" 는 구성이 결정되고, 고해상도 단계에서는 텍스처와 디테일이 채워진다. 그래서 의미 처리가 일어나는 쪽에 Transformer 를 더 두는 편이 같은 파라미터로 더 나은 결과를 낸다.
결과적으로 SD 1.5 의 첫 번째 약점(해상도) 과 두 번째 약점(긴 프롬프트 이해) 에 부분적으로 대응이 된다. UNet 이 커진 만큼 VRAM 요구도 늘어서, SDXL 은 보통 8~12GB 를 권장한다.
3. 텍스트 인코더가 두 개
SDXL 은 텍스트 인코더를 두 개 동시에 쓴다. SD 1.5 는 OpenAI 의 CLIP ViT-L 하나만 사용했지만, SDXL 은 여기에 OpenCLIP ViT-bigG 를 추가했다.
| 인코더 | 특징 |
|---|---|
| CLIP ViT-L | OpenAI 가 학습시킨 원조 CLIP. 짧고 명료한 프롬프트에서 안정적이다. |
| OpenCLIP ViT-bigG | LAION 이 학습시킨 더 큰 인코더. 긴 프롬프트와 더 다양한 어휘를 다룬다. |
두 인코더는 학습 데이터와 구조가 달라서 같은 텍스트도 다르게 본다. 두 출력을 합쳐서(concatenate) UNet 의 Cross-Attention 에 전달한다. 한 인코더가 약한 부분을 다른 인코더가 메우는 식으로 작동한다.
두 인코더가 독립적이라는 점을 활용하는 사용법도 있다. 각 인코더에 다른 프롬프트를 넣을 수 있는 인터페이스(예: ComfyUI) 에서는, 한쪽엔 스타일 키워드, 다른 쪽엔 내용 키워드를 분리해서 넣는 식이다. A1111 같은 환경에서는 동일한 프롬프트가 양쪽에 들어간다.
4. Microconditioning
SD 1.5 의 잘린 결과물 문제와 종횡비 문제는 사실 같은 뿌리를 갖고 있다. 학습 데이터의 처리 방식 때문에 생긴 문제다.
학습 데이터
학습 데이터셋의 이미지는 크기와 비율이 제각각이다. 모델에 넣으려면 같은 크기로 맞춰야 하는데, 보통은 짧은 변에 맞춰 리사이즈한 뒤 중앙을 잘라낸다. 이 과정에서 인물의 머리나 발이 잘려 나가고, 모델은 그 잘린 이미지를 정상적인 데이터로 학습한다. 종횡비도 정사각형 위주로 학습되니, 다른 비율에서는 약할 수밖에 없다.
SDXL 의 접근 : 손실된 정보를 모델에 그대로 알려준다
SDXL 은 데이터를 자르거나 리사이즈하면서 "원래 어떻게 생겼던 이미지인지" 를 모델에 함께 입력한다. 이걸 Microconditioning 이라고 부른다. 세 가지가 들어간다.
- Original Size Conditioning — 이미지의 원본 해상도. "이 이미지는 원래 1920×1080 이었다" 는 정보를 함께 학습한다. 작은 이미지를 무리하게 키운 데이터로 학습돼도 모델이 그걸 알고 처리할 수 있다.
- Crop Conditioning — 이미지를 잘라낸 좌표. "이 이미지는 원본의 (top=120, left=0) 에서 잘려 나왔다" 는 정보를 추가한다.
- Target Size Conditioning — 학습 이미지의 최종 종횡비. 1:1 뿐 아니라 16:9, 9:16 같은 다양한 비율로 함께 학습한다.
학습할 때 정보를 주면 추론할 때 통제권이 생긴다
중요한 건 그다음이다. 모델이 "이 이미지는 (top=120) 에서 잘렸다" 를 학습했다면, 추론 시에는 (top=0, left=0) 을 지정해서 "잘리지 않은 이미지를 만들어달라" 고 요청할 수 있다. 학습 데이터의 결함이 모델 안에 명시적으로 표시되어 있으니, 그 결함을 회피하는 조건을 줘서 출력에서 제거할 수 있다.
정리하면 기존 방식은 잘린 데이터를 정상 데이터로 취급하고 학습했다. SDXL 은 그 잘림을 학습에 명시적으로 포함시킨다. 결함이 있는 데이터로 학습하더라도 결함의 위치가 라벨로 표시되어 있으면, 추론 시에 결함이 없는 조건을 골라낼 수 있다.
추론 시 conditioning 값 참고
- 잘린 인물 결과를 줄이려면 Crop 을 (0, 0) 으로 둔다. SDXL 사용 인터페이스 대부분이 기본값으로 (0, 0) 을 쓴다.
- Original Size 를 작게 주면 모델이 저해상도 이미지를 흉내낸다. 보통은 1024 이상을 넣는다.
- 가로 사진은 1344×768, 세로 사진은 768×1344 처럼 SDXL 이 학습한 종횡비 표를 따르는 게 안정적이다.
5. Base 와 Refiner 두 단계 구조
SDXL 은 모델 한 개가 아니라 두 개로 구성된다. Base 가 디노이징의 대부분을 처리하고, Refiner 가 마지막 구간을 맡는다.
Base 는 노이즈에서 시작해서 이미지의 구조와 의미를 만든다. 이 단계에서 거의 완성된 이미지가 나온다. Refiner 는 노이즈가 적은 마지막 구간만 따로 학습된 별도의 모델이다. 같은 데이터로 학습됐지만 저노이즈 구간에 집중적으로 학습되어, 그 구간에서는 Base 보다 디테일을 더 잘 채운다.
실제로는 Refiner 없이 Base 만 써도 결과가 충분히 나온다. 커뮤니티에서도 Refiner 를 빼는 경우가 많다. Juggernaut, RealVisXL 같은 SDXL 기반 파인튜닝 모델들이 등장하면서 Refiner 의 역할은 점점 그쪽으로 흡수됐다. 공식 파이프라인에는 들어 있지만 실용적으로는 선택지에 가깝다.
6. SD 1.5 vs SDXL
| 구분 | SD 1.5 | SDXL |
|---|---|---|
| 기본 해상도 | 512×512 | 1024×1024 |
| UNet 파라미터 | 약 860M | 약 2.6B |
| Text Encoder | CLIP ViT-L 하나 | CLIP ViT-L + OpenCLIP ViT-bigG |
| 파이프라인 | 단일 모델 | Base + Refiner |
| Conditioning | 텍스트만 | 텍스트 + 크기 / 크롭 / 타겟 정보 |
| VRAM 권장 | 4GB 부터 가능 | 8 ~ 12GB 권장 |
| 현재 위치 | 가벼운 작업, 학습 베이스로 여전히 활용 | 기본 베이스 |
'Image Generation > Study' 카테고리의 다른 글
| [Study] DiT: Diffusion에 Transformer를 쓰는 방식 (0) | 2026.04.01 |
|---|---|
| [Study] MMDiT를 이용한 SD3 (0) | 2026.03.29 |
| [Study] Rectified Flow (0) | 2026.03.25 |
| [Study] IP-Adapter-레퍼런스 이미지를 넣는 법 (0) | 2026.03.23 |
| [Study] ControlNet으로 이미지 제어하기 (0) | 2026.03.20 |