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. 구성 요소

a. 텍스트 인코더 (text_encoder_1, text_encoder_2)

가. 역할

  • 텍스트 인코더는 사용자의 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는 이후 과정에서 잠재 벡터만 주고받으며 협업하게 됨

[ 학습 방식 ]

  • 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의 주목도를 부여하고, 더 주목할 만한 패치들의 정보가 현재 패치에 가중 반영
      • 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 조합을 가능하게 하여 모델의 표현 유연성 강화(활성화 함수를 통해 비선형성 부여)
          • 정보 재구성: 입력 표현에서 의미적으로 중요한 부분을 강조, 중요하지 않은 정보는 억제
      • MHSA + FFN 으로 구성된 블록을 L번 반복
        • 초기 입력
          • 각 패치 벡터: 내용 정보 + 위치 정보 포함
          • Self-Attention: “이 내용과 위치를 기준으로 어디에 주목할까?” 계산 → 주목도 산출
        • 1번째 Attention 이후
          • 각 벡터에 초기 관계 정보가 반영
          • FFN을 통해 비선형 표현력 확장
        • 2번째 Attention
          • 입력 벡터에는 이미 관계 정보 포함
          • 문맥적인 주목 기준으로 Attention Score 계산
        • 반복을 통해
          • 벡터는 점점 의미 흐름, 스타일, 장면 구성 요소 간의 연결성을 포함
          • Attention 연산도 점점 더 정교하고 추론 중심적인 계산으로 발전
        • 결과
          • 초기: “어디에 뭐가 있지?” 수준의 판단
          • 반복 후: “이 장면에서 이 요소가 어떤 역할을 하지?”라는 맥락 기반 표현 추론

다. 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번 반복)
      • 반복할수록 더 깊은 문맥 이해와 정밀한 노이즈 판단이 가능
      • 처음엔 단순한 노이즈 제거지만, 점차 “문맥상 어색한 요소”까지 제거

[ 4. 출력: 노이즈 예측값 (ε̂) ]

  • FluxTransformer2DModel은 각 위치에 대한 "노이즈 추정 벡터"를 출력
  • 즉, 입력 latent에서 노이즈로 간주되는 값들을 반환

[ 5. 노이즈 제거 후 반복 ]

  • 이 예측된 노이즈(ε̂)를 이용해, 입력 latent에서 이를 제거한 새로운 latent를 생성
  • 이 과정을 step 수만큼 반복적으로 수행하면서, latent는 점점 더 원본에 가까워짐

[ 6. 최종 이미지 생성 ]

  • 모든 디노이징 과정을 거친 최종 latent를 VAE 디코더가 받아 이를 실제 이미지로 복원