원문 캡처 · huggingface.co
원문 캡처 · huggingface.co

Black Forest Labs의 FLUX 3 Image Klein은 텍스트로 이미지를 만들거나 기존 이미지를 편집하는 5.6B 이미지 변환기 모델이다. 프롬프트와 최대 10장의 참고 이미지를 입력받으며, 텍스트-이미지 생성과 단일·다중 참고 이미지 편집을 같은 모델로 처리한다.

이 저장소에는 생성·편집용 증류 체크포인트가 담겼다. BF16 모델과 FP8·NVFP4 변형, Qwen3-VL-4B-Instruct 텍스트 인코더, 이미지 오토인코더가 포함된다. 5.6B라는 수치는 이미지 변환기만 가리키며 텍스트 인코더는 별도다. 미세 조정이나 LoRA 학습, 연구에는 FLUX 3 Image Klein Base를 사용하도록 안내한다. 추론 코드는 GitHub 저장소에서 제공한다.

프롬프트에 0~1000 좌표 격자의 경계 상자를 지정해 요소의 위치와 크기를 안내할 수 있다. 다만 경계 상자는 픽셀을 고정하는 마스크가 아니며, 요소가 상자 밖으로 나올 수 있고 편집이 요청하지 않은 영역을 바꿀 수도 있다. 짧은 프롬프트는 일반적인 결과를 낼 수 있어 장면의 구도·대상·배경·조명을 구체적으로 설명하는 방식이 권장된다. 참조 이미지는 내용을 고정하지 않고 기준으로 제공한다.

모델 파일은 완전한 추론 애플리케이션이 아니다. 해당 체크포인트 형식과 flow-map 샘플링을 지원하는 추론 구현이 필요하며, 양자화 패키지에는 해당 형식을 지원하는 로더가 필요하다. 모델 저장소에 접근하려면 연락처 정보 공유 조건에 동의해야 한다.

FLUX Kommunity License v.1.0은 비상업적 이용을 허용한다. 연간 총매출이 미화 500만 달러 미만인 적격 사용자는 약관에 따라 상업적 결과물 생성 예외를 적용받을 수 있지만, 상업적 미세 조정이나 배포까지 포괄적으로 허용하는 것은 아니다. 구체적인 조건과 군사 목적, 감시, 생체정보 처리 등 이용 제한은 전체 라이선스에서 확인해야 한다.

모델 카드에 따르면 참고 코드로 B200에서 1024×1024 이미지를 생성할 때 프롬프트 업샘플러를 끈 피크 GPU 메모리는 BF16 31GB, FP8 26GB, NVFP4 25GB다. 프롬프트 업샘플러를 쓰면 80GB GPU에서 약 28GB가 추가된다. 모델은 사실 정보 제공용이 아니며, 이미지에 그린 텍스트가 부정확하거나 왜곡될 수 있다.

부록: 원문 예시

text
from huggingface_hub import snapshot_download snapshot_download(     repo_id="black-forest-labs/flux-3-image-klein",     local_dir="weights/flux-3-image-klein",     allow_patterns=[         "model.safetensors", "config.json", "manifest.json",         "ae.safetensors", "text_encoder/*",         "README.md", "LICENSE.md", "NOTICE.md",     ], ) 
text
import torch from diffusers import ModularPipeline pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein") pipe.load_components(dtype=torch.bfloat16) pipe.to("cuda") image = pipe(     prompt="A wide-angle photograph of a lone American bison in a misty geothermal landscape, half hidden by white steam, a slate-blue stream and evergreens fading into the mist behind. Muted, cool palette, soft overcast light.",     generator=torch.Generator().manual_seed(0),     output="images", )[0] image.save("bison.png") night = pipe(     prompt="The same lone American bison in the same misty geothermal landscape, now at night under a full moon: the steam lit from behind, cool blue light, deep shadows, stars above the evergreens.",     image=image,     generator=torch.Generator().manual_seed(0),     output="images", )[0] night.save("bison_night.png") 
text
import json from huggingface_hub import hf_hub_download from transformers import AutoProcessor, Qwen3_5ForConditionalGeneration pup_id = "black-forest-labs/flux-3-image-klein-pup" processor = AutoProcessor.from_pretrained(pup_id) upsampler = Qwen3_5ForConditionalGeneration.from_pretrained(pup_id, dtype=torch.bfloat16, device_map="auto").eval() system_prompts = json.load(open(hf_hub_download(pup_id, "system_prompts.json"))) def upsample(prompt, images=()):     if images:         text = (             "Reference images follow in order (the first image, the second image, ...).\n"             f"User request: {prompt}\nOutput the caption."         )         content = [{"type": "image", "image": image} for image in images] + [{"type": "text", "text": text}]         messages = [{"role": "system", "content": system_prompts["i2i"]}, {"role": "user", "content": content}]     else:         messages = [{"role": "system", "content": system_prompts["t2i"]}, {"role": "user", "content": prompt}]     inputs = processor.apply_chat_template(         messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", enable_thinking=False     ).to(upsampler.device)     with torch.no_grad():         output = upsampler.generate(**inputs, max_new_tokens=3584, do_sample=False)     return processor.decode(output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True).strip() image = pipe(prompt=upsample("A bison in a misty geothermal landscape"), output="images")[0] 
text
pipe(prompt=upsample(instruction, [image]), image=image, ...)