C.W.K.
Stream
Lesson 05 of 05 · published

가중치는 소스가 아냐

~10 min · model-weights, cache, prewarm, packaging

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"git 히스토리 속 1기가바이트 모델 가중치는 딱 한 번 저지르는 실수야."

가중치는 git 밖에 살아

온디바이스 STT 모델은 수백 메가에서 기가바이트야. 소스가 아니라 데이터고, repo 에 살면 안 돼 — 한 번 커밋하면 모든 클론, 모든 백업, 모든 히스토리 순회가 그 무게를 영원히 끌어. Firekeeper 는 모델 가중치를 프로젝트 밖 캐시 디렉터리(~/cwk-models/whisper/ 트리 아래)에 두고, 첫 사용 때 다운로드하고, git 이 절대 추적 안 해. repo 는 모델을 관리하는 코드를 담고; 모델 자체는 런타임 에셋이야.

첫 실행 세금

Core ML Whisper 모델이 처음 도는 순간, 그 특정 기계에 맞춰 컴파일해 — 안 다루면 정확히 멈춤처럼 보이는 몇 초의 일회성 비용이야. 습관 둘이 이걸 고쳐. 첫째, 프리웜: 첫 단축키가 아니라 앱 실행 때 모델 로드/컴파일을 시작해, 유저가 실제 받아쓸 즈음엔 모델이 데워지게. 둘째, 진행 표시: 모델 다운로드와 첫 실행 컴파일 둘 다 보이고 솔직한 진행(정수-퍼센트 다운로드, '모델 준비 중' 상태)이 필요해, 앱이 멈춘 것처럼 절대 안 보이게.

실행          -> prewarm(): 백그라운드에서 모델 로드/컴파일 시작
첫 받아쓰기   -> 모델 이미 데워짐 -> 낮은 지연

모델 없음     -> 오버레이에 정수-퍼센트 진행으로 다운로드
첫 컴파일     -> '모델 준비 중...' 상태, 얼어붙은 UI 아님

나쁜 기본값 마이그레이션

진짜 디테일 하나 더: Firekeeper 는 한때 tiny 모델을 기본으로 했어, 빠르지만 약한. 기본이 large-v3-turbo 로 바뀌었을 때, 기존 유저는 옛 선택이 설정에 저장돼 있었어. 마이그레이션은 외과적이야: 옛 기본값을 한 번 올리되, 유저가 일부러 고른 모델은 유지. '낡은 기본값은 업그레이드, 명시적 선택은 존중' 이 규칙 — 싹쓸이 덮어쓰기는 파워 유저의 의도적 선택을 짓밟아.

코드는 배포하고, 가중치는 가져와. 소스는 git 에 속하고; 수백 메가짜리 모델 파일은 앱이 다운로드하고 관리하는 런타임 캐시에 속해. 섞으면 repo 를 영구히 부풀리고 버전 히스토리를 갈아끼울 수 있어야 할 아티팩트에 묶어. 첫 커밋부터 경계를 깨끗이 지켜 — 나중에 고치기 거의 불가능해.
UI 없는 첫 실행 컴파일은 크래시로 읽혀. Core ML 이 컴파일하는 몇 초의 침묵은 유저한테 멈춤과 구별 안 되고, 유저는 강제 종료할 거야. 실행 때 프리웜하고 솔직한 '준비 중' 상태를 보여줘; '느림' 과 '고장' 의 차이는 전적으로 무슨 일인지 유저한테 말했는지야.

Code

실행 때 프리웜; 낡은 기본값을 선택 안 짓밟고 마이그레이션·swift
// 1) 첫 단축키가 첫 컴파일이 안 되게 프리웜.
func applicationDidFinishLaunching() {
    Task { await stt.prewarm() }   // 백그라운드에서 로드 + 첫 실행 컴파일
}

// 2) 옛 'tiny' 기본값을 한 번 올리고, 의도적 선택은 유지.
func migrate(_ settings: inout Settings) {
    if settings.sttModel == .tinyLegacyDefault, !settings.userPickedModel {
        settings.sttModel = .largeV3Turbo   // 낡은 기본값 업그레이드
    }
    // 유저가 명시적으로 고른 모델은 절대 안 덮어써.
}

External links

Exercise

다운로드한 모델을 배포하는 아무 앱에 대해, 뭐가 repo 에 속하고 뭐가 런타임 캐시에 속하는지 나열해. 그다음 첫 실행 모델 컴파일을 (a) 진행 UI 없이 (b) 프리웜 + 진행 상태로 겪는 정확한 유저 경험을 묘사해. 어느 게 '앱 고장' 버그 신고를 낳아?
Hint
repo: 모델을 다운로드/캐시/프리웜/실행하는 코드. 캐시: 가중치 자체. 진행 UI 없으면, 몇 초 침묵 컴파일이 멈춤이나 크래시로 신고되고; 프리웜과 솔직한 '준비 중' 상태면, 같은 몇 초가 정상 시작으로 읽혀. 바이트는 동일 — 소통만 달라.

Progress

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

댓글 0

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

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