"git 히스토리 속 1기가바이트 모델 가중치는 딱 한 번 저지르는 실수야."
가중치는 git 밖에 살아
온디바이스 STT 모델은 수백 메가에서 기가바이트까지 가. 소스가 아니라 데이터고, repo 안에 있으면 안 돼. 한 번 커밋하면 모든 클론, 모든 백업, 히스토리를 훑는 모든 작업이 그 무게를 영원히 끌고 다니거든. Firekeeper 는 모델 가중치를 프로젝트 밖 캐시 디렉터리(~/cwk-models/whisper/ 아래)에 두고, 처음 쓸 때 받아 오고, git 은 아예 추적을 안 해. repo 에는 모델을 관리하는 코드가 들어가. 모델 자체는 런타임 에셋이고.
첫 실행 세금
Core ML Whisper 모델은 처음 돌 때 그 기계에 맞춰 컴파일을 해. 손 안 쓰면 딱 멈춘 것처럼 보이는, 한 번뿐인 몇 초짜리 비용이야. 습관 두 개면 해결돼. 첫째, 프리웜. 첫 단축키를 누를 때가 아니라 앱을 켤 때 모델 로드랑 컴파일을 시작해서, 유저가 실제로 받아쓸 즈음엔 모델이 데워져 있게 하는 거야. 둘째, 진행 표시. 모델 다운로드도 첫 실행 컴파일도 눈에 보이고 솔직한 진행 표시가 필요해. 몇 퍼센트 받았는지, '모델 준비 중' 인지. 앱이 멈춘 것처럼 보이는 일이 없게.
실행 -> prewarm(): 백그라운드에서 모델 로드/컴파일 시작
첫 받아쓰기 -> 모델 이미 데워짐 -> 낮은 지연
모델 없음 -> 오버레이에 퍼센트 진행률로 다운로드
첫 컴파일 -> '모델 준비 중...' 상태, 얼어붙은 UI 아님
나쁜 기본값 마이그레이션
진짜 있었던 디테일 하나 더. Firekeeper 는 한때 tiny 모델을 기본으로 썼어. 빠른 대신 약한 모델이지. 기본이 large-v3-turbo 로 바뀌었을 때, 기존 유저 설정에는 예전 선택이 그대로 저장돼 있었어. 마이그레이션은 외과 수술처럼 해야 해. 낡은 기본값만 한 번 올리고, 유저가 일부러 고른 모델은 그대로 두는 거야. 규칙은 '낡은 기본값은 올리고, 명시적 선택은 존중한다'. 싹 다 덮어쓰면 파워 유저가 일부러 내린 선택을 짓밟게 돼.