fix+feat: offene Punkte abgeschlossen
Kontext in Connect-Snippet: - ConnectPanel: max_tokens nutzt jetzt den echten konfigurierten Kontext des Modells (m.meta.ctx) statt hartkodiertem 32768 -> Zed sieht 128k Phase D - 'Immer aktiv halten' Toggle: - models.py: UpdateReq bekommt optionales ttl-Feld - update_model: setzt TTL wenn angegeben (ctx und ttl unabhaengig) - ModelsPanel: Checkbox 'Immer aktiv halten' im Konfig-Modal (TTL=99999 = nie entladen, TTL=300 = Standard 5min) MoE tps-Schaetzung: - hw_math.py: extract_active_params_b() erkennt A3B-Suffix - estimate_speed(): moe_active_ratio-Parameter, sqrt-Boost fuer MoE - evaluate_fit(): name-Parameter (optional) fuer automatische MoE-Erkennung - cookbook.py: alle evaluate_fit-Aufrufe mit name= versehen Cleanup: - static/js/panels/*.js + static/js/main.js geloescht (Dead Code) - wird-Datei (versehentlich committet) geloescht - CLAUDE.md: KISS-Statement auf Vite+Svelte-Stand aktualisiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+23
-8
@@ -36,21 +36,36 @@ def estimate_memory_gb(params_b: float, quant: str, ctx: int) -> float:
|
||||
|
||||
return weights + context_vram
|
||||
|
||||
def estimate_speed(req_gb: float, sys_ram_gb: float) -> float:
|
||||
"""Berechnet die geschätzte Tokens/s basierend auf der 273 GB/s Bandbreite der APU."""
|
||||
# Strix Halo hat ca 273 GB/s Unified Memory Bandbreite.
|
||||
def extract_active_params_b(name: str) -> float | None:
|
||||
"""Aktive Parameter bei MoE-Modellen aus dem Namen (z.B. '30B-A3B' → 3.0).
|
||||
Gibt None zurück für Dense-Modelle (kein MoE-Suffix erkannt)."""
|
||||
m = re.search(r'(?<![a-zA-Z])a(\d+(?:\.\d+)?)b\b', name.lower())
|
||||
return float(m.group(1)) if m else None
|
||||
|
||||
|
||||
def estimate_speed(req_gb: float, sys_ram_gb: float, moe_active_ratio: float = 1.0) -> float:
|
||||
"""Berechnet die geschätzte Tokens/s basierend auf der 273 GB/s Bandbreite der APU.
|
||||
moe_active_ratio = aktive_params / gesamt_params; < 1 bei MoE (z.B. 0.1 für 30B-A3B)."""
|
||||
bw = 273 if sys_ram_gb > 8 else 70
|
||||
if req_gb <= 0:
|
||||
return 0.0
|
||||
|
||||
# (Bandbreite / Modellgröße) * Effizienz (0.55)
|
||||
raw_tps = (bw / req_gb) * 0.55
|
||||
# MoE-Boost: nur ein Bruchteil der Gewichte wird pro Token aktiviert →
|
||||
# effektiv höhere Durchsatzrate als ein Dense-Modell gleicher Gesamtgröße.
|
||||
# sqrt-Dämpfung: Routing-Overhead + VRAM-Traffic für alle Experten bleibt.
|
||||
if moe_active_ratio < 0.8:
|
||||
raw_tps *= (1.0 / moe_active_ratio) ** 0.5
|
||||
return raw_tps
|
||||
|
||||
def evaluate_fit(params_b: float, quant: str, ctx: int, sys_ram_gb: float) -> dict:
|
||||
"""Berechnet den Fit für ein System mit Shared Memory (APU)."""
|
||||
|
||||
def evaluate_fit(params_b: float, quant: str, ctx: int, sys_ram_gb: float,
|
||||
name: str = "") -> dict:
|
||||
"""Berechnet den Fit für ein System mit Shared Memory (APU).
|
||||
name wird für MoE-Erkennung genutzt (optional)."""
|
||||
req_gb = estimate_memory_gb(params_b, quant, ctx)
|
||||
tps = estimate_speed(req_gb, sys_ram_gb)
|
||||
active_b = extract_active_params_b(name) if name else None
|
||||
moe_ratio = (active_b / params_b) if (active_b and params_b > 0) else 1.0
|
||||
tps = estimate_speed(req_gb, sys_ram_gb, moe_ratio)
|
||||
|
||||
# Das OS und andere Prozesse brauchen RAM. Wir lassen 4GB Puffer.
|
||||
usable_ram = max(sys_ram_gb - 4.0, 0)
|
||||
|
||||
Reference in New Issue
Block a user