메모리 예산¶
Bit-Axon은 MacBook Air M4(16 GB 통합 메모리)를 대상으로 하며, 이 중 약 8 GB가 모델에 사용 가능합니다. 이 페이지는 모든 바이트를 분석합니다.
사용 가능한 메모리¶
| 항목 | 크기 | 비고 |
|---|---|---|
| 물리적 RAM | 16,384 MB | MacBook Air M4 16 GB |
| macOS 시스템 사용량 | 약 ~2,500 MB | macOS 15 + 서비스 |
| 기타 앱 | 약 ~2,000 MB | 브라우저, IDE 등 |
| MLX 오버헤드 | 약 ~500 MB | 프레임워크 런타임 |
| Metal GPU 안전 마진 | 약 ~1,500 MB | 스왑 방지 버퍼 |
| 모델에 사용 가능 | 약 ~8,000 MB | 이것이 제약 조건 |
사용 가능한 메모리 극대화
다른 모든 앱을 종료하면 약 ~10 GB를 확보할 수 있지만, 안정적인 작동을 위해 약 ~8 GB가 기준선입니다. 모든 설계 결정은 이 예산을 기준으로 합니다.
정밀도별 가중치 메모리¶
| 정밀도 | 가중치 크기 | 적합 여부 |
|---|---|---|
| FP16 | 약 ~6,400 MB | ❌ 불가 |
| Q8 (affine) | 약 ~3,200 MB | ⚠️ 한계 |
| Q4 (affine, group=64) | 약 ~1,760 MB | ✅ 기본값 |
| 1.58-bit (Ternary) | 약 ~640 MB | 🔬 실험적 |
FP16 가중치만으로 6.4 GB를 소모합니다 — 활성화나 KV cache를 고려하기도 전에 거의 전체 예산을 초과합니다. Q4 quantization이 기본 전략입니다. MLX의 nn.QuantizedLinear은 4-bit matmul을 단일 퓨즈된 Metal 커널로 실행하여 FP16 대비 2–3배 속도 향상과 3.6배 적은 메모리를 제공합니다.
Parameter 수 분석¶
| 구성 요소 | 수 | FP16 크기 | Q4 크기 |
|---|---|---|---|
embed_tokens | 65.5M | 131 MB | 36 MB |
input_proj | 5.2M | 10.5 MB | 2.9 MB |
| 층 1–8: AxonSSMBlock (×8) | 약 ~482M | 964 MB | 265 MB |
| 층 9–16: AxonSWAMoEBlock (×8) | 약 ~1,120M | 2,240 MB | 616 MB |
| 층 17–24: AxonSSMMoEBlock (×8) | 약 ~1,200M | 2,400 MB | 660 MB |
output_proj | 5.2M | 10.5 MB | 2.9 MB |
lm_head (embed와 공유) | 0 | 0 MB | 0 MB |
| 합계 | 약 ~3.2B | 약 ~6,400 MB | 약 ~1,760 MB |
가중치 공유 절약
embed_tokens.weight와 lm_head.weight가 동일한 텐서를 공유하여 FP16에서 약 ~64 MB(Q4에서 약 ~18 MB)를 절약합니다.
SSM 상태 메모리 (고정, 층 1–8 및 17–24)¶
16개 SSM 층은 컨텍스트 길이와 무관하게 고정 크기 은닉 상태를 유지합니다:
- SSM 상태: 층당 \((1, 7680, 16)\) × 16층 = 약 ~3.7 MB
- Conv cache: 층당 \((1, 3, 7680)\) × 16층 = 약 ~0.7 MB
- SSM 상태 합계: 약 ~4.4 MB — 무시할 수 있는 수준
SWA KV cache (층 9–16, 32 헤드, head_dim=80)¶
8개 SWA 층만 KV cache를 생성합니다. 공식:
| 컨텍스트 | KV cache (FP16) | KV cache (TurboQuant 3-bit) |
|---|---|---|
| 1,024 | 80 MB | 약 ~14 MB |
| 4,096 | 320 MB | 약 ~53 MB |
| 16,384 | 1,280 MB | 약 ~213 MB |
| 32,768 | 2,560 MB | 약 ~427 MB |
| 65,536 | 5,120 MB | 약 ~853 MB |
TurboQuant 없이 64K 컨텍스트 사용
65,536 토큰에서 FP16 KV cache만으로 약 ~5.1 GB — 사용 가능한 전체 예산을 초과합니다. 64K 컨텍스트에는 TurboQuant가 필수입니다.
총 추론 메모리¶
| 정밀도 | 4K 컨텍스트 | 16K 컨텍스트 | 32K 컨텍스트 | 64K 컨텍스트 |
|---|---|---|---|---|
| FP16 (TQ 없음) | 약 ~7,233 MB | 약 ~8,393 MB | 약 ~9,673 MB | 약 ~12,233 MB |
| Q4 (TQ 없음) | 약 ~2,593 MB | 약 ~3,353 MB | 약 ~4,633 MB | 약 ~7,193 MB |
| Q4 + TurboQuant 3-bit | 약 ~2,326 MB | 약 ~2,486 MB | 약 ~2,700 MB | 약 ~3,126 MB |
핵심 결론:
- ✅ Q4만으로 약 16K 컨텍스트까지 8 GB 이내 적합
- ✅ Q4 + TurboQuant는 전체 64K 컨텍스트에서 8 GB 이내 적합, 약 ~5 GB 여유
- ❌ FP16 추론은 4K 이상의 모든 컨텍스트 길이에서 8 GB 초과
QLoRA 학습 메모리¶
전체 파인튜닝(FP16 가중치 + 기울기 + Adam 옵티마이저)은 약 ~38.4 GB가 필요 — 16 GB에서는 물리적으로 불가능합니다. QLoRA(Q4 동결 기반 + LoRA 어댑터)는 학습을 다음과 같이 압축합니다:
| 구성 요소 | 크기 | 비고 |
|---|---|---|
| 기본 가중치 Q4 (동결) | 약 ~1,760 MB | 기울기 불필요 |
| LoRA parameters (rank=16, 약 ~0.5%) | 약 ~32 MB | 학습 가능 |
| LoRA 기울기 (FP16) | 약 ~32 MB | |
| LoRA Adam 옵티마이저 (\(m\), \(v\), FP32) | 약 ~256 MB | |
| 활성화 (체크포인트, \(B=1\), \(T=2048\)) | 약 ~500–1,000 MB | 기울기 체크포인팅 활성화 |
| SWA KV cache (\(T=2048\)) | 약 ~160 MB | |
| MLX 오버헤드 | 약 ~500 MB | |
| 합계 | 약 ~3,240–3,740 MB | 8 GB 이내 적합 ✅ |
열 관리¶
팬 없는 MacBook Air M4는 모든 열을 수동으로 방출합니다. Bit-Axon은 macOS powermetrics를 통해 SoC 온도를 모니터링하는 열 인식 학습 스케줄러를 사용합니다:
CoolingScheduler¶
| 온도 | 동작 | 근거 |
|---|---|---|
| < 75°C | 정상 속도 | 스로틀링 불필요 |
| 75–85°C | LoRA rank 반감 | 동일 메모리 사용량, 연산 감소 |
| 85–95°C | 스텝당 0.5초 일시정지 | 강제 냉각 기간 |
| > 95°C | 학습 일시정지 | 냉각 후 체크포인트에서 재개 |
ThermalPolicy¶
class ThermalPolicy:
PAUSE_TEMP = 85 # °C — 마이크로 일시정지 삽입
STOP_TEMP = 95 # °C — 학습 완전 중단
RESUME_TEMP = 75 # °C — 정상 작업 재개
CHECK_INTERVAL = 1 # 온도 확인 간격 (초)
MoE 열 이점¶
MoE 희소성은 열 부하를 직접적으로 감소시킵니다:
- 3.2B parameters 중 토큰당 약 ~1.4B만 활성화 (약 ~44%)
- 칩의 연산 장치 중 56%가 각 순전파에서 유휴 상태로 유지
- 열 발생 측면에서 약 1.4B 밀집 모델을 실행하는 것과 거의 동일
- 팬 없는 MacBook Air에서 지속적인 학습이 가능할 가능성이 높음
컨텍스트 길이 전략¶
| 시나리오 | 컨텍스트 | 권장 구성 | 총 메모리 |
|---|---|---|---|
| 챗봇 | 4K | Q4 | 약 ~2.5 GB |
| 코드 생성 | 8K | Q4 | 약 ~2.8 GB |
| 문서 요약 | 16K | Q4 | 약 ~3.3 GB |
| PDF 분석 | 32K | Q4 + TurboQuant 권장 | 약 ~2.7 GB |
| 전체 64K | 64K | Q4 + TurboQuant 필수 | 약 ~3.1 GB |
가중치 공유 절약¶
embed_tokens: (32000, 2048) = 65.5M params
lm_head: (32000, 2048) = 65.5M params ← 동일 텐서
─────────────
절약: 65.5M params = 약 ~131 MB (FP16) / 약 ~36 MB (Q4)
embed_tokens.weight = lm_head.weight로 공유함으로써, 모델은 임베딩 행렬의 중복 복사본 저장을 피합니다. 이는 Q4에서 약 ~36 MB가 8 GB 한계를 향해 중요한 역할을 하는 경우에 특히 가치가 있습니다.