fix: nvidia-smi robust parsing with fallback defaults, card width adjustment
This commit is contained in:
+35
-22
@@ -1190,7 +1190,7 @@ func tryNvidiaSMI() []GPUInfo {
|
|||||||
var gpus []GPUInfo
|
var gpus []GPUInfo
|
||||||
for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
|
for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
|
||||||
parts := strings.Split(line, ",")
|
parts := strings.Split(line, ",")
|
||||||
if len(parts) < 17 {
|
if len(parts) < 9 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for i := range parts {
|
for i := range parts {
|
||||||
@@ -1198,27 +1198,40 @@ func tryNvidiaSMI() []GPUInfo {
|
|||||||
parts[i] = strings.Trim(parts[i], "[]")
|
parts[i] = strings.Trim(parts[i], "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0:index 1:name 2:vram_total 3:vram_used 4:vram_free
|
g := GPUInfo{
|
||||||
// 5:temp 6:load 7:core_clk 8:mem_clk 9:power 10:power_limit
|
Name: parts[1],
|
||||||
// 11:fan 12:pstate 13:persistence 14:compute_mode
|
VRAMTotalMB: parseFloat(parts[2]),
|
||||||
// 15:driver 16:cuda
|
VRAMUsedMB: parseFloat(parts[3]),
|
||||||
gpus = append(gpus, GPUInfo{
|
Temperature: parseFloat(parts[5]),
|
||||||
Name: parts[1],
|
LoadPercent: parseFloat(parts[6]),
|
||||||
VRAMTotalMB: parseFloat(parts[2]),
|
CoreClock: parseFloat(parts[7]),
|
||||||
VRAMUsedMB: parseFloat(parts[3]),
|
MemClock: parseFloat(parts[8]),
|
||||||
Temperature: parseFloat(parts[5]),
|
}
|
||||||
LoadPercent: parseFloat(parts[6]),
|
if len(parts) > 9 {
|
||||||
CoreClock: parseFloat(parts[7]),
|
g.Power = parseFloatSafe(parts[9])
|
||||||
MemClock: parseFloat(parts[8]),
|
}
|
||||||
Power: parseFloatSafe(parts[9]),
|
if len(parts) > 10 {
|
||||||
PowerLimit: parseFloatSafe(parts[10]),
|
g.PowerLimit = parseFloatSafe(parts[10])
|
||||||
FanSpeed: parseFloatSafe(parts[11]),
|
}
|
||||||
PState: cleanStr(parts[12]),
|
if len(parts) > 11 {
|
||||||
Persistence: cleanStr(parts[13]),
|
g.FanSpeed = parseFloatSafe(parts[11])
|
||||||
ComputeMode: cleanStr(parts[14]),
|
}
|
||||||
DriverVersion: cleanStr(parts[15]),
|
if len(parts) > 12 {
|
||||||
CudaVersion: cleanStr(parts[16]),
|
g.PState = cleanStr(parts[12])
|
||||||
})
|
}
|
||||||
|
if len(parts) > 13 {
|
||||||
|
g.Persistence = cleanStr(parts[13])
|
||||||
|
}
|
||||||
|
if len(parts) > 14 {
|
||||||
|
g.ComputeMode = cleanStr(parts[14])
|
||||||
|
}
|
||||||
|
if len(parts) > 15 {
|
||||||
|
g.DriverVersion = cleanStr(parts[15])
|
||||||
|
}
|
||||||
|
if len(parts) > 16 {
|
||||||
|
g.CudaVersion = cleanStr(parts[16])
|
||||||
|
}
|
||||||
|
gpus = append(gpus, g)
|
||||||
}
|
}
|
||||||
return gpus
|
return gpus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
.pdot { position:absolute; top:50%; left:50%; width:8px; height:8px; margin:-4px; background:var(--accent); border-radius:50% }
|
.pdot { position:absolute; top:50%; left:50%; width:8px; height:8px; margin:-4px; background:var(--accent); border-radius:50% }
|
||||||
@keyframes pulse { 0%{transform:scale(.35);opacity:1} 100%{transform:scale(2.4);opacity:0} }
|
@keyframes pulse { 0%{transform:scale(.35);opacity:1} 100%{transform:scale(2.4);opacity:0} }
|
||||||
|
|
||||||
.device-grid { padding:12px 20px 32px; display:grid; grid-template-columns:repeat(auto-fill,minmax(420px,1fr)); gap:12px }
|
.device-grid { padding:12px 20px 32px; display:grid; grid-template-columns:repeat(auto-fill,minmax(360px,1fr)); gap:12px }
|
||||||
.device-grid > .device-card { min-width:0 }
|
.device-grid > .device-card { min-width:0 }
|
||||||
.device-card { background:var(--card); border:1px solid var(--border); border-radius:10px; transition:opacity .3s,border-color .2s,box-shadow .2s }
|
.device-card { background:var(--card); border:1px solid var(--border); border-radius:10px; transition:opacity .3s,border-color .2s,box-shadow .2s }
|
||||||
.device-card:hover { border-color:#28304a; box-shadow:0 4px 24px rgba(0,0,0,.2) }
|
.device-card:hover { border-color:#28304a; box-shadow:0 4px 24px rgba(0,0,0,.2) }
|
||||||
|
|||||||
Reference in New Issue
Block a user