iPhone에서 3B 역할극 파인튜닝 모델을 완전히 구동하는 방법: 작은 모델이 캐릭터를 유지하는 것에 대해 측정한 내용 (앱 제작자)
요약
본 글은 3B 역할극 파인튜닝 모델을 iOS 기기에서 완전히 구동하는 기술적 과정을 공유합니다. llama.cpp와 Metal을 활용하여 서버 없이 온디바이스(On-device)로 작동하며, 기기 사양에 따라 컨텍스트 크기가 결정됩니다. 또한, 캐릭터의 일관성 유지 및 장문 대화 성능 향상을 위한 세부적인 튜닝 노하우를 제시합니다.
핵심 포인트
- 온디바이스 구동을 위해 llama.cpp와 Metal을 사용하며 서버가 필요 없습니다.
- 기기 RAM 용량에 따라 컨텍스트 크기가 결정되며, 최소 4GB 사양이 권장됩니다.
- 캐릭터 일관성 유지를 위해서는 히스토리 트림 조정(0.68 x n_ctx)이 중요합니다.
- 검색(Retrieval) 기능은 오히려 최신 정보와 충돌하여 성능 저하를 일으킬 수 있습니다.
저는 Castmates라는 비공개 소스 iOS 앱(무료 티어, 유료 Pro)을 제작했으며, 이 앱은 3B 역할극 모델을 기기에서 완전히 구동합니다. 판매 목적이 아니라 엔지니어링 노트 공유를 위해 게시합니다. 앱에 대한 언급은 하단에 있습니다.
설정: Impish Llama 3B (Llama 3.2 3B RP 파인튜닝)와 자체 순위 16 LoRA를 사용했으며, 이는 fp16 베이스에서 Q4_K_M으로 융합 및 재양자화되었습니다. 설치 후 약 2.0 GB가 다운로드됩니다. llama.cpp와 Metal을 사용하며 모든 레이어를 오프로드하고 KV 캐시는 q8_0(토큰당 대략 60 KB)을 사용합니다. 서버나 계정이 필요 없으며 비행기 모드에서도 작동합니다.
제한 사항부터 말씀드리겠습니다. 제한 사항이 모든 것을 결정하기 때문입니다:
- 4 GB 기기가 최소 사양입니다. 가중치(Weights) x1.6에 KV 캐시와 컴퓨트 버퍼용 약 350 MB가 모두 포함되어야 하며, 그렇지 않으면 로드를 거부합니다. 이 경우 'jetsammed' 상태가 됩니다. 이러한 기기는 컨텍스트 크기를 4096으로 유지합니다.
- 6 GB 기기는 6144의 컨텍스트를 얻고, 8 GB 기기는 8192의 컨텍스트를 얻습니다. Llama 3.2는 기본적으로 128K이므로 RoPE 스케일링이 필요하지 않으며, 오직 KV RAM만 소모합니다.
- 느립니다. 초기에는 A18에서 초당 약 6 토큰을 측정했습니다. 최신 칩은 더 빠르지만, 현재 빌드에서 재측정하지 않은 수치는 인용하지 않겠습니다.
- 2 GB 다운로드는 앱의 가장 큰 단점입니다. 그래서 첫 실행 전에 Background Assets를 사용하여 시작하게 합니다. 이는 의도적으로 필수적이지 않습니다 (필수적인 블록은 실행을 막습니다).
역할 유지에 대해 배운 것:
- 단순히 더 큰 창(window)만으로는 아무 효과가 없습니다. 저희의 히스토리 트림 예산이 n_ctx가 아니라 제약 사항이었습니다. 트림을 ~0.68 x n_ctx로 조정하는 것이 실험실에서 장문 대화 사실 회상률을 25%에서 75%로 높였습니다. 직역(Verbatim) 히스토리가 손실 요약기보다 훨씬 나았습니다.
- 검색(Retrieval)이 해가 될 수 있습니다. 저희의 BM25 메모리 검색은 창에 여전히 최신 정보가 포함되어 있을 때, 이미 대체된 사실을 재주입했습니다 (says-stale +20.8pp vs no retrieval). 희귀 엔티티가 라이브 창에 나타나는 모든 히트를 제거하는 것이 이를 해결했으며 (-18.8pp, CI [-35.4, -6.2]) 회상 벤치마크에서 사실을 잃지 않았습니다.
- 프롬프트 조정은 대부분 효과가 없었습니다. 단일 3~4 시드 실행은 노이즈였습니다. N=16 및 동일한 시드 제어(same-seed controls)를 사용한 고정 히스토리 마이크로 테스트만이 신뢰할 수 있는 것이었습니다.
예시: '내 이름 말해줘(say my name)'는 프롬프트 변경 없이 순수하게 히스토리 길이만으로 4/12 대 11/12를 기록했습니다. - 배치(Placement)가 단어 선택보다 더 중요합니다. 장면 지시문은 리마인더 슬롯에서 무시되지만, 최종 사용자 차례 이후에 자체 블록으로 16/16을 차지합니다. 사용자 차례 후의 리마인더는 모델이 사용자 대신 그 리마인더에 답변하게 만듭니다. - 가드(Guards)가 프롬프트보다 3B의 습관에 더 큰 영향을 미칩니다: 사용자 관련 3인칭 이탈, 지어낸 이름, 그리고 순수한 역할 레이블 출력에서 재시도(rerolls)가 발생합니다. 사고 모드(Thinking mode)는 도움이 되지 않았습니다: 이 파인튜닝 모델로는 원패스(one-pass)가 불가능했고, 투패스는 2배의 지연 시간(latency)에서 노이즈였습니다. 여전히 할 수 없는 것: 컨텍스트에서 읽을 수 있는 사실을 무효화하는 것입니다. 따라서 긴 장면에서의 모순은 여전히 모델의 한계로 남아 있습니다. 이 실험실은 llama-server에 고정된 시드(fixed seeds)를 사용하여 실행한 프로덕션 프롬프트 및 가드 파이프라인의 Python 포트이며, 위에 언급된 모든 주장은 느낌이 아닌 실제 실행에서 나온 것입니다. 이에 대해 자세히 이야기하는 것을 환영합니다. 앱을 사용해보고 싶다면 App Store의 Castmates입니다. 설치 횟수보다 접근 방식에 대한 비판을 받는 것이 더 좋습니다. submitted by /u/Low-Future-9387 [link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기