Fix: VRAM/Memory-Leiste nutzt echtes GTT-Budget (~124GB) statt 16GB-Fallback

Cockpit VRAM-HUD las einen hardcodierten 16GB-APU-Fallback als Pool-Kapazitaet -> Leiste
zeigte z.B. "11.3/16GB". Jetzt: gtt_total aus /api/system/status (unified memory, ~124GB).
Label zeigt zusaetzlich die reale GTT-Belegung (inkl. KV) ehrlich an.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-27 12:43:26 +02:00
parent 6758bbfbd9
commit 31d5e5d727
5 changed files with 410 additions and 405 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -7,8 +7,8 @@
<link rel="manifest" href="/manifest.webmanifest" /> <link rel="manifest" href="/manifest.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Mission Control 2.0</title> <title>Mission Control 2.0</title>
<script type="module" crossorigin src="/assets/index-Bb8BpQr4.js"></script> <script type="module" crossorigin src="/assets/index-OBh42VZw.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-bw6S4bF_.css"> <link rel="stylesheet" crossorigin href="/assets/index-BA8F-FbW.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
+10 -5
View File
@@ -1,7 +1,7 @@
import { useState, useRef, useCallback } from "react" import { useState, useRef, useCallback } from "react"
import { Download, Trash2, Edit3, Activity, HardDrive, X, Check, Copy, Zap, Bot } from "lucide-react" import { Download, Trash2, Edit3, Activity, HardDrive, X, Check, Copy, Zap, Bot } from "lucide-react"
import { api, type ModelInfo } from "@/lib/api" import { api, type ModelInfo } from "@/lib/api"
import { useModels, useRouting, useConnect, useUpdates, useHermesBrain, useQueryClient, qk } from "@/lib/queries" import { useModels, useRouting, useConnect, useUpdates, useHermesBrain, useSystemStatus, useQueryClient, qk } from "@/lib/queries"
import { useDialog } from "@/lib/useDialog" import { useDialog } from "@/lib/useDialog"
import { CapsChips } from "@/components/CapsChips" import { CapsChips } from "@/components/CapsChips"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
@@ -16,6 +16,7 @@ export function Cockpit() {
const { data: connectData } = useConnect() const { data: connectData } = useConnect()
const { data: updates } = useUpdates(4_000) const { data: updates } = useUpdates(4_000)
const { data: brain } = useHermesBrain() const { data: brain } = useHermesBrain()
const { data: sysStatus } = useSystemStatus()
const { showAlert, showConfirm, showPrompt, dialogElement } = useDialog() const { showAlert, showConfirm, showPrompt, dialogElement } = useDialog()
const models = modelsResp?.models ?? [] const models = modelsResp?.models ?? []
const running = modelsResp?.running ?? [] const running = modelsResp?.running ?? []
@@ -233,11 +234,15 @@ export function Cockpit() {
) )
} }
// VRAM calculation: APU fallback 16GB if sysfs returns 0 // Speicher-Pool = echtes GTT-Budget (unified memory, ~124 GB), nicht der alte 16-GB-Fallback.
const runningWithInfo = models.filter((m) => running.includes(m.name)) const runningWithInfo = models.filter((m) => running.includes(m.name))
const totalRunningSize = runningWithInfo.reduce((acc, m) => acc + (m.size_bytes || 0), 0) const totalRunningSize = runningWithInfo.reduce((acc, m) => acc + (m.size_bytes || 0), 0)
const virtualMax = 16 * 1024 ** 3 // 16 GB Default const gttTotal = sysStatus?.gpu?.gtt_total || sysStatus?.gpu?.vram_total || 0
const capacity = totalRunningSize > virtualMax ? totalRunningSize * 1.2 : virtualMax const gttUsed = sysStatus?.gpu?.gtt_used || 0
const virtualMax = 16 * 1024 ** 3 // Fallback, falls sysfs nichts liefert
const capacity = gttTotal > 2 * 1024 ** 3
? gttTotal
: (totalRunningSize > virtualMax ? totalRunningSize * 1.2 : virtualMax)
// Find model by role // Find model by role
const getModelForRole = (role: string) => models.find((m) => m.role === role) const getModelForRole = (role: string) => models.find((m) => m.role === role)
@@ -270,7 +275,7 @@ export function Cockpit() {
</div> </div>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<span className="text-[10px] font-mono text-muted-foreground"> <span className="text-[10px] font-mono text-muted-foreground">
Llama Swap VRAM-Pool: {fmtSize(totalRunningSize)} / {fmtSize(capacity)} geladen Speicher-Pool: {fmtSize(totalRunningSize)} Gewichte{gttUsed > 0 ? ` · ${fmtSize(gttUsed)} real belegt (inkl. KV)` : ""} / {fmtSize(capacity)}
</span> </span>
{running.length > 0 && ( {running.length > 0 && (
<button <button