"부품은 빌려. framework 는 거부해. 그 차이가 누가 네 API 를 영원히 소유하는지 정해."
같은 라이브러리, 두 가지 사용법
diffusers 라이브러리(Hugging Face)는 diffusion 모델의 표준 toolkit 이야. 엔진은 거기 깊게 의존해 — 그리고 대부분을 거부하기도 해. 모순이 아니라 규율이야. diffusers 는 parts library(컴포넌트 빌려서 직접 조립)로 쓸 수도, framework(파이프라인 클래스가 네 구조를 지시하게)로 쓸 수도 있어. 엔진은 첫째를 하고 둘째를 금지해.
빌리는 것 (부품)
diffusers 는 훌륭한 저수준 조각을 출하하고, 이것들은 엔진이 자유롭게 써:
- 로더 — safetensors 파일 읽기, tensor 구체화.
- 모듈 클래스 — 직접 인스턴스화할 수 있는 VAE, U-Net, DiT, MMDiT 구현.
- scheduler 구현 — Euler, DPM++, DDIM, flow-match, 이미 올바른.
- attention primitive — 다시 쓰고 싶지 않은 최적화된 커널.
이것들은 부품이야: 좁은 작업을 가진 자기완결적 컴포넌트. 집어 들고, 네 인터페이스 뒤에 두고, 엔진을 네 방식으로 조립해.
거부하는 것 (framework)
diffusers 는 파이프라인 클래스도 출하해 — 모든 걸 엮어서 한 번 호출 generate 를 주는 고수준 SomePipeline.from_pretrained(...) 객체. 편리해. framework 이기도 하고. 각 파이프라인 클래스는 작업 모양(sync vs async), 에러 처리, kwarg 춤, conditioning 관례, 캐시 디렉토리에 대한 의견을 가져. 하나를 네 API 로 노출하면 그 모든 의견을 네 public 계약으로 채택한 거야.
왜 이 구분이 존재론적인지
함정을 구체적으로. route 가 diffusers 파이프라인이 반환하는 걸 그대로 반환하면, 모든 클라이언트 — 작업실, 뇌, 미래 도구 — 가 이제 diffusers 의 출력 모양에 결합돼. diffusers 가 그 모양을 바꾸는 날, 또는 모델 하나를 다른 backend 로 스왑하고 싶은 날, 모든 클라이언트가 깨져. diffusers 에 의존한 게 아니라; 결혼한 거고, 모든 클라이언트를 사돈으로 만든 거야. 부품을 네 인터페이스 뒤에 감싸면 이혼이 늘 가능하게 남아.
reference-implementation 수
이 규율엔 보너스가 있어. 새 모델 family 가 나오면, diffusers 가 보통 며칠 안에 파이프라인 클래스를 추가해. 그 파이프라인을 노출 안 해 — 근데 새 backbone 을 어떻게 엮는지의 reference 구현으로 읽고, 네 인터페이스 뒤에 네 모듈을 지어. diffusers 가 돌아가는-문서가 돼: 새 의견 안 물려받고 새 배선을 배우는 가장 빠른 길.