FLUX.1 Kontext (dev) 모델 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. FLUX.1-Kontext-dev 개요
a. 모델 소개
- FLUX.1-Kontext-dev는 Black Forest Labs에서 개발한 텍스트 기반 Diffusion 이미지 생성 및 편집 모델
- Stable Diffusion 계열의 아키텍처를 확장해, 더 정밀한 문맥 이해와 세밀한 지시어 반영 가능
- 사용자와의 자연스러운 인터랙션을 위한 편집 및 응답 능력 강화
b. 주요 특징
- 12B 파라미터 규모의 멀티모달 모델
- 대규모 Transformer 기반 아키텍처 사용
- 텍스트 조건 이미지 편집 및 생성 모두 지원
- 기존 이미지에 대한 “프롬프트 기반 변화” 수행 가능
- LoRA 학습 가능
- 사용자 정의 목적의 미세조정 확장 가능
- FLUX-Kontext Prompting
- 명시적 명령어뿐만 아니라, 암묵적 뉘앙스와 문맥 정보를 해석하는 프롬프트 처리 방식
- 예: 감정, 관계, 구도 등 미묘한 표현을 시각화 가능
c. 응용 가능 분야
- 캐릭터 스타일 편집
- 아트웍 리터칭 및 보완
- 실사 이미지 기반 스타일 변환
- 광고, 게임, 애니메이션 소재 제작 등
d. 릴리즈 목적
- 연구자 및 개발자 대상 실험적 버전 공개
- 다양한 세부 컨트롤 능력에 대한 피드백 수집 목적
e. 라이선스 및 사용
- Research License
- 비상업적 용도 및 테스트에 한해 사용 가능
- Hugging Face 및 GitHub에 코드 및 체크포인트 제공
2. 구성 요소
text_encoder_1
, text_encoder_2
)
a. 텍스트 인코더 (가. 역할
- 텍스트 인코더는 사용자의 prompt (예: “a happy child under cherry blossoms”)를 받아 고차원 벡터로 인코딩
- 이 벡터는 이후 UNet 또는 Transformer2D 구조에 입력되어, 이미지 생성 과정에 영향을 미침
- 어떻게 그릴지, 어떤 감정으로 표현할지, 어떤 스타일인지 등을 유도하는 핵심 정보
- 쉽게 말해, 프롬프트의 의미를 수치로 번역한 명령서 역할
나. 동작 구조
prompt
→ 토크나이저 → 토큰 시퀀스- 텍스트 인코더 →
[B, T, D]
형태의 임베딩 벡터 출력- B: 배치 크기, T: 토큰 수, D: 임베딩 차원
- 이 벡터는 이미지 디코더 모듈로 전달되어, 생성 과정에 컨디셔닝
다. 학습 방식
- CLIP 방식과 유사하게, 이미지와 텍스트 쌍을 통해 지도학습
- 예: “a dog in the snow” ↔ 실제 강아지가 눈밭에 있는 이미지
- Cross-attention 기반으로 텍스트 임베딩이 이미지에 어떻게 반영되는지를 학습
- FLUX.1-Kontext는 특히 세밀한 문맥과 의미 구분이 가능한 텍스트 인코더를 목표로 설계됨
- 단어 수준이 아닌 문장 전반의 의미 흐름을 해석할 수 있도록 훈련됨
라. 다른 모델과의 차별점 : 인코더를 2개 사용
[ 목적: 글로벌 의미 + 지역 정보의 분리 처리 ]
- 하나의 인코더는 전반적인 문맥 이해 (global semantics) 전담
- 다른 하나는 세부 토큰의 정밀 의미 (fine-grained token-level meaning) 전담
- 두 벡터를 결합해, 장면의 느낌 + 구성 요소의 디테일을 동시에 반영
[ 예시 ]
- Prompt:
"a cute puppy wearing a red astronaut suit on Mars"
- 인코더 1: 전체적인 우주적 테마 + 귀여운 느낌 → 스타일 흐름 조절
- 인코더 2:
"puppy"
,"red"
,"astronaut suit"
등 개별 키워드 → 시각적 요소 배치
[ 결과 ]
- 기존 단일 인코더 방식의 FLUX 1 모델은 전체 스타일과 세부 요소를 한 번에 처리
- 복잡하거나 추상적인 프롬프트에서는 의미 왜곡 발생 가능(Drift)
- 인코더 1: sentence-level context vector (T5 계열) → 큰 그림
- 인코더 2: token-level contextual embeddings → 세밀한 명사/형용사 조절
- 이 두 벡터를 나중에 Transformer2D + Cross-Attention에 함께 입력해 조율
- 스타일과 구성 요소를 동시에 자연스럽게 반영
- 복잡하고 문맥이 긴 프롬프트에 대한 정확한 해석 및 적용
바. 요약
인코더 | 용량 | 아키텍처 추정 | 역할 |
---|---|---|---|
text_encoder |
약 246MB | 작은 T5 (또는 T5-small) | 기본 prompt embedding (간단한 조건 텍스트) |
text_encoder_2 |
약 9.5GB | T5-XXL급 (12B 모델) | 문맥 중심의 심층 contextual embedding |
[ text_encoder
– 경량 인코더 ]
- 일반적인 텍스트 조건 입력 처리 (e.g. “a cute robot”).
- 빠른 추론과 프롬프트 변환을 위해 사용 → 보조적 역할
[ text_encoder_2
– 대형 인코더 ]
- 약 9.5GB로, 이는 T5-XXL (12B 파라미터)급의 크기와 유사
- 전체 이미지 생성에 영향을 주는 심층 의미 추출을 담당
- 일반적인 텍스트 외에도 문맥, 의도, 세부 지시어 등 복합 정보까지 포함하여 반영
- 사실상 FLUX 모델의 핵심 의미 표현 장치 역할
b. 오토인코더 (VAE)
가. 역할
- 이미지 ↔ 잠재공간(Latent Space) 간 변환 모듈
- 생성 시점: 잠재 공간에 있는 이미지를 실제 이미지로 복원
- 학습 시점: 실제 이미지를 압축된 latent vector로 인코딩
- VAE는 이미지 생성의 시작점과 끝을 연결하는 통로
- 마치 사진을 압축해서 보내고, 다시 펼치는 이메일 첨부파일과 같은 존재
나. 동작 구조
[ 인코딩 단계 ]
- 입력 이미지 → CNN 기반 인코더 → 잠재 벡터
z
(보통 [B, 4, 64, 64] 크기) - 이 latent vector는 압축된 정보 표현
- 예: 512×512x3(RGB) 이미지 → 64×64x4 크기 latent space로 매핑(1024배 압축)
- Diffusion 모델은 이 latent 공간에서 노이즈를 제거하며 이미지를 생성
[ 디코딩 단계 ]
- 학습된 decoder가 latent vector를 받아 원본 이미지로 복원
다. 학습 방식
[ 학습 목표 ]
- 입력 이미지 → 잠재 표현 → 복원 이미지의 과정을 학습
- 이 과정에서 **압축된 표현(잠재 벡터)**이 얼마나 핵심 정보를 잘 담고 있는지가 관건
- 단순한 이미지 복사가 아니라, 이미지의 본질적인 특성을 파악하는 데 집중
- “강아지 사진”을 보고 “이건 강아지다”를 이해하고, 나중에 그걸 바탕으로 비슷한 강아지를 다시 그려내는 구조
- 즉, 그림의 느낌과 구성을 기억하고 다시 표현하는 능력을 기르는 훈련
- Diffusion 모델과 독립적으로 학습
- Diffusion 모델은 노이즈 제거에 집중해야 하므로, 이미지 표현 방식은 미리 정의되어 있어야 함
- 그래서 VAE는 사전에 잘 훈련된 압축기/복원기 역할을 하며, Diffusion과는 분리 학습
- 일단 잘 훈련된 VAE는 이후 과정에서 잠재 벡터만 주고받으며 협업하게 됨
- Diffusion 모델은 노이즈 제거에 집중해야 하므로, 이미지 표현 방식은 미리 정의되어 있어야 함
[ 학습 방식 ]
- VAE는 실제 이미지를 압축하고 다시 복원하면서 학습함
- “정보를 적게 담되, 중요한 건 놓치지 않게”가 목표
- 복원된 이미지가 흐릿하거나 왜곡되면 학습 실패로 간주
- 또한, 같은 이미지를 볼 때마다 조금씩 다른 방식으로 표현하게끔 유도됨
- 이는 모델이 보다 다양한 표현력을 갖게 하기 위한 장치
[ Diffusion 모델과의 연결 ]
- Diffusion 모델은 직접 이미지에 작용하지 않고, VAE가 만든 압축된 표현 공간(latent space)에서 작업
- 즉, VAE는 diffusion이 작업하기 좋은 무대를 마련해주는 역할
- 화가는 직접 도화지를 만지지 않고, VAE가 깔아준 스케치북에 그림을 그리는 셈
라. 요약
구성 요소 | 용량 | 아키텍처 추정 | 역할 |
---|---|---|---|
vae |
약 168MB | 경량 VAE (Autoencoder with CNN) | 이미지 ↔ 잠재 벡터 압축/복원 (latent space mapping) |
[ vae
– 경량 오토인코더 ]
- 전체 모델 중 가장 가벼운 모듈로, 복잡한 의미 분석보다는 형태 재구성에 초점을 둔 구조
- Stable Diffusion 등에서도 사용되는 전형적인 CNN 기반 오토인코더와 유사 구조로 추정
c. FluxTransformer2DModel(ViT 기반)
가. 역할
- latent space에서 노이즈를 제거하며, 이미지 생성 방향을 조정하는 핵심 모듈
- ViT 구조를 기반으로 하되, 이미지 생성의 특성에 맞게 최적화된 Vision Transformer 구조
- 텍스트 조건과 결합되어 텍스트-이미지 간 의미 정렬까지 담당 (후반부에 Cross-Attention 포함)
나. Vision Transformer (ViT)의 기본 동작 흐름
[ 1. 입력 이미지 → 패치 생성 ]
- 입력 이미지를 일정 크기의 패치로 나눔 (예: 16×16)
- 각 패치를 벡터로 변환 (Linear Layer)
[ 2. 위치 임베딩 추가 ]
- 순서 인식이 불가능한 Transformer에 위치 정보 부여
[ 3. Transformer 인코더 반복 구조 (L번) ]
-
각 인코더 블록
① Multi-Head Self-Attention → 관계 정보 통합
② Feed-Forward Network → 표현력 확장
-
반복을 통해 점점 더 깊은 문맥, 관계, 의미 흐름을 반영
[ 4. 최종 출력 ]
- 각 패치에 대한 풍부한 표현 벡터
- 이후 조건 이미지 생성 등에 활용
→ ViT는 입력 간 어떤 관계를 중요하게 볼지 배우는 구조
→ 어떤 목적으로 학습하느냐에 따라 주목하는 관계가 달라지고, 최종 출력도 달라짐
-
이미지 분류용 ViT: 전체 이미지를 대표하는 패치에 주목
-
CLIP의 ViT: 텍스트와 의미가 비슷한 이미지 부분에 주목
-
FLUX의 ViT: 노이즈가 섞인 이미지에서 어떤 부분이 노이즈인지 찾도록 학습
-
ViT 상세 구조
[ 1. 입력 이미지 → 패치 토큰 생성 ]
- 일반적인 Transformer는 단어 시퀀스를 입력으로 받음 (e.g.
[CLS] the dog runs ...
).- 이미지를 처리하려면, 이미지를 문자열처럼 쪼갤 필요가 있음
- 입력 이미지를 고정 크기의 패치들로 분할
- 예: 224×224 RGB 이미지 → 16×16 패치 크기로 나누면 → 총 14×14 = 196개 패치
- 각 패치를 **1차원 벡터(flatten)**로 변환
- 예: 16×16 크기의 RGB 패치 → 16×16×3 = 768차원 벡터
- 선형 레이어로 임베딩
- 예: 768차원 벡터를 고정된 임베딩 차원 D (예: 512, 768 등)으로 변환
- 결과: 모든 패치가 동일한 차원의 토큰 벡터로 변환됨 →
[N_patches, D]
[ 2. 위치 정보 추가 ]
- Transformer는 순서를 인식할 수 없으므로 위치 임베딩을(Positional Embedding) 추가하여 순서 없는 토큰 → 순서 있는 정보로 변환
- 각 패치에 위치 임베딩을 더함으로써, 모델은 “이 패치가 이미지의 어디쯤에 위치하는지” 인지 가능.
- 예: 왼쪽 상단의 하늘 패치와 오른쪽 하단의 땅 패치를 구분할 수 있게 됨.
- Attention 연산에서 “어디에 있는 무엇”인지 구분하여 처리 가능.
- FLUX나 Stable Diffusion의 Transformer2D는 일반적으로 2D grid 기반 learnable position embedding을 사용
- 즉, 각 patch의 (행, 열 위치)에 따른 벡터를 학습하여 추가하는 구조
- 결과:
[N_patches, D]
형식은 그대로지만, 토큰 벡터에는 각 패치에 대한 내용 뿐 아니라 ‘어디에 위치하는지’ 까지 담긴 표현 벡터로 변환
[ 3. Transformer 인코더에 입력 ]
- 패치 임베딩 + 위치 정보가 담긴 표현 벡터를 입력으로 받아, L개의 인코더 블록을 거쳐 더 풍부한 표현 벡터 시퀀스로 변환
- 인코더는 L개의 반복 블록으로 구성되어 있고, 각 블록은 Multi-Head Self-Attention와 Feed-Forward Network 두가지 서브 레이어로 구성
- Multi-Head Self-Attention(MHSA)
- 각 패치가 모든 다른 패치에 대해 ‘어떤 패치에 주목하면 좋을지’를 계산하고, 계산된 ‘주목도(Attention Score)’를 각 패치의 정보 값과 가중합하여 새로운 패치 표현 생성
-
예: “강아지 패치”가 주변 패치들과의 관계를 평가했을 때, 잔디 패치에는 Attention Score 0.9, 하늘 패치에는 0.1을 부여
→ 강아지와 잔디의 시각적·의미적 연관성을 더 높게 평가함
-
이 attention score들은 대상 패치들의 표현 벡터에 곱해진 후 가중합되어, 강아지 패치의 새로운 표현 벡터로 반영됨
-
- 결과: 기존 내용 정보 + 위치 정보 + 관계 정보가 결합된 의미적 표현 벡터 출력 → “어디에 있는 무엇이며, 다른 것과 어떤 관계가 있는가”를 포함
- 내용 정보 (Content) : 각 패치가 가진 시각적 특성
- 예: 강아지의 색, 질감, 형태 등
- 위치 정보 (Position) : 각 패치가 있었던 공간적 위치
- 예: 강아지 패치가 “왼쪽 아래에 있음” 같은 공간 정보
- 관계 정보 (Relational Context) : 문맥적으로 중요한 요소들과의 연결성이 강화 → 장면 내 역할을 인식한 정보
- 예: 강아지 패치가 잔디 패치에 0.9, 하늘 패치에 0.1의 주목도를 부여하고, 더 주목할 만한 패치들의 정보가 현재 패치에 가중 반영
- 내용 정보 (Content) : 각 패치가 가진 시각적 특성
- 각 패치가 모든 다른 패치에 대해 ‘어떤 패치에 주목하면 좋을지’를 계산하고, 계산된 ‘주목도(Attention Score)’를 각 패치의 정보 값과 가중합하여 새로운 패치 표현 생성
- Feed-Forward Network(FFN)
- Self-Attention을 통해 얻은 각 패치의 표현 벡터를 개별적으로 FFN을 통과시켜, 비선형 특성이 확장된 벡터로 변환
- 일반적으로 2개의 선형 변환 레이어 + 비선형 활성화 함수로 구성
- 예: 입력
[N_patches, D]
→ 내부[N_patches, D_hidden]
→ 출력[N_patches, D]
- 여기서
D_hidden
은 일반적으로D
의 4배
- 여기서
- 결과:
- 표현력 증강: Self-Attention으로는 캡처되지 않는 고차원 의미나 패턴을 보완(Linear Layer를 거치며
D_hidden
차원으로 확장됐다가 압축) - 비선형성 부여: 다양한 feature 조합을 가능하게 하여 모델의 표현 유연성 강화(활성화 함수를 통해 비선형성 부여)
- 정보 재구성: 입력 표현에서 의미적으로 중요한 부분을 강조, 중요하지 않은 정보는 억제
- 표현력 증강: Self-Attention으로는 캡처되지 않는 고차원 의미나 패턴을 보완(Linear Layer를 거치며
- Self-Attention을 통해 얻은 각 패치의 표현 벡터를 개별적으로 FFN을 통과시켜, 비선형 특성이 확장된 벡터로 변환
- MHSA + FFN 으로 구성된 블록을 L번 반복
- 초기 입력
- 각 패치 벡터: 내용 정보 + 위치 정보 포함
- Self-Attention: “이 내용과 위치를 기준으로 어디에 주목할까?” 계산 → 주목도 산출
- 1번째 Attention 이후
- 각 벡터에 초기 관계 정보가 반영
- FFN을 통해 비선형 표현력 확장
- 2번째 Attention
- 입력 벡터에는 이미 관계 정보 포함
- 더 문맥적인 주목 기준으로 Attention Score 계산
- 반복을 통해
- 벡터는 점점 의미 흐름, 스타일, 장면 구성 요소 간의 연결성을 포함
- Attention 연산도 점점 더 정교하고 추론 중심적인 계산으로 발전
- 결과
- 초기: “어디에 뭐가 있지?” 수준의 판단
- 반복 후: “이 장면에서 이 요소가 어떤 역할을 하지?”라는 맥락 기반 표현 추론
- 초기 입력
- Multi-Head Self-Attention(MHSA)
- 일반적인 Transformer는 단어 시퀀스를 입력으로 받음 (e.g.
다. FluxTransformer2DModel에서의 ViT 활용 방식
[ 1. 입력: 노이즈가 추가된 latent 이미지 ]
- 원본 이미지를 VAE 인코더로 압축해, 이미지 구조(공간성)와 시각적 특징을 담은 latent space를 생성
- 이 latent space에 일정량의 노이즈를 추가
[ 2. FluxTransformer2DModel에 입력 ]
- latent + noise를 Transformer 구조로 구성된 FluxTransformer2DModel에 입력
- FluxTransformer2DModel 내부 구조는 ViT와 유사한 반복 블록(MHSA + FFN)으로 구성
[ 3. MHSA + FFN 블럭 반복 구조로 노이즈 감지 ]
- FluxTransformer2DModel은 ViT 인코더 구조를 그대로 활용
- 다만, 입력된 latent(노이즈 포함)를 다음과 같이 처리
- 각 패치 간 관계를 파악 (Multi-Head Self-Attention)
- “이 패치가 주변과 어울리는지, 아니면 이상한지(노이즈 성분인지)”를 판단
- 패치 간 의미·위치·관계 정보를 기반으로 판단
- FFN으로 개별 패치 표현을 보강
- 복잡한 특징 조합 및 고차원 의미 강화
- 정보 필터링 및 재구성
- 블록을 여러 번 반복 (L번 반복)
- 반복할수록 더 깊은 문맥 이해와 정밀한 노이즈 판단이 가능
- 처음엔 단순한 노이즈 제거지만, 점차 “문맥상 어색한 요소”까지 제거
- 각 패치 간 관계를 파악 (Multi-Head Self-Attention)
[ 4. 출력: 노이즈 예측값 (ε̂) ]
- FluxTransformer2DModel은 각 위치에 대한 "노이즈 추정 벡터"를 출력
- 즉, 입력 latent에서 노이즈로 간주되는 값들을 반환
[ 5. 노이즈 제거 후 반복 ]
- 이 예측된 노이즈(ε̂)를 이용해, 입력 latent에서 이를 제거한 새로운 latent를 생성
- 이 과정을 step 수만큼 반복적으로 수행하면서, latent는 점점 더 원본에 가까워짐
[ 6. 최종 이미지 생성 ]
- 모든 디노이징 과정을 거친 최종 latent를 VAE 디코더가 받아 이를 실제 이미지로 복원