fast (Gemma 4 26B-A4B):
- Enable mmproj GPU loading (vision ~1s, 12x faster than CPU)
- KV f16 → q8_0 (save ~2.5 GB VRAM for mmproj)
- Tensor split 0.5,0.5 → 0.43,0.57 (13/17 layers)
- Remove --mlock/--poll/--prio/-t/-tb (no measurable impact)
- measured_tps 74.65 → 71.89 (trade 3.7% speed for vision)
balanced (Qwen 3.5 35B-A3B):
- Tensor split 0.5,0.5 → 0.48,0.52 (enables pipeline parallelism)
- Ubatch 128 → 256 (prefill +78%: 649 → 1,157 t/s)
- mmproj + --no-mmproj-offload (CPU vision, VRAM headroom)
- Remove useless flags same as fast
- measured_tps 61.62 → 64.16 (+4.1%)
Other:
- Document full retuning in docs/v3_{fast,balanced}_retuning_log.md
- Session report at .planning/reports/20260411-session-report.md
- Add bench utilities: bench_short/bench_long/test_ts_ratios
- Speculative decoding (E2B draft) experimented but rejected
(+14% gen vs -31% cold start + tokenizer mismatch + mmproj conflict)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
224 lines
6.7 KiB
Markdown
224 lines
6.7 KiB
Markdown
# v3 — Fast Role Retuning Log (Gemma 4 26B-A4B)
|
||
|
||
**Date:** 2026-04-11
|
||
**Target role:** `fast` (Gemma 4 26B-A4B Q4_K_M)
|
||
**Goal:** 레퍼런스 `measured_tps: 74.65` 재검증 및 vision 지원 추가
|
||
**Result:** Text 71.89 t/s + Vision GPU 인코딩 ~1초 + VRAM 여유 ~2 GB
|
||
**Status:** ✅ 확정
|
||
|
||
---
|
||
|
||
## 1. 재튜닝 동기
|
||
|
||
- 기존 `fast` 설정(f16 KV, `--prio/--mlock/--poll` 등)이 Phase 01 시점 단일 GPU 기준으로 튜닝됐음
|
||
- 듀얼 GPU 환경 + 비전 지원 추가 필요
|
||
- `balanced` 재튜닝과 동일한 기준으로 재검증
|
||
|
||
---
|
||
|
||
## 2. Gemma 4 26B-A4B 아키텍처 실측 데이터
|
||
|
||
```
|
||
architecture: gemma4
|
||
file size: 15.63 GiB (Q4_K_M, 5.32 BPW)
|
||
n_layer: 30
|
||
n_head_kv: [8,8,8,8,8,2, 8,8,8,8,8,2, 8,8,8,8,8,2, 8,8,8,8,8,2, 8,8,8,8,8,2]
|
||
n_expert: 128 (8 active)
|
||
n_ctx_train: 262144 (256K native)
|
||
```
|
||
|
||
**핵심 구조:** 매 6번째 레이어만 full attention (`n_head_kv=2`), 나머지 25개는 **SWA (Sliding Window Attention)**. KV 캐시는 **5 full attention 레이어만** 큰 공간 차지.
|
||
|
||
### KV 캐시 실측 비교
|
||
|
||
| 컨텍스트 | f16 | q8_0 | q4_0 |
|
||
|---------|-----|------|------|
|
||
| Full attention (5 layers) | 5,120 MiB | 2,720 MiB | ~1,360 MiB |
|
||
| SWA (25 layers, 1,536 cells) | 300 MiB | 159 MiB | ~80 MiB |
|
||
| 총계 | **5,420 MiB** | **2,879 MiB** | **~1,440 MiB** |
|
||
|
||
---
|
||
|
||
## 3. VRAM 배치 (`-ts 0.43,0.57`)
|
||
|
||
13/17 레이어 분할:
|
||
```
|
||
Model: CUDA0 7,146 / CUDA1 8,857 MiB
|
||
KV q8_0: CUDA0 1,088 / CUDA1 1,632 (FA) + CUDA0 ~70 / CUDA1 ~90 (SWA)
|
||
mmproj: 1,138 MiB (CUDA0, --mmproj-offload 기본)
|
||
Compute: CUDA0 ~820 / CUDA1 ~528 (PP fallback)
|
||
Overhead: ~300 MiB per GPU
|
||
|
||
합계: GPU0 10,924 MiB (여유 1,192) / GPU1 11,230 MiB (여유 881)
|
||
```
|
||
|
||
---
|
||
|
||
## 4. `-ts` 비율 스윕 결과
|
||
|
||
| `-ts` | 분할 | CUDA0 model | CUDA1 model | 결과 |
|
||
|-------|-----|-----------|-----------|-----|
|
||
| 0.5,0.5 | 15/15 | 8,177 | 7,826 | mmproj OOM |
|
||
| 0.47,0.53 | 14/16 | 7,708 | 8,295 | mmproj OOM |
|
||
| **0.43,0.57** | **13/17** | **7,146** | **8,857** | ✅ 최적 |
|
||
| 0.4,0.6 | 12/18 | 6,676 | 9,327 | vision decode crash (CUDA1 OOM) |
|
||
|
||
**0.43,0.57이 mmproj + 양쪽 GPU 여유의 스윗 스팟.**
|
||
|
||
---
|
||
|
||
## 5. `-ub` / `-b` 스윕 결과
|
||
|
||
짧은 프롬프트(170 tok) vs 긴 프롬프트(3,100 tok) 양쪽 측정:
|
||
|
||
| 설정 | Prompt 읽기 | Gen 쓰기 | VRAM 여유 (G0/G1) |
|
||
|------|-----------|---------|-----------------|
|
||
| ub 128 | — | 74.95 (`-ts 0.5`) | — |
|
||
| ub 256 | 1,429 | 67 | 411/539 |
|
||
| **ub 512** (확정) | **1,672** | **66.67** | **1,192/881** |
|
||
| ub 768 | 1,695 | 65.94 | 761/603 |
|
||
| ub 1024 | — | — | init OOM |
|
||
| ub 2048 | — | — | init OOM |
|
||
|
||
**`-ub 512`가 스윗 스팟.** 더 크게 해도 이득 마진 작음 (1.3%) + VRAM 위험 증가.
|
||
|
||
---
|
||
|
||
## 6. KV 캐시 양자화 비교
|
||
|
||
| KV | Text (short) | Text (long gen) | VRAM 여유 |
|
||
|----|-------------|----------------|---------|
|
||
| f16 (초기) | 73.43 t/s | — | 298/427 |
|
||
| f16 + mmproj CPU | 73.67 | — | 266/427 |
|
||
| q8_0 | 73.20 | — | 1,321/1,925 |
|
||
| **q8_0 + mmproj GPU** | **71.89** | **66.67** | **1,192/881** |
|
||
|
||
**q8_0 전환으로 VRAM 2.5 GB 추가 확보 → mmproj GPU 장착 가능.** 품질 손실 미미.
|
||
|
||
---
|
||
|
||
## 7. Vision 인코딩 (mmproj GPU)
|
||
|
||
640×640 JPEG 고양이 이미지, 3회 반복:
|
||
|
||
| 단계 | 시간 | 비고 |
|
||
|------|-----|-----|
|
||
| 이미지 인코딩 (GPU) | ~1,000 ms | 283 토큰, 280 t/s |
|
||
| 생성 후속 | 72 t/s | Text와 동일 |
|
||
| **per-image 총 시간** | **~2.4초** | 1s encode + 1.4s gen |
|
||
|
||
**CPU 오프로드 대비 ~12배 빠름** (Config 2 mmproj CPU: 12.4초). GPU 장착 가치 있음.
|
||
|
||
---
|
||
|
||
## 8. Speculative Decoding 실험 (채택 안 함)
|
||
|
||
Draft 모델 `gemma-4-E2B-it-Q4_K_M.gguf` 사용한 추측 디코딩 실험:
|
||
|
||
| 항목 | 결과 |
|
||
|------|-----|
|
||
| Gen 평균 (5회) | 75.68 t/s (Run 1 49.68 포함) |
|
||
| Gen BEST | 86.18 t/s (+18%) |
|
||
| Gen Run 2-5 평균 | 82.18 (+14%) |
|
||
| Cold start (Run 1) | **49.68 t/s (-31% vs baseline)** |
|
||
| Acceptance rate | 82% (일반 텍스트) |
|
||
| Tokenizer | 불일치 경고 |
|
||
| mmproj 호환 | ❌ 추가 튜닝 필요 |
|
||
|
||
**결론: 채택 안 함.** 이유:
|
||
1. +14% 이득 vs 복잡성 폭증 (flag +5개, draft 모델 관리)
|
||
2. **Cold start -31% 페널티** — idle 후 첫 응답 느림 (Hermes Agent 사용 패턴 상극)
|
||
3. mmproj 추가하려면 draft 제거해야 함
|
||
4. tokenizer 불일치 오버헤드 상시 발생
|
||
5. acceptance rate 워크로드 의존 (한국어/코드는 더 낮을 것)
|
||
|
||
---
|
||
|
||
## 9. 제거된 옵션
|
||
|
||
| 옵션 | 제거 이유 |
|
||
|------|---------|
|
||
| ~~`--prio 3`~~ | 전용기, 경쟁 없음 |
|
||
| ~~`--mlock`~~ | mmap 페이지 잠금 불필요 |
|
||
| ~~`--poll 50`~~ | `-np 1` 단일 요청 환경 |
|
||
| ~~`-t 6 / -tb 6`~~ | `-ngl 999` 풀 GPU 오프로드라 무의미 |
|
||
|
||
balanced 재튜닝과 동일한 검증 거침. Text 속도 영향 오차 범위.
|
||
|
||
---
|
||
|
||
## 10. 최종 확정 옵션
|
||
|
||
```json
|
||
{
|
||
"fast": {
|
||
"display_name": "Gemma 4 26B (Fast)",
|
||
"model_path": "models/gemma-4-26B-A4B-it-Q4_K_M.gguf",
|
||
"measured_tps": 72.04,
|
||
"args": [
|
||
"--mmproj", "models/gemma-4-26B-mmproj-F16.gguf",
|
||
"-ngl", "999",
|
||
"-c", "262144",
|
||
"-np", "1",
|
||
"-fa", "on",
|
||
"--cache-type-k", "q8_0",
|
||
"--cache-type-v", "q8_0",
|
||
"-ub", "512",
|
||
"-b", "2048",
|
||
"-ts", "0.43,0.57"
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 11. 최종 실측 성능
|
||
|
||
### Text 추론
|
||
|
||
| 시나리오 | Prompt t/s | Gen t/s |
|
||
|---------|-----------|---------|
|
||
| 짧은 프롬프트 (170 tok, 5회) | — | **71.89** (BEST 72.91) |
|
||
| 긴 프롬프트 (3,100 tok, 3회) | **1,672** | **66.67** |
|
||
|
||
### Vision 추론 (GPU mmproj)
|
||
|
||
| 단계 | 시간/속도 |
|
||
|------|---------|
|
||
| 이미지 인코딩 (640×640) | ~1,000 ms |
|
||
| 이미지 토큰 수 | 283 |
|
||
| 생성 속도 | 72 t/s |
|
||
|
||
### VRAM 최종
|
||
|
||
```
|
||
GPU 0 10,924 MiB (여유 1,192 MiB) Gen3 x4
|
||
GPU 1 11,230 MiB (여유 881 MiB) Gen4 x16
|
||
```
|
||
|
||
---
|
||
|
||
## 12. Phase 01 대비
|
||
|
||
| 항목 | Phase 01 | v3 재튜닝 |
|
||
|------|---------|----------|
|
||
| 측정치 | 74.65 t/s | 71.89 t/s |
|
||
| 차이 | — | **-2.76 (-3.7%)** |
|
||
| GPU 구성 | 단일 | 듀얼 (비대칭 PCIe) |
|
||
| mmproj | 없음 | **GPU 지원** |
|
||
| KV | f16 | q8_0 |
|
||
| VRAM 여유 | — | 2,073 MiB |
|
||
|
||
**약 3.7% 속도 손실 대신 Vision 기능 확보**. 비대칭 PCIe (GPU0 x4) 구조에서 듀얼 GPU로 돌리는 비용. 단일 GPU로 돌아가려면 `--cpu-moe` + `-ngl` 조정 필요하지만 현재 검증 안 됨.
|
||
|
||
---
|
||
|
||
## 13. Speculative Decoding 관련 정리
|
||
|
||
E2B 드래프트 모델(`gemma-4-E2B-it-Q4_K_M.gguf`, 2.9 GB) 및 mmproj(`gemma-4-E2B-mmproj-F16.gguf`, 940 MB) 파일은 **최종 채택 안 됨**. 세션 중 실험 후 삭제 권장 (총 3.8 GB 디스크 회수).
|
||
|
||
---
|
||
|
||
**Document sealed: 2026-04-11**
|