feat: Variet Engine v1.0 + 5-model tuning complete

Phase 01 (LLM Tuning):
- Gemma4 26B: 74.65 t/s (fast)
- Qwen 35B: 61.62 t/s (balanced)
- Gemma4 31B: 16.0 t/s (deep-coder)
- Qwen 27B: 16.7 t/s (deep-logic)
- Qwen 122B: 8.95 t/s (ultra, GPU 1 only)

Phase 02 (API Engine):
- FastAPI reverse proxy on port 8000
- /engine/switch hot-swap with 503 protection
- config/engine_models.json as single source of truth
- Replaced 4 individual .bat files with unified engine

File cleanup:
- scripts/ 85 files -> 9 + _archive/
- Root .bat files -> _archive/
This commit is contained in:
Variet-Worker
2026-04-07 18:08:58 +09:00
parent 7c7a899fd5
commit c111b3a9b0
414 changed files with 3402 additions and 68598 deletions

View File

@@ -0,0 +1,62 @@
# Phase 02: API Engine — PLAN
## 목표
Machine A의 추론 서버를 단일 포트(8000)로 통합하는 FastAPI 기반 리버스 프록시 + 핫스왑 엔진을 구축한다.
## 아키텍처
```
Machine B (VS Code / Discord)
│ OpenAI-compatible API
│ (always port 8000)
Variet Engine (FastAPI, Port 8000)
├── /v1/* → llama-server 투명 중계
├── /engine/status → 현재 모델/상태 조회
├── /engine/models → 사용 가능 모델 목록
├── /engine/switch → 모델 핫스왑 요청
└── /engine/health → 헬스체크
│ localhost only
llama-server (Port 8080, 외부 노출 X)
```
## 완료 태스크
### Task 1: 설정 파일 (`config/engine_models.json`) ✅
- 5개 모델의 CLI 인수를 정확한 배열 형태로 저장
- Single Source of Truth: Python/TypeScript/Bash 어디서든 파싱 가능
- llama-server의 대시 규칙(-ngl vs --prio)을 직접 명시하여 추측 로직 제거
### Task 2: 엔진 코어 (`engine/variet_engine.py`) ✅
- FastAPI + lifespan 이벤트 (deprecated on_event 사용 안 함)
- subprocess.Popen으로 llama-server 생명주기 관리
- httpx 스트리밍 프록시 (SSE 포함)
- 교체 중 503 + Retry-After 응답으로 클라이언트 보호
- 프로세스 사망 감지, 포트 해제 대기, 에러 핸들링
### Task 3: 런처 (`start_variet_engine.bat`) ✅
- 원클릭 엔진 시작 스크립트
- 기존 4개 개별 .bat 파일 → `_archive/`로 이동
### Task 4: 파일 정리 ✅
- `scripts/` 85개 파일 → 9개 + `_archive/` 정리
- 루트 deprecated .bat 4개 → `_archive/`
## 기술적 결정사항
| 결정 | 이유 |
|------|------|
| args를 dict → list로 변경 | llama-server의 축약 플래그(-ngl)와 정식 플래그(--prio) 규칙이 불규칙하여 코드 추측이 실패 |
| 내부 포트 8080 | 외부(8000)와 분리하여 보안 강화 |
| BackgroundTasks로 핫스왑 | switch API가 즉시 응답 → 백그라운드에서 교체 진행 |
| 스트리밍 프록시 | SSE 스트리밍 응답을 chunk 단위로 전달하여 지연 최소화 |
## 산출물
- `engine/variet_engine.py` — FastAPI 프록시 + 프로세스 관리자 (398줄)
- `engine/__init__.py` — 패키지 초기화
- `config/engine_models.json` — 5개 모델 설정
- `start_variet_engine.bat` — 원클릭 런처
- `scripts/test_hotswap.py` — 핫스왑 검증 스크립트

View File

@@ -0,0 +1,58 @@
# Phase 02: API Engine — Verification Report
## 테스트 결과 (2026-04-07)
### Test 1: 부팅 및 /engine/status ✅
```json
{
"state": "ready",
"role": "fast",
"display_name": "Gemma 4 26B (Fast)",
"measured_tps": 74.65,
"context_size": "262144",
"uptime_seconds": 40.5
}
```
- 기본 모델(fast) 자동 로드: 14.5초
### Test 2: /engine/models ✅
- 5개 Role 전부 조회 가능
- 각 모델의 display_name, measured_tps, context_size 표시
### Test 3: /v1/chat/completions 프록시 ✅
- llama-server(:8080)로 투명 중계 정상
- 스트리밍 응답 포함
### Test 4: 핫스왑 fast → balanced ✅
```json
{
"status": "switching",
"from_role": "fast",
"to_role": "balanced",
"to_model": "Qwen 3.5 35B (Balanced)",
"eta_seconds": 30
}
```
- 교체 소요: 20초
- 교체 후 Qwen 35B 정상 응답 확인
### Test 5: 교체 중 503 보호 ✅
- Status: **503 Service Unavailable**
- Retry-After: **30**
- 클라이언트가 재시도 가능한 에러 구조
### Test 6: 교체 후 새 모델 작동 ✅
- Current model: Qwen 3.5 35B (Balanced)
- Speed: 19.7 t/s (첫 요청, 워밍업 미완료)
## UAT 기준 달성 여부
- [x] 단일 포트(8000)에서 모든 API 제공 → ✅
- [x] /v1/* 요청이 llama-server로 투명 중계 → ✅
- [x] 핫스왑 API로 모델 교체 가능 → ✅
- [x] 교체 중 503 + Retry-After 반환 → ✅
- [x] 5개 모델 설정 JSON 관리 → ✅
- [x] 원클릭 부팅 .bat → ✅
## Phase Status: ✅ COMPLETE
완료 일시: 2026-04-07