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>
6.7 KiB
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 호환 | ❌ 추가 튜닝 필요 |
결론: 채택 안 함. 이유:
- +14% 이득 vs 복잡성 폭증 (flag +5개, draft 모델 관리)
- Cold start -31% 페널티 — idle 후 첫 응답 느림 (Hermes Agent 사용 패턴 상극)
- mmproj 추가하려면 draft 제거해야 함
- tokenizer 불일치 오버헤드 상시 발생
- acceptance rate 워크로드 의존 (한국어/코드는 더 낮을 것)
9. 제거된 옵션
| 옵션 | 제거 이유 |
|---|---|
--prio 3 |
전용기, 경쟁 없음 |
--mlock |
mmap 페이지 잠금 불필요 |
--poll 50 |
-np 1 단일 요청 환경 |
-t 6 / -tb 6 |
-ngl 999 풀 GPU 오프로드라 무의미 |
balanced 재튜닝과 동일한 검증 거침. Text 속도 영향 오차 범위.
10. 최종 확정 옵션
{
"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