# 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**