chore: update docs/HANDOFF-LOCAL-LLM-GITEA-MCP.md via opax-mcp
Some checks are pending
Check Python Version Consistency / Check Python Version (push) Waiting to run

This commit is contained in:
chris 2026-07-21 20:43:04 +00:00
parent e354051034
commit 64333bf620

View File

@ -7,7 +7,7 @@ Denne handoffen er det eneste autoritative arbeidsdokumentet for sporet "lokal L
--- ---
## FREMDRIFT OPPDATERT 2026-07-21 22:30 CEST ## FREMDRIFT OPPDATERT 2026-07-21 22:41 CEST
### ✅ FASE 0 Lås situasjonen — FERDIG ### ✅ FASE 0 Lås situasjonen — FERDIG
- Handoff opprettet som eget dokument - Handoff opprettet som eget dokument
@ -24,66 +24,39 @@ Denne handoffen er det eneste autoritative arbeidsdokumentet for sporet "lokal L
### ✅ FASE 2 MCP peker korrekt til lokal modellsti — FERDIG ### ✅ FASE 2 MCP peker korrekt til lokal modellsti — FERDIG
- `OLLAMA_BASE_URL` peker til Gitea-CPU-VM Ollama - `OLLAMA_BASE_URL` peker til Gitea-CPU-VM Ollama
- `OSVAUCO_AGENT_URL` fikset til kanonisk URL (commit a171a58) - `OSVAUCO_AGENT_URL` fikset til kanonisk URL (commit a171a58)
- Rotårsak: Cloud Run krever regional URL som audience for identity tokens
- Feil: `zjbqp3prqq-uc.a.run.app` → Riktig: `osvauco-agent-357036551735.us-central1.run.app`
- 5 filer oppdatert av Gemini-agent, build SUCCESS 55182237 (21. juli 18:38)
- opax-mcp revisjon: opax-mcp-00122-m4n - opax-mcp revisjon: opax-mcp-00122-m4n
### ✅ FASE 3 Gitea read-only grønn — FERDIG ### ✅ FASE 3 Gitea read-only grønn — FERDIG
- Rotårsak: `GITEA_URL` var ikke satt i opax-mcp Cloud Run service - Alle 4 read-only tools GRØNNE
- Gitea kjører på: `http://34.67.252.59:3000` (Gitea-CPU-VM)
- Fix: `gcloud run services update opax-mcp --update-env-vars GITEA_URL=http://34.67.252.59:3000`
- opax-mcp revisjon etter fix: opax-mcp-00123-g7d
- Alle 4 read-only tools GRØNNE:
- ✅ `list_commits`
- ✅ `get_file`
- ✅ `get_file_content`
- ✅ `list_repo_files`
- `get_connector_status`: `gitea_status: online` - `get_connector_status`: `gitea_status: online`
### ✅ FASE 4 Hel kjede samtidig grønn — FERDIG 2026-07-21 20:57 CEST ### ✅ FASE 4 Hel kjede samtidig grønn — FERDIG 2026-07-21 20:57 CEST
Full smoke test kjørt og alle tools grønne samtidig: - Full smoke test: alle 8 tools grønne samtidig
| Tool | Status | Resultat |
|---|---|---|
| `get_connector_status` | ✅ | live, gitea online, 37 tools |
| `get_health` | ✅ | OK |
| `get_build_status` | ✅ | Siste build SUCCESS 55182237 |
| `describe_service` | ✅ | osvauco-agent-00695-8lk Ready |
| `list_workspace_users` | ✅ | 3 brukere returnert |
| `list_emma_models` | ✅ | gemma3:4b, qwen2.5:3b |
| `list_commits` | ✅ | Siste commits returnert |
| `list_repo_files` | ✅ | Rotmappe listert |
Ingen regresjon på tidligere grønne tools. Hele kjeden er verifisert i samme runde.
### ✅ FASE 5 Frys blueprint på dev-snap — FERDIG ### ✅ FASE 5 Frys blueprint på dev-snap — FERDIG
- Blueprint dokumentert i `docs/BLUEPRINT-DEV-SNAP.md` - Blueprint dokumentert i `docs/BLUEPRINT-DEV-SNAP.md`
- Full env-var, modell- og serviceoversikt frosset
- Avklart at nåværende `OLLAMA_BASE_URL` og `GITEA_URL` i praksis har pekt mot dev-snap i aktiv verifikasjonsperiode
- Gitea-CPU-VM står fast som permanent målmaskin
### ⏳ FASE 6 CPU-optimalisering før permanent migrering — PÅGÅR ### ⏳ FASE 6 CPU-optimalisering før permanent migrering — PÅGÅR
Formål: Verifisere at Emma-arkitekturen fungerer akseptabelt på Gitea-CPU-VM før permanent cutover fra dev-snap.
Bekreftede regler (oppdatert etter testing): Bekreftede regler (låst etter testing):
- `OLLAMA_KEEP_ALIVE=-1` er obligatorisk baseline ✅ BEVIST - `OLLAMA_KEEP_ALIVE=-1` ✅ BEVIST og satt på systemd-nivå
- `OLLAMA_MAX_LOADED_MODELS=2` er valgt strategi ✅ LÅST - `OLLAMA_MAX_LOADED_MODELS=2` ✅ LÅST
- `num_ctx=2048`, `num_batch=256` ✅ LÅST
- `OLLAMA_NUM_THREADS` skal IKKE settes — Ollama autodetect er optimal
- `qwen2.5:7b` er ikke baseline-kandidat på gitea-cpu-vm - `qwen2.5:7b` er ikke baseline-kandidat på gitea-cpu-vm
- CPU-optimalisering utføres direkte på gitea-cpu-vm (ikke dev-snap) - CPU-optimalisering utføres direkte på gitea-cpu-vm
- alle resultater føres tilbake i OPPDATERINGSLOGG samme dag
Testrekkefølge: Testrekkefølge:
1. ✅ Kaldstart / keep_alive baseline — FERDIG 2026-07-21 1. ✅ Kaldstart / keep_alive baseline — FERDIG 2026-07-21
2. ✅ Resident modell-strategi (1 vs 2 modeller) — FERDIG 2026-07-21 2. ✅ Resident modell-strategi (1 vs 2 modeller) — FERDIG 2026-07-21
3. ⏳ Parameter-matrise (`num_ctx`, `num_batch`, `OLLAMA_NUM_THREADS`) 3. ✅ Parameter-matrise (num_ctx, num_batch, OLLAMA_NUM_THREADS) — FERDIG 2026-07-21
4. ⏳ Full Emma MCoT end-to-end 4. ⏳ Full Emma MCoT end-to-end
5. ⏳ Belastningstest med samtidig Gitea + agent-last 5. ⏳ Belastningstest med samtidig Gitea + agent-last
Exit-kriterium: Exit-kriterium:
- ✅ keep_alive-strategi bevist effektiv - ✅ keep_alive-strategi bevist effektiv
- ✅ resident modellvalg låst: **MAX_LOADED_MODELS=2, begge Forever** - ✅ resident modellvalg låst: MAX_LOADED_MODELS=2, begge Forever
- optimal parameterkombinasjon dokumentert - optimal parameterkombinasjon dokumentert
- ⏳ full Emma-loop latency akseptert - ⏳ full Emma-loop latency akseptert
- ⏳ 2-timers belastningstest bestått uten OOM og uten swap - ⏳ 2-timers belastningstest bestått uten OOM og uten swap
@ -92,78 +65,84 @@ Exit-kriterium:
## FASE 6.1 KALDSTART / KEEP_ALIVE BASELINE — RESULTATER 2026-07-21 ## FASE 6.1 KALDSTART / KEEP_ALIVE BASELINE — RESULTATER 2026-07-21
Kjørt på: **gitea-cpu-vm** (34.67.252.59) — ekte CPU, ingen GPU Kjørt på: **gitea-cpu-vm** (34.67.252.59) — ekte CPU, ingen GPU
Merk: dev-snap ignorerer `num_gpu 0` i options-feltet — GPU brukes uansett der. Alle tester kjørt direkte på gitea-cpu-vm.
### Kaldstart-målinger | Test | Modell | load_s | tok/s | Status |
|---|---|---|---|---|
| 1.1 Ekte kaldstart | gemma3:4b | **117.69s** | 4.9 | ✅ |
| 1.2 Ekte kaldstart | qwen2.5:3b | **71.13s** | 6.4 | ✅ |
| 1.3 keep_alive=-1 load | gemma3:4b | 76.93s | 5.9 | ✅ |
| 1.4 UNTIL=Forever | gemma3:4b | Forever ✅ | — | ✅ |
| 1.5 Varme kall ×5 | gemma3:4b | ~1.0s load | ~5 | ✅ |
| Test | Modell | load_s | eval_s | tok/s | Processor | Status | **Konklusjoner:** keep_alive=-1 eliminerer 117s kaldstart fra kall 2+. Varme kall ~2s/kall = 812s per Emma-turn.
|---|---|---|---|---|---|---|
| 1.1 Ekte kaldstart | gemma3:4b | **117.69s** | 1.02s | 4.9 | 100% CPU | ✅ PASS |
| 1.2 Ekte kaldstart | qwen2.5:3b | **71.13s** | 1.73s | 6.4 | 100% CPU | ✅ PASS |
| 1.3 keep_alive=-1 load | gemma3:4b | 76.93s (kald→varm) | — | 5.9 | 100% CPU | ✅ PASS |
### keep_alive=-1 verifikasjon
| Test | Resultat | Status |
|---|---|---|
| 1.4 UNTIL=Forever | gemma3:4b: **Forever** ✅ / qwen2.5:3b: ~2 min ⚠️ (ikke satt keep_alive=-1) | ✅ PASS |
| 1.5 Varme kall ×5 | load_s: 0.9841.048s (ikke 0, men ikke 117s) | ✅ PASS |
### Konklusjoner Fase 6.1
1. **Kaldstart-range bekreftet:** gemma3:4b = 117s, qwen2.5:3b = 71s
2. **`OLLAMA_KEEP_ALIVE=-1` er bevist nødvendig og effektiv** — eliminerer 117s kaldstart fra kall 2+
3. **Varme kall koster ~1s load + ~0.9s eval = ~2s per kall** — 46 kall per Emma-turn = 812s ren LLM-tid
4. **keep_alive=-1 må settes eksplisitt per kall per modell** — arves ikke automatisk
5. **`num_gpu 0` i options ignoreres på dev-snap** — fremtidige CPU-tester kjøres direkte på gitea-cpu-vm
--- ---
## FASE 6.2 RESIDENT MODELL-STRATEGI — RESULTATER 2026-07-21 ## FASE 6.2 RESIDENT MODELL-STRATEGI — RESULTATER 2026-07-21
Kjørt på: **gitea-cpu-vm** (34.67.252.59)
### Målinger
| Test | Konfigurasjon | Resultat | Status | | Test | Konfigurasjon | Resultat | Status |
|---|---|---|---| |---|---|---|---|
| 2.1 Begge modeller uten MAX-begrensning | Default (MAX=ubegrenset) | Begge lastet: gemma3:4b + qwen2.5:3b i RAM, Swap=0 | ✅ PASS | | 2.1 Begge uten MAX-begrensning | Default | Begge i RAM, Swap=0 | ✅ |
| 2.3 Modellbytte med MAX=1 | OLLAMA_MAX_LOADED_MODELS=1 | gemma3:4b reload: 9.31s / qwen2.5:3b reload: 5.6s — kun én modell i `ollama ps` | ✅ PASS | | 2.3 Bytte med MAX=1 | MAX_LOADED_MODELS=1 | gemma3 reload 9.31s / qwen 5.6s | ✅ |
| 2.4 Begge modeller med MAX=2 + KEEP_ALIVE=-1 | OLLAMA_MAX_LOADED_MODELS=2 + OLLAMA_KEEP_ALIVE=-1 | Begge Forever, 6.8 GB used, 8.9 GB available, Swap=0 | ✅ PASS | | 2.4 Begge med MAX=2 | MAX=2 + KEEP_ALIVE=-1 | Begge Forever, 6.8 GB, Swap=0 | ✅ |
### RAM-tilstand etter Fase 6.2 (final konfigurasjon) **✅ LÅST:** `OLLAMA_MAX_LOADED_MODELS=2` + `OLLAMA_KEEP_ALIVE=-1` i systemd.
Begrunnelse: MAX=1 gir 2054s ekstra latency per Emma-turn. MAX=2 gir 0s bytte-overhead, trygg RAM-margin.
---
## FASE 6.3 PARAMETER-MATRISE — RESULTATER 2026-07-21
Kjørt på: **gitea-cpu-vm** (34.67.252.59) — gemma3:4b, 3 kjøringer per rad, snitt tok/s
VCPU: 4
### num_ctx / num_batch
| Rad | num_ctx | num_batch | avg tok/s | Delta |
|---|---|---|---|---|
| 3.1 | 1024 | 256 | 4.9 | baseline |
| 3.2 | **2048** | **256** | **5.0** | +0.1 ✅ VINNER |
| 3.3 | 4096 | 256 | 4.3 | -0.7 ⚠️ |
| 3.4 | 2048 | 128 | 4.9 | -0.1 |
| 3.5 | 2048 | 512 | 4.8 | -0.2 |
### num_threads
| threads | tok/s | Delta |
|---|---|---|
| 2 | 4.9 | — |
| 3 | 4.9 | 0 |
| 4 | 4.8 | -0.1 |
### ✅ PARAMETERKONFIGURASJON LÅST
``` ```
total used free shared buff/cache available num_ctx = 2048 (default for Emma-turns)
Mem: 15Gi 6.8Gi 3.7Gi 492Ki 5.4Gi 8.9Gi num_batch = 256 (Ollama default, ikke nødvendig å sette eksplisitt)
Swap: 0B 0B 0B OLLAMA_NUM_THREADS = ikke satt (Ollama autodetect er optimal på 4 vCPU)
NAME SIZE PROCESSOR UNTIL
qwen2.5:3b 2.2 GB 100% CPU Forever
gemma3:4b 2.9 GB 100% CPU Forever
``` ```
### ✅ RESIDENT MODELL-STRATEGI LÅST **Konklusjoner:**
1. `num_ctx=2048` er beste balanse mellom kontekstlengde og ytelse
2. `num_ctx=4096` er -14% tregere — bruk kun eksplisitt ved lange samtaler
3. `num_batch` gjør ingen målbar forskjell på CPU — 256 er fin default
4. `OLLAMA_NUM_THREADS` gjør ingen målbar forskjell — skal ikke settes
5. Maskinens tak for gemma3:4b er stabilt **4.95.0 tok/s**
**Valgt konfigurasjon i `/etc/systemd/system/ollama.service.d/max-models.conf`:** ### Tilstand før Fase 6.4
```
[Service]
Environment="OLLAMA_MAX_LOADED_MODELS=2"
Environment="OLLAMA_KEEP_ALIVE=-1"
```
**Begrunnelse:** ```
- 2 modeller i RAM bruker 5.1 GB (2.9+2.2) — 8.9 GB gjenværende available er trygg margin NAME SIZE PROCESSOR CONTEXT UNTIL
- Bytte-kostnad med MAX=1: 59s per bytte × 46 kall per Emma-turn = 2054s ekstra latency per turn gemma3:4b 2.8 GB 100% CPU 2048 Forever
- Med MAX=2 og begge Forever: 0s bytte-overhead — 812s raskere per Emma-turn qwen2.5:3b 2.2 GB 100% CPU 4096 Forever
- Swap=0 bekreftet under alle testscenarier Mem: 15Gi total | 6.7Gi used | 8.9Gi available | Swap: 0B
- `OLLAMA_KEEP_ALIVE=-1` satt på systemd-nivå eliminerer behov for per-kall keep_alive-parameter ```
--- ---
## ÅPNE PUNKTER SOM MÅ LØSES FØR BLUEPRINT ## ÅPNE PUNKTER SOM MÅ LØSES FØR BLUEPRINT
- `GITEA_URL` satt runtime via `gcloud run services update` — **må også legges permanent inn i `opax-mcp.yaml` i repo og rebuildes** - `GITEA_URL` satt runtime via `gcloud run services update` — **må også legges permanent inn i `opax-mcp.yaml` i repo og rebuildes**
- `git.vauco.no` er planlagt som permanent domene for Gitea (ref: docs/DNS-OG-INFRASTRUKTUR.md) — erstatter IP når DNS er oppe - `git.vauco.no` er planlagt som permanent domene for Gitea — erstatter IP når DNS er oppe
- Gitea-commits er ikke GPG-signert — vurder om dette skal fikses - Gitea-commits er ikke GPG-signert — vurder om dette skal fikses
## FASTE SANNHETER (uendret) ## FASTE SANNHETER (uendret)
@ -190,5 +169,6 @@ Environment="OLLAMA_KEEP_ALIVE=-1"
| 2026-07-21 | FASE 4 | Full smoke test grønn, alle 8 tools OK | | 2026-07-21 | FASE 4 | Full smoke test grønn, alle 8 tools OK |
| 2026-07-21 | FASE 5 | Blueprint frosset, FASE 5 lukket | | 2026-07-21 | FASE 5 | Blueprint frosset, FASE 5 lukket |
| 2026-07-21 | FASE 6 | FASE 6 åpnet — CPU-optimalisering neste | | 2026-07-21 | FASE 6 | FASE 6 åpnet — CPU-optimalisering neste |
| 2026-07-21 | FASE 6.1 | Kaldstart/keep_alive baseline fullført: gemma3:4b=117s, qwen2.5:3b=71s, varme kall ~1s, keep_alive=-1 bevist effektiv | | 2026-07-21 | FASE 6.1 | Kaldstart/keep_alive: gemma3=117s, qwen=71s, varme kall ~2s, keep_alive=-1 bevist effektiv |
| 2026-07-21 | FASE 6.2 | Resident modell-strategi låst: MAX_LOADED_MODELS=2 + KEEP_ALIVE=-1 på systemd-nivå, begge modeller Forever, RAM 6.8/15 GB, Swap=0 | | 2026-07-21 | FASE 6.2 | Resident strategi låst: MAX=2 + KEEP_ALIVE=-1 systemd, begge Forever, RAM OK |
| 2026-07-21 | FASE 6.3 | Parameter-matrise låst: num_ctx=2048, num_batch=256 (default), OLLAMA_NUM_THREADS ikke satt. Maskintak: 5.0 tok/s |