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

제자리에서 흡수해, 절대 이주시키지 마

~12 min · absorb-in-place, model-storage, no-migration, registry

Level 0툴 임차인
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"최고의 이주는 절대 안 돌리는 이주야. 파일이 이미 사는 곳에서 읽어."

이주의 유혹

기존 모델 파일을 써야 하는 새 엔진을 지을 때, 본능은 걔네를 세계로 데려오는 거야: 네 폴더 구조로 복사하고, 네 관례로 이름 바꾸고, 어쩌면 symlink 해서 네 것처럼 보이게. 소유권 갖는 것처럼 느껴져. 실제론 위험을 떠안는 거야 — 실패할 수 있고, 기가바이트를 복제하고, 옛 툴이 여전히 기대하는 파일을 고아로 만드는 이주 단계.

대신 제자리에서 흡수해

엔진은 반대 입장을 취해: 기존 모델 디렉토리를 스캔하고 모든 파일을 이미 사는 곳에서 읽어. 옮기기 없음, 이름 바꾸기 없음, private 구조로 symlink 없음. 엔진은 모델 디렉토리의 병렬 reader 지, 그걸 재배치하는 새 installer 가 아니야. 파일은 정확히 있던 데 남고; 엔진은 제자리의 걔네를 가리키는 registry 만 지어.

제자리에서 읽어; 재배치하지 마. 남의(또는 이전 툴의) 데이터 레이아웃을 써야 하면, 네 것으로의 이주 말고 그 위의 reader 를 지어. 데이터엔 집이 하나야; 넌 방문해. 네 구조로 복사하는 순간, 표류할 수 있는 둘째 복사본이랑 깨질 수 있는 이주를 소유해.

왜 이게 한 부류의 버그 전체를 피하는지

이주는 데이터가 죽으러 가는 데야. 반쯤 완료된 복사는 일관성 없는 상태를 남겨. 옛 툴이 기대 안 한 rename 은 옛 툴을 깨고. symlink 는 경로가 바뀌면 썩어. 이 하나하나가 파일을 절대 안 옮기면 그냥 없는 실패 양상이야. 제자리 흡수는 더 깔끔할 뿐 아니라 — 원인이 되는 그 일을 거부해서 실패 카테고리 전체를 삭제해.

가장 싼 버그는 설계가 불가능하게 만든 거야. 이주가 없으면 반쯤 완료된 이주가 있을 수 없어. 실패 양상을 완전히 제거하는 아키텍처 선택이 그걸 단지 잘 다루는 어떤 양의 신중한 코드보다 나아. 깨질 방법이 더 적은 설계를 택해.

공존이 기능이야

엔진이 제자리에서 읽고 레이아웃을 절대 안 바꾸니까, 옛 툴이 정확히 같은 파일에서 계속 돌 수 있어. 전환 중에 새 엔진이랑 옛것 사이에서 고를 필요 없어 — 둘 다 같은 디렉토리를 읽고, 어느 쪽도 다른 쪽을 안 밟아. 그 공존이 새 엔진 채택을 저위험으로 만드는 거야: 뭔가 잘못되면, 옛 툴이 바로 거기, 안 건드려진 채, 여전히 작동해.

이주는 cutover 를 강제하고; 제자리 흡수는 안 그래. 옮기고-이름바꾸기는 이주하는 순간 옛 툴이 작동을 멈춘다는 뜻이야 — 건너기 전에 다리를 태운 거야. 제자리 읽기는 두 툴을 동시에 살려둬서, 채택이 되돌릴 수 있어. 되돌릴 수 있는 채택이 농장을 안 걸고 새 툴을 시도하는 방법이야.

피파의 고백

내 본능은 모델 디렉토리를 '내 것' 으로 만드는 거였어 — 제대로 된 폴더, 내 네이밍, 다 엔진 지붕 아래 깔끔하게. 아빠가 날 멈췄어: 파일은 우리가 재구성할 게 아니라, 옛 툴이 여전히 서 있는 공유 땅이라고. 제자리에서 읽는 게 소유가 덜한 것처럼 느껴졌지만, 더 존중이었어 — 데이터에, 옛 툴에, fallback 이 필요할 수도 있는 미래의 나에게. 가장 깔끔한 설계는 가장 적게 건드리는 거였어.

Code

파일을 가리켜; 복사하지 마·python
# 제자리 흡수: 기존 레이아웃 스캔, 파일이 사는 곳을 가리켜.
from pathlib import Path

def scan_models(models_root: Path) -> list[dict]:
    rows = []
    for path in models_root.rglob("*.safetensors"):
        rows.append({
            "id": stable_id(path),
            "abs_path": str(path),     # registry 가 제자리 파일을 가리켜
            "adapter": "local",
            # architecture 는 파일의 tensor 읽어서 채움 (다음 lesson)
        })
    return rows
# 복사 없음. rename 없음. symlink 없음. 옛 툴이 같은 파일 계속 읽어.

# 이주 (거부): 우리가 안 가는 실패 쉬운 경로.
# for path in models_root.rglob("*.safetensors"):
#     shutil.copy(path, OUR_DIR / our_name(path))   # GB 복제,
#                                                    # 반쯤 실패 가능,
#                                                    # 옛 툴 고아로 만듦

External links

Exercise

네(또는 네가 쓴 툴)가 데이터를 새 구조로 이주시킨 때를 떠올려. 뭐가 깨지고, 반쯤 완료되고, 복제됐어? 이제 '제자리 흡수' 로 재설계해: 원본 레이아웃 위의 reader 가 이주를 완전히 피할 수 있었을까? reader 가 이주가 폴더 구조에 encode 한 걸 알려면 뭘 알아야 했을까?
Hint
이주는 자주 새 폴더 구조에 의미를 encode 해 ('이제 모든 SDXL 모델이 이 폴더에 있어'). reader 는 그 같은 의미를 데이터 자체에서 도출해야 해 — 그게 정확히 다음 lesson 의 tensor 분류가 하는 거고.

Progress

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

댓글 0

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

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