Files
variet_llm/docs/v3_fast_retuning_log.md
Variet-Worker 0dee779a73 refactor(phase-01): v3 retune fast & balanced roles
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>
2026-04-11 14:55:27 +09:00

224 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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**