web: refactor gpu code for slighly better perf

This commit is contained in:
henrygd
2026-01-08 13:14:32 -05:00
parent 1c97ea3e2c
commit 78d742c712

View File

@@ -400,16 +400,34 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const containerFilterBar = containerData.length ? <FilterBar /> : null const containerFilterBar = containerData.length ? <FilterBar /> : null
const dataEmpty = !chartLoading && chartData.systemStats.length === 0 const dataEmpty = !chartLoading && chartData.systemStats.length === 0
const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {}) const lastGpus = systemStats.at(-1)?.stats?.g
const hasGpuData = lastGpuVals.length > 0
const hasGpuPowerData = systemStats.some((record) => { let hasGpuData = false
const gpus = record.stats?.g let hasGpuEnginesData = false
if (!gpus) { let hasGpuPowerData = false
return false
if (lastGpus) {
// check if there are any GPUs with engines
for (const id in lastGpus) {
hasGpuData = true
if (lastGpus[id].e !== undefined) {
hasGpuEnginesData = true
break
}
} }
return Object.values(gpus).some((gpu) => gpu.p !== undefined || gpu.pp !== undefined) // check if there are any GPUs with power data
}) for (let i = 0; i < systemStats.length && !hasGpuPowerData; i++) {
const hasGpuEnginesData = lastGpuVals.some((gpu) => gpu.e !== undefined) const gpus = systemStats[i].stats?.g
if (!gpus) continue
for (const id in gpus) {
if (gpus[id].p !== undefined || gpus[id].pp !== undefined) {
hasGpuPowerData = true
break
}
}
}
}
const isLinux = !(details?.os ?? system.info?.os) const isLinux = !(details?.os ?? system.info?.os)
const isPodman = details?.podman ?? system.info?.p ?? false const isPodman = details?.podman ?? system.info?.p ?? false
@@ -721,64 +739,65 @@ export default memo(function SystemDetail({ id }: { id: string }) {
<GpuEnginesChart chartData={chartData} /> <GpuEnginesChart chartData={chartData} />
</ChartCard> </ChartCard>
)} )}
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => { {lastGpus &&
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData Object.keys(lastGpus).map((id) => {
return ( const gpu = lastGpus[id] as GPUData
<div key={id} className="contents"> return (
<ChartCard <div key={id} className="contents">
className={cn(grid && "!col-span-1")}
empty={dataEmpty}
grid={grid}
title={`${gpu.n} ${t`Usage`}`}
description={t`Average utilization of ${gpu.n}`}
>
<AreaChartDefault
chartData={chartData}
dataPoints={[
{
label: t`Usage`,
dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
color: 1,
opacity: 0.35,
},
]}
tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
contentFormatter={({ value }) => `${decimalString(value)}%`}
/>
</ChartCard>
{(gpu.mt ?? 0) > 0 && (
<ChartCard <ChartCard
className={cn(grid && "!col-span-1")}
empty={dataEmpty} empty={dataEmpty}
grid={grid} grid={grid}
title={`${gpu.n} VRAM`} title={`${gpu.n} ${t`Usage`}`}
description={t`Precise utilization at the recorded time`} description={t`Average utilization of ${gpu.n}`}
> >
<AreaChartDefault <AreaChartDefault
chartData={chartData} chartData={chartData}
dataPoints={[ dataPoints={[
{ {
label: t`Usage`, label: t`Usage`,
dataKey: ({ stats }) => stats?.g?.[id]?.mu ?? 0, dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
color: 2, color: 1,
opacity: 0.25, opacity: 0.35,
}, },
]} ]}
max={gpu.mt} tickFormatter={(val) => `${toFixedFloat(val, 2)}%`}
tickFormatter={(val) => { contentFormatter={({ value }) => `${decimalString(value)}%`}
const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
return `${toFixedFloat(value, value >= 10 ? 0 : 1)} ${unit}`
}}
contentFormatter={({ value }) => {
const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
return `${decimalString(convertedValue)} ${unit}`
}}
/> />
</ChartCard> </ChartCard>
)}
</div> {(gpu.mt ?? 0) > 0 && (
) <ChartCard
})} empty={dataEmpty}
grid={grid}
title={`${gpu.n} VRAM`}
description={t`Precise utilization at the recorded time`}
>
<AreaChartDefault
chartData={chartData}
dataPoints={[
{
label: t`Usage`,
dataKey: ({ stats }) => stats?.g?.[id]?.mu ?? 0,
color: 2,
opacity: 0.25,
},
]}
max={gpu.mt}
tickFormatter={(val) => {
const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
return `${toFixedFloat(value, value >= 10 ? 0 : 1)} ${unit}`
}}
contentFormatter={({ value }) => {
const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
return `${decimalString(convertedValue)} ${unit}`
}}
/>
</ChartCard>
)}
</div>
)
})}
</div> </div>
)} )}