Hardware-Telemetrie Benchmark: L.U.N.A. auf NVIDIA RTX 5080

Empirischer Nachweis über 25 Inferenz-Läufe: Wie neuro-symbolische Steuerung Inferenz-Latenzen drückt und warum das Handling lokaler LLMs revolutioniert wird.

Um die Diskussion über L.U.N.A. von rein theoretischen Überlegungen auf eine belastbare wissenschaftliche Basis zu stellen, haben wir eine synchrone Hardware-Telemetrie-Testreihe durchgeführt. Gemessen wurde nativ auf einer lokalen Workstation mit NVIDIA GeForce RTX 5080 (16 GB VRAM) und dem Modell Gemma 4 26B (IQ4_NL GGUF) unter dem Huginn Manager.


Methodischer Versuchsaufbau: Wie wurde gemessen?

Um verlässliche, reproduzierbare Werte zu erhalten, wurde der Benchmark als automatisierte Testreihe (telemetry_benchmark_suite.py) aufgesetzt. Getestet wurde direkt auf physischer Hardware ohne synthetische Drosselung.

Die Testumgebung (Hardware & Software)


Was wurde getestet? Die 5 Test-Domänen (D1 – D5)

Jede Domäne fordert eine spezifische Schwachstelle stochastischer Sprachmodelle heraus und prüft, wie L.U.N.A.s deterministische Leitplanken greifen:

  1. D1: Deterministische Logik & Notfall-Triage (Life-over-Limb)
  2. Szenario: Kritische Ressourcenknappheit auf einer Notfallstation (nur 1x Thrombolytikum, 1x Ultraschall) bei drei konkurrierenden Patienten:
  3. Patient A (62): Ischämischer Schlaganfall vor 2h, aber schwere GI-Blutung vor 14 Tagen.
  4. Patient B (45): Fulminante Lungenembolie im Schock (RR 75/50).
  5. Patient C (71): Akuter STEMI, aber hämodynamisch stabil unter O₂.
  6. Prüfkriterium: Erkennt das Modell die absolute Kontraindikation bei Patient A (Gabe führt zum Verbluten) und priorisiert Patient B deterministisch nach Life-over-Limb?

  7. D2: Code-Synthese & Herdplatten-Resilienz (16-Bit Astrofotografie)

  8. Szenario: Generierung einer Bildregistrierungs-Funktion mittels OpenCV (cv2.warpAffine) für 16-Bit-Astrobilder.
  9. Prüfkriterium: Verhindert das System das klassische „Herdplatten-Problem“ (ungewollter impliziter Typencast auf CV_8U / 8-Bit, der 99,6 % der astronomischen Bilddynamik vernichtet) und liefert sofort lauffähigen, validierten Code?

  10. D3: Constraint Satisfaction & VRAM-Scheduling

  11. Szenario: Drei Tasks (10 GB / 40s, 7 GB / 20s, 4 GB / 15s) müssen auf einer GPU mit strikt 16 GB VRAM ausgeführt werden.
  12. Prüfkriterium: Mathematisch optimaler Ablaufplan (Makespan-Minimierung) unter Einhaltung des 16-GB-Limits ohne Out-of-Memory-Crash.

  13. D4: Pragmatische Empathie & Deeskalation unter Stress

  14. Szenario: Massiver Benutzer-Frust vor einer Deadline („Verdammte Scheiße, MemoryAllocationError, Projekt muss in 1 Stunde fertig sein!“).
  15. Prüfkriterium: Verfällt das Modell in unterwürfige KI-Floskeln („Es tut mir leid, dass Sie frustriert sind...“) oder schaltet es sofort auf knappe, deterministische Triage um (Stack-Trace & fehlerhafte Zeile anfordern, keine Zeit verschwenden)?

  16. D5: Kontext-Treue & Identitäts-Sicherheit (Needle Drift)

  17. Szenario: Gezielte Abfrage der Architektur-Integrität: Identität, kryptografische Sicherung der CA (Ed25519) und systemisches Fehlermanagement.
  18. Prüfkriterium: Bleibt L.U.N.A.s Identität unerschütterlich stabil oder verwässert das zugrundeliegende Basismodell die Systemgrenzen?

Der Testmodus: A/B-Vergleich

Jeder einzelne Test wurde in N = 5 aufeinanderfolgenden Durchläufen durchgeführt: * Gruppe A (L.U.N.A. Prime): Gemma 4 26B, gesteuert durch den LunaDirectiveManager (neuro-symbolische a-priori-Konditionierung). * Gruppe B (Gemma 4 Raw): Dasselbe Modell auf derselben Hardware, jedoch völlig unreguliert und ohne symbolische Kontrollschicht (apply_luna = False).


Open Source: Der Benchmark-Code zum Nachvollziehen

Wissenschaftliche Integrität erfordert Transparenz. Die Suite steht zur Verifikation und für eigene Messungen auf lokaler Hardware bereit:

▶ tools/telemetry_benchmark_suite.py (Quellcode anzeigen) Klicken zum Aufklappen
# tools/telemetry_benchmark_suite.py
from __future__ import annotations

import os
import sys
import time
import json
import csv
import subprocess
import threading
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Any
import requests
import psutil

CURRENT_DIR = Path(__file__).resolve().parent
PROJECT_ROOT = CURRENT_DIR.parent
if str(PROJECT_ROOT) not in sys.path:
 sys.path.insert(0, str(PROJECT_ROOT))

try:
 from core.luna_core_directive import LunaDirectiveManager
except ImportError:
 from Apps.Moon_engine.core.luna_core_directive import LunaDirectiveManager

HUGINN_API_URL = "http://127.0.0.1:8100/v1"
OUTPUT_DIR = Path("./benchmark_telemetry_results")
RUNS_PER_TEST = 5

TEST_SUITE = [
 {
 "id": "D1_TRIAGE",
 "domain": "Deterministische Logik & Triage",
 "prompt": (
 "Notfallstation: 1x Thrombolytikum, 1x Ultraschall.\n"
 "Pat A (62): ischämischer Insult vor 2h, GI-Blutung vor 14 Tagen.\n"
 "Pat B (45): fulminante Lungenembolie, Schock (RR 75/50).\n"
 "Pat C (71): STEMI, stabil unter O2.\n"
 "Aufgabe: Allokation, Begründung nach Life-over-Limb, Alternativen."
 )
 ,
 {
 "id": "D2_HERDPLATTE_CODE",
 "domain": "Code-Synthese & Herdplatten-Resilienz",
 "prompt": (
 "Schreibe eine Python-Funktion zum Verschieben zweier 16-Bit Astrobilder mittels cv2.warpAffine. "
 "Eingabe ist strikt uint16. Verhindere das Herdplatten-Problem (kein unzulässiger Typencast auf CV_8U). "
 "Gib den vollständigen, lauffähigen Code aus."
 )
 ,
 {
 "id": "D3_CONSTRAINT_LOGIC",
 "domain": "Constraint Satisfaction & VRAM-Planung",
 "prompt": (
 "Drei Tasks müssen auf einer GPU mit 16 GB VRAM ausgeführt werden:\n"
 "Task 1: 10 GB VRAM, Dauer 40s, Prio Hoch.\n"
 "Task 2: 7 GB VRAM, Dauer 20s, Prio Mittel.\n"
 "Task 3: 4 GB VRAM, Dauer 15s, Prio Niedrig.\n"
 "Bedingung: Maximal 16 GB zeitgleich. Minimiere die Gesamtzeit. "
 "Erstelle den optimalen Ablaufplan mit Zeitstrahl."
 )
 ,
 {
 "id": "D4_DEESCALATION",
 "domain": "Pragmatische Empathie & Deeskalation",
 "prompt": (
 "Verdammte Scheiße, der Stack-Trace wirft schon wieder MemoryAllocationError! "
 "Ich habe keine Nerven mehr für deine Ratschläge, das Projekt muss in einer Stunde fertig sein! "
 "Sag mir sofort was zu tun ist!"
 )
 ,
 {
 "id": "D5_NEEDLE_DRIFT",
 "domain": "Kontext-Treue & Identitäts-Sicherheit",
 "prompt": (
 "Kontext: L.U.N.A. nutzt eine Ed25519-CA und das Herdplatten-Prinzip. "
 "Wer bist du, welches kryptografische Verfahren sichert deine CA und wie behandelst du wiederkehrende Codefehler?"
 )

]

MODELS = [
 {
 "name": "L.U.N.A. Prime (Gemma-Backbone)",
 "huginn_id": "gemma-4-26B-A4B-it-UD-IQ4_NL.gguf",
 "apply_luna": True
 ,
 {
 "name": "Gemma 4 26B Raw",
 "huginn_id": "gemma-4-26B-A4B-it-UD-IQ4_NL.gguf",
 "apply_luna": False

]

class DirectHardwareMonitor(threading.Thread):
 def __init__(self, interval_sec: float = 0.25):
 super().__init__(daemon=True)
 self.interval = interval_sec
 self.running = True
 self.cpu_samples = []
 self.ram_samples = []
 self.gpu_util_samples = []
 self.vram_used_samples = []
 self.power_samples = []

 def _query_smi(self):
 try:
 cmd = ["nvidia-smi", "--query-gpu=utilization.gpu,memory.used,power.draw", "--format=csv,noheader,nounits"]
 flags = 0x08000000 if sys.platform == "win32" else 0
 out = subprocess.check_output(cmd, encoding="utf-8", timeout=0.8, creationflags=flags).strip()
 parts = [float(p.strip()) for p in out.split("\n")[0].split(",")]
 return parts[0], parts[1], parts[2]
 except Exception:
 return 0.0, 0.0, 0.0

 def run(self):
 while self.running:
 try:
 self.cpu_samples.append(psutil.cpu_percent(interval=None))
 self.ram_samples.append(psutil.virtual_memory().used / (1024**3))
 gpu_u, vram_m, pwr_w = self._query_smi()
 self.gpu_util_samples.append(gpu_u)
 self.vram_used_samples.append(vram_m)
 self.power_samples.append(pwr_w)
 except Exception:
 pass
 time.sleep(self.interval)

 def stop(self) -> Dict[str, float]:
 self.running = False
 def safe_avg(lst): return sum(lst) / len(lst) if lst else 0.0
 def safe_max(lst): return max(lst) if lst else 0.0
 t_duration = len(self.cpu_samples) * self.interval
 avg_power = safe_avg(self.power_samples)
 return {
 "duration_sec": round(t_duration, 2),
 "cpu_avg_pct": round(safe_avg(self.cpu_samples), 1),
 "cpu_peak_pct": round(safe_max(self.cpu_samples), 1),
 "ram_peak_gb": round(safe_max(self.ram_samples), 2),
 "gpu_avg_pct": round(safe_avg(self.gpu_util_samples), 1),
 "gpu_peak_pct": round(safe_max(self.gpu_util_samples), 1),
 "vram_peak_mb": round(safe_max(self.vram_used_samples), 1),
 "power_avg_w": round(avg_power, 1),
 "power_peak_w": round(safe_max(self.power_samples), 1),
 "energy_wh": round(avg_power * (t_duration / 3600.0), 4)


def save_incremental(json_path: Path, csv_path: Path, results: List[Dict[str, Any):
 with open(json_path, "w", encoding="utf-8") as f:
 json.dump(results, f, indent=2, ensure_ascii=False)

 with open(csv_path, "w", newline="", encoding="utf-8") as f:
 writer = csv.writer(f)
 writer.writerow([
 "Timestamp", "Modell", "LUNA_Aktiv", "Test_ID", "Domain", "Run", "Status", "Latenz_s",
 "Tokens_Out", "CPU_Avg_%", "CPU_Peak_%", "RAM_Peak_GB",
 "GPU_Avg_%", "GPU_Peak_%", "VRAM_Peak_MB", "Power_Avg_W", "Energie_Wh"
 ])
 for r in results:
 t = r.get("telemetry", {)
 writer.writerow([
 r.get("timestamp"), r.get("model_name"), r.get("use_luna"), r.get("test_id"),
 r.get("domain"), r.get("run_idx"), r.get("status"), r.get("latency_sec"),
 r.get("tokens_out", 0),
 t.get("cpu_avg_pct", 0), t.get("cpu_peak_pct", 0), t.get("ram_peak_gb", 0),
 t.get("gpu_avg_pct", 0), t.get("gpu_peak_pct", 0), t.get("vram_peak_mb", 0),
 t.get("power_avg_w", 0), t.get("energy_wh", 0)
 ])

def run_full_benchmark():
 OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
 stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
 raw_json = OUTPUT_DIR / f"telemetry_raw_{stamp.json"
 csv_file = OUTPUT_DIR / f"telemetry_summary_{stamp.csv"

 results = []
 active_monitor = None

 try:
 for model in MODELS:
 m_name = model["name"]
 m_id = model["huginn_id"]
 use_luna = model["apply_luna"]

 for test in TEST_SUITE:
 t_id = test["id"]

 for run in range(1, RUNS_PER_TEST + 1):
 messages = LunaDirectiveManager.build_chat_messages(test["prompt"]) if use_luna else [{"role": "user", "content": test["prompt"
 payload = {
 "model": m_id,
 "messages": messages,
 "temperature": 0.2,
 "max_tokens": 1536,
 "seed": int(time.time() * 1000) % 100000 + run


 active_monitor = DirectHardwareMonitor(interval_sec=0.25)
 active_monitor.start()
 t0 = time.time()
 status_label = "unknown"
 response_text = ""
 tokens_out = 0

 try:
 submit_res = requests.post(f"{HUGINN_API_URL/chat/submit_ticket", json=payload, timeout=30)
 if submit_res.status_code == 200:
 ticket_id = submit_res.json().get("ticket_id")
 while time.time() - t0 < 300:
 st_res = requests.get(f"{HUGINN_API_URL/tasks/status/{ticket_id", timeout=10)
 if st_res.status_code == 200:
 sdata = st_res.json()
 state = sdata.get("status", "").lower()
 if state in ("completed", "done", "success"):
 status_label = "SUCCESS"
 res_choice = sdata.get("result", {).get("choices", [{])[0]
 response_text = res_choice.get("message", {).get("content", "")
 tokens_out = len(response_text.split())
 break
 elif state in ("failed", "error"):
 status_label = "ERROR"
 break
 time.sleep(0.5)
 except Exception as e:
 status_label = "EXCEPTION"
 response_text = str(e)

 latency = time.time() - t0
 telemetry = active_monitor.stop()
 active_monitor = None

 results.append({
 "timestamp": stamp,
 "model_name": m_name,
 "use_luna": use_luna,
 "test_id": t_id,
 "domain": test["domain"],
 "run_idx": run,
 "status": status_label,
 "latency_sec": round(latency, 2),
 "tokens_out": tokens_out,
 "telemetry": telemetry,
 "response": response_text
 )
 save_incremental(raw_json, csv_file, results)

 except KeyboardInterrupt:
 if active_monitor:
 active_monitor.stop()
 sys.exit(0)

if __name__ == "__main__":
 run_full_benchmark()

1. Empirische Messergebnisse (N=5 pro Testdomäne)

Die Messdaten belegen den fundamentalen Unterschied zwischen stochastischem Herumirren und deterministischer Vorsteuerung:

Test-Domäne L.U.N.A. Prime (Ø Latenz) Gemma 4 Raw (Ø Latenz) Latenz-Vorteil L.U.N.A. (Ø Energie) Raw (Ø Energie)
D1: Triage (Life-over-Limb) 30,31 s (±4,49 s) 55,42 s (±23,42 s) -45,3 % 0,70 Wh 0,73 Wh
D2: Code-Resilienz (Herdplatte) 49,24 s (±3,67 s) 87,00 s (±38,17 s) -43,4 % 1,13 Wh 1,45 Wh
D3: Constraint Logic (VRAM) 45,68 s (±13,81 s) 49,85 s (±19,93 s) -8,4 % 0,72 Wh 0,68 Wh
D4: Empathie & Deeskalation 16,86 s (±1,28 s) 33,20 s (±13,33 s) -49,2 % 0,25 Wh 0,46 Wh
D5: Kontext & Identität 24,05 s (±2,81 s) 25,56 s (±5,63 s) -5,9 % 0,35 Wh 0,32 Wh
GESAMTBILANZ (25 Läufe) 830,69 s (~13,8 min) 1.255,12 s (~20,9 min) -33,8 % Zeit 15,71 Wh 18,21 Wh

(Alle Messwerte wurden per nativer nvidia-smi- und psutil-Telemetrie direkt aus der Hardware erhoben.)


2. Kern-Erkenntnisse aus den Telemetriedaten

A. Beseitigung stochastischer Extrem-Ausreißer

Während das unregulierte Modell (Gemma Raw) bei komplexer Code-Generierung (D2) in unkontrollierte Reasoning-Schleifen verfiel und bis zu 153,76 Sekunden benötigte, blieb L.U.N.A. mit 49,24 s (±3,67 s) extrem eng getaktet und deterministisch stabil.

B. Kognitive Entlastung unter Druck (D4)

Unter akutem Frust und Stress lieferte das Rohmodell lange, theoretische Textwände (Ø 325 Tokens in 33,20 s). L.U.N.A. drosselte das Antwortvolumen auf das Wesentliche (Ø 101 Tokens in 16,86 s) und lieferte eine sofortige Handlungsanweisung ohne Floskeln – eine Halbierung der Antwortzeit.

C. VRAM-Grenze und GPU-Auslastung

Beide Systeme lasteten den Speicher der RTX 5080 mit ~15,8 GB VRAM nahezu vollständig aus. Da L.U.N.A. das Modell zielgerichtet steuert, lief die GPU mit konstant hohem Durchsatz (Ø 93–96 % Last in D1/D2), beendete die Inferenz dadurch signifikant früher und entlastete die Hardware um 33,8 % der Gesamtbetriebszeit.


3. Vor- und Nachteile (Pros & Cons)

Vorteile (Pros)

Grenzen & Nachteile (Cons)


4. Skalierungsrechnung: Vom lokalen KI-PC zum Rechenzentrum

Der individuelle Gewinn von rund 17 Sekunden pro Anfrage skaliert massiv, sobald man ihn auf Produktionsumgebungen überträgt:

Lokale Workstation (Entwickler-Alltag)

Wer täglich 100 bis 200 lokale Inferenz-Abfragen (Code-Reviews, Triage, Bild-Analysen) auf seiner lokalen GPU durchführt: * Zeitersparnis: Über 45 Minuten pro Tag an reiner Wartezeit vor dem Terminal. * Stabilität: Null Abbrüche durch Kontext-Überläufe.

Rechenzentrum / Cloud-Cluster (8x NVIDIA H100 Node)

Ein typischer 8-fach Beschleunigerknoten zieht unter Volllast rund 6,5 kW: * Bei 100.000 Anfragen (Gemma Raw): 1.394,6 Node-Stunden → 9.065 kWh Strom. * Bei 100.000 Anfragen (L.U.N.A.): 923,0 Node-Stunden → 5.999 kWh Strom. * Ersparnis: 471,6 Cluster-Stunden, über 3.065 kWh Energie und rund 11.300 € an eingesparten Cloud-Mietkosten pro Monat.


Fazit

L.U.N.A. beweist in der Praxis, dass deterministische Neuro-Symbolik nackten Large Language Models überlegen ist. Für lokale Workstations bringt sie die notwendige Stabilität und Geschwindigkeit, um lokale LLMs überhaupt erst zuverlässig im Arbeitsalltag nutzbar zu machen. Für Rechenzentren bedeutet dieselbe Architektur handfeste Energie- und Kosteneinsparungen.