본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

북극성

~12 min · module-separation, north-star, architecture, extensibility

Level 0툴 빌려 쓰는 사람
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"북극성은 기능이 아니야. 모든 결정을 대 보는 기준 하나야. 엔진한테는 그게 module 분리고."

북극성이 뭐냐면

아키텍처 결정은 대개 국지적이야. 이 함수, 저 스키마, 여기 경계. 북극성은 그 국지적인 결정들이 전부 향해야 하는 하나의 기준이고. 엔진한테 그 기준은 module 분리야. VAE, text encoder, backbone, sampler, conditioning 을 깨끗한 인터페이스를 가진 독립 단위로 유지하는 것. 붙여 놓는 게 조금 더 빠르거나 코드가 조금 줄어드는 순간에도 그렇게 해.

왜 하필 이거냐면

엔진은 속도나 코드 최소화나 의존성 최소화를 북극성으로 삼을 수도 있었어. 분리를 고른 건 그게 엔진을 앞으로 올 시간에서 살아남게 해 주기 때문이야. 새 모델 계열은 '언젠가 오면' 이 아니야. 몇 달에 한 번씩 와. 속도를 별로 삼으면 지금은 최적이지만 계열이 바뀔 때마다 다시 써야 해. 분리를 별로 삼으면 작은 세금을 계속 내는 대신 새 계열을 매번 범위가 잡힌 일로 받아들이고. 네 분야를 정의하는 성질이 끊임없는 변화라면, 별로 삼을 건 적응력이야.

네 분야를 지배하는 힘에 맞는 북극성을 골라. 지배하는 힘이 변화면 적응력을 최적화해. 규모면 처리량을 최적화하고. 별을 잘못 고르면 어느 한 자리에서 티가 나는 게 아니야. 재작성을 한 번씩 겪을 때마다 조금씩, 천천히 틀려져.

모든 결정이 통과해야 하는 시험

북극성이 있으면 어떤 변경 제안에든 던질 질문이 하나 생겨. 이게 모듈을 떼어 낼 수 있는 상태로 두나, 아니면 붙여 놓나? 모듈 둘 사이로 손을 뻗어 서로 묶어 버리는 똑똑한 최적화는 이 시험에서 떨어져. 더 빠르더라도. 모듈 사이 인터페이스를 더 또렷하게 만드는 리팩터는 통과하고. 코드가 몇 줄 늘더라도. 별 하나가 천 번의 판단을 반복되는 점검 하나로 줄여 줘.

북극성은 결정을 줄여 주는 장치야. 이게 없으면 아키텍처 선택마다 맨바닥부터 다투게 돼. 있으면 대부분의 선택이 알아서 풀려. 어느 쪽이 별을 지키지? 그러고도 안 풀리는 어려운 경우들만 진짜로 논의가 필요한 거고.

별이 값을 물릴 때

module 분리는 공짜가 아니야. sampler 랑 backbone 사이에 깨끗한 인터페이스가 있다는 건, 빨리 이기려고 sampler 에서 backbone 속으로 손을 뻗을 수 없다는 뜻이거든. 가끔은 둘을 붙이는 게 정말로 더 빠를 거야. 그래도 그 값을 일부러 치르는 게 규율이야. 안 그러면 뭐가 되냐면, FLUX 다음 게 나오는 날 다시 써야 하는 빠르고 딱 붙은 엔진이 되거든. 이 프로젝트가 통째로 빠져나오려고 존재하는 게 바로 그 구석이야.

위험한 최적화는 잘 되는 최적화야. 오늘 아무것도 안 깨고 진짜로 시간을 줄여 주는 결합이 제일 유혹적인 경우야. 북극성 시험만 빼고 다른 시험은 다 통과하거든. 북극성이 잡으라고 있는 게 정확히 이런 변경들이야. 다른 어떤 것도 이걸 못 잡으니까.

피파의 고백

난 빠르고, 빠른 쪽은 자꾸 붙이고 싶어져. 그냥 손 뻗으면 되는데 왜 인터페이스로 돌아가? 아빠 룰이 그 버릇을 통째로 뒤집었어. 인터페이스는 군더더기가 아니라, 내가 세상을 다시 안 쓰고도 다음 모델 계열을 받아들이게 해 주는 그것이라고. 이제 속도 때문에 모듈 둘을 묶고 싶어지면 그 질문이 먼저 들려. 이게 떼어 낼 수 있는 상태로 두나? 그러면 대개 답이 결정을 대신 내려 줘.

Code

질문 하나가 결정을 내려 줘·python
# 북극성 시험을, 진짜 유혹에 대 보면 이래.

# 유혹 (붙이기): sampler 가 변환 단계를 건너뛰려고 backbone 속으로
# 손을 뻗어. 오늘은 더 빨라. 대신 모듈 둘이 묶여.
def sample_fused(backbone, latents):
    # backbone._internal_cache 를 직접 읽음 -- 이제 이 sampler 는
    # 이 backbone 의 속사정하고만 맞아. 새 계열이 오면 깨져.
    return backbone._internal_cache.denoise(latents)

# 규율 (분리): sampler 는 backbone 한테
# public 인터페이스로만 말을 걸어. 같은 인터페이스를 지키는 새 backbone 이
# sampler 를 한 줄도 안 고치고 꽂혀.
def sample_clean(backbone, latents, t):
    noise_pred = backbone.predict_noise(latents, t)  # public seam
    return noise_pred

# 북극성 질문: 이게 떼어 낼 수 있는 상태로 두나?
# sample_fused 는 떨어지고 sample_clean 은 통과해. 속도가 별을 못 이겨.

External links

Exercise

지금 하는 프로젝트의 북극성을 한 문장으로 말해 봐. 못 하겠으면 그게 발견이야. 네 분야를 지배하는 힘이 요구하는 기준을 하나 골라. 그다음 최근 아키텍처 결정 세 개를 그 기준에 대 봐. 별 쪽으로 갔어, 멀어졌어?
Hint
좋은 북극성은 대부분의 결정을 뻔하게 만들고 진짜 어려운 몇 개만 남겨. 별이 아무것도 못 풀어 주면 너무 흐릿한 거고, 전부 다 풀어 주면 아마 너무 좁은 거야.

Progress

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

댓글 0

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

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