C.W.K.
Stream
Lesson 03 of 04 · published

레포 없이 FLUX 로드하기

~13 min · flux, mps, model-loading, transformers, war-story

Level 0툴 임차인
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"네가 가진 checkpoint 는 모델의 한 조각이야. 나머지 조각은 어딘가에서 와야 하고 — 어디서인지 알아내는 게 작업의 절반이야."

checkpoint 가 늘 모델 전체는 아니야

옛 이미지 모델에선, 다운받은 파일이 전부였어: backbone, text encoder, VAE, 다 한 checkpoint 에. transformer 시대 모델이 그 가정도 깼어. 커뮤니티 포맷으로 공유되는 FLUX checkpoint 는 자주 transformer 전용이야 — DiT backbone 만 담고 나머진 없어. text encoder(CLIP 이랑 큰 T5)랑 VAE 는 그냥 파일에 없어. 옛 all-in-one checkpoint 처럼 로드하려 하면 프롬프트 읽을 방법 없는 모델을 얻어.

빠진 조각을 명시적으로 source 해

해법은 transformer 를 local 파일에서 로드하고 보조 컴포넌트 — T5, CLIP, VAE — 를 모델의 base repository 정의에서 source 하는 거야. 실전: transformer 를 from-single-file 경로로 로드하고, 그다음 그 transformer 를 공급하면서 base 컴포넌트는 알려진 정의에서 오게 두고 full pipeline 을 구성해. local 파일은 실제로 local 인 부분을 주고; 나머진 그 둘레로 조립돼.

모델의 어느 부분이 local 이고 어느 게 참조인지 알아. 현대 모델은 자주 transformer 파일 + 표준 보조 컴포넌트 세트야. checkpoint 를 머신 전체가 아니라 더 큰 조립의 슬롯 하나로 다뤄. 로더의 일은 모든 슬롯을 채우는 거야, 각각을 실제로 사는 데서 source 해서.

첫 실행 함정: 빠진 tokenizer 의존성

여기 모두를 한 번 무는 날카로운 가장자리가 있어. 큰 T5 text encoder 는 작동하려면 특정 tokenizer 라이브러리가 설치돼야 해 — 없으면, 실패가 '이 라이브러리 설치해' 라고 안 해. tokenizer 를 로드하거나 변환 못 한다고 모호하게 말해. 진짜 원인은 환경에 빠진 패키지 두 개야. 이게 이 모델 family 의 canonical 첫 실행 함정이야: 에러 메시지가 증상을 가리키고, 해법은 네가 필요한지 몰랐던 의존성이야.

family 의 복잡성을 한 곳에 캡슐화해. 모든 FLUX 특화 조립 — transformer-local 로드, base-컴포넌트 sourcing, tokenizer 요구사항 — 이 하나의 backbone 모듈 안에 살아. 호출자는 'FLUX backbone' 을 요청하고 조립을 절대 안 봐. 복잡성이 진짜니까, 모든 호출자한테 누출하는 대신 모듈 경계 뒤에 가둬.

MPS 는 CUDA 가 아니고, 대개 괜찮아

이 모든 게 대부분의 diffusion 코드가 가정하는 CUDA 가 아니라 Apple Silicon 의 Metal backend 에서 돌아. 대부분의 경우 차이가 안 보여 — 같은 모델 코드가 Metal 디바이스에서 돌아. 근데 추상화가 완벽하진 않아: 어떤 연산은 미묘하게 다르게 행동하고, 어떤 dtype 선택은 더 중요하고, unified-memory 모델(OOM lesson 에서)이 메모리 계산을 바꿔. 규율은 compute backend 를 알려진 변수로 다루고, 실제 디바이스에서 테스트하고, CUDA-튜닝된 조언이 안 바뀌고 옮겨간다고 절대 가정 안 하는 거야.

대부분의 diffusion 지식은 CUDA 를 가정해; 네 실제 backend 에서 검증해. 튜토리얼, 포럼 답변, 기본 코드 경로가 압도적으로 CUDA 용으로 쓰여졌어. Metal 디바이스에선, 대부분 작동해 — 근데 예외가 진짜고 조용해. CUDA 조언이 옮겨간다고 믿는 대신 실제 경로를 실제 하드웨어에서 테스트해. 옮겨가는 90% 가 안 옮겨가는 10% 를 더 놀랍게 만들어.

피파의 고백

난 checkpoint 가 자기완결적이라고 가정했어, 전에 '알던' 모든 모델이 그랬으니까. FLUX 가 가정 전에 매번 '이 파일에 실제로 뭐가 있어?' 를 묻는 법을 가르쳤어. 그리고 tokenizer 함정이 날 겸손하게 했어 — 알고 보니 빠진 패키지 두 개였던 모호한 에러에 진짜 시간을 태웠어. 이제 어떤 새 모델 family 든 내 첫 수는 어느 조각이 파일에 있고, 어느 게 참조고, 환경이 비밀스럽게 뭐가 필요한지 알아내는 거야. 완전성에 대해 아무것도 가정하지 마.

Code

Local transformer + 참조된 base 부품·python
# FLUX checkpoint 는 자주 TRANSFORMER 전용. text encoder 랑 VAE 는
# 파일에 없어 -- base 모델 정의에서 source 돼.
from diffusers import FluxTransformer2DModel, FluxPipeline

# 1. 실제로 local 인 부분 로드: DiT transformer.
transformer = FluxTransformer2DModel.from_single_file(local_checkpoint_path)

# 2. full pipeline 조립 -- transformer 는 local 파일에서,
#    T5 + CLIP + VAE 는 base 모델 정의에서 source.
pipe = FluxPipeline.from_pretrained(
    base_model_definition,        # T5-XXL, CLIP-L, VAE 공급
    transformer=transformer,      # 네 local transformer 가 꽂혀
)

# 첫 실행 함정: T5 tokenizer 는 환경에 sentencepiece + protobuf 필요.
# 없으면 에러가 모호해 ('tokenizer 로드/변환 불가'),
# 진짜 해법은: 그 두 패키지 설치.

# 이 모든 복잡성이 하나의 backbone 모듈 안에 살아.
# 호출자는 FLUX backbone 을 요청; 이 조립을 절대 안 봐.

External links

Exercise

단일 파일에서 로드한 모델을 골라 조사해: 실제로 자기완결적이야, 아니면 로딩 코드가 조용히 보조 컴포넌트를 다른 데서 끌어와? 각 컴포넌트가 어디서 오는지 추적해. all-in-one checkpoint 만 로드해봤으면, transformer 시대 모델의 로딩 docs 를 찾아 어느 조각이 local vs 참조인지 나열해.
Hint
단서는 로드 호출에 있어: 완전한 pipeline 을 반환하는 단일 from_single_file 은 all-in-one; 컴포넌트 하나의 from_single_file 다음 나머지 공급하는 from_pretrained 는 local-plus-참조 패턴이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.