mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/1Panel-dev/1Panel.git
synced 2026-09-21 00:24:12 +08:00
131 lines
4.0 KiB
Go
131 lines
4.0 KiB
Go
package accelerator
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/npu"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/xpu"
|
|
)
|
|
|
|
func normalizeGPU(item *gpu.Device) Device {
|
|
metrics := Metrics{
|
|
Utilization: metric(item.GPUUtil, "%"),
|
|
Temperature: metric(item.Temperature, "°C"),
|
|
Power: metric(item.PowerDraw, "W"),
|
|
PowerLimit: metric(item.MaxPowerLimit, "W"),
|
|
MemoryUsed: memoryMetric(item.MemUsed),
|
|
MemoryTotal: memoryMetric(item.MemTotal),
|
|
FanSpeed: metric(item.FanSpeed, "%"),
|
|
}
|
|
device := Device{
|
|
ID: stableID(item.Type, item.BusID, strconv.FormatUint(uint64(item.Index), 10)),
|
|
Kind: KindGPU,
|
|
Vendor: item.Type,
|
|
Index: int(item.Index),
|
|
Name: item.ProductName,
|
|
Label: fmt.Sprintf("%d - %s", item.Index, item.ProductName),
|
|
BusID: item.BusID,
|
|
Metrics: metrics,
|
|
GPU: item,
|
|
}
|
|
device.Capabilities = capabilities(metrics)
|
|
for _, process := range item.Processes {
|
|
device.Processes = append(device.Processes, Process{
|
|
PID: process.PID,
|
|
Type: process.Type,
|
|
Name: process.ProcessName,
|
|
Memory: normalizedMemoryDisplay(process.UsedMemory),
|
|
})
|
|
}
|
|
return device
|
|
}
|
|
|
|
func normalizeNPU(item *npu.Device) Device {
|
|
metrics := Metrics{
|
|
Utilization: metric(item.AICore, "%"),
|
|
Temperature: metric(item.Temperature, "°C"),
|
|
Power: metric(item.PowerDraw, "W"),
|
|
MemoryUsed: memoryMetric(item.MemUsed),
|
|
MemoryTotal: memoryMetric(item.MemTotal),
|
|
}
|
|
device := Device{
|
|
ID: fmt.Sprintf("ascend:%d:%d", item.NPUIndex, item.ChipIndex),
|
|
Kind: KindNPU,
|
|
Vendor: "ascend",
|
|
Index: int(item.Index),
|
|
NPUIndex: int(item.NPUIndex),
|
|
ChipIndex: int(item.ChipIndex),
|
|
Name: item.ProductName,
|
|
Label: fmt.Sprintf("NPU %d / Chip %d - %s", item.NPUIndex, item.ChipIndex, item.ProductName),
|
|
BusID: item.BusID,
|
|
Metrics: metrics,
|
|
NPU: item,
|
|
}
|
|
device.Capabilities = capabilities(metrics)
|
|
for _, process := range item.Processes {
|
|
device.Processes = append(device.Processes, Process{
|
|
PID: process.PID,
|
|
Type: "NPU",
|
|
Name: process.ProcessName,
|
|
Memory: normalizedMemoryDisplay(process.UsedMemory),
|
|
})
|
|
}
|
|
return device
|
|
}
|
|
|
|
func normalizeXPU(item *xpu.Device) Device {
|
|
metrics := Metrics{
|
|
Utilization: metric(item.Stats.GPUUtil, "%"),
|
|
Temperature: metric(item.Stats.Temperature, "°C"),
|
|
Power: metric(item.Stats.Power, "W"),
|
|
MemoryUsed: memoryMetric(item.Stats.MemoryUsed),
|
|
MemoryTotal: memoryMetric(item.Basic.Memory),
|
|
MemoryUtil: metric(item.Stats.MemoryUtil, "%"),
|
|
Frequency: metric(item.Stats.Frequency, "MHz"),
|
|
}
|
|
device := Device{
|
|
ID: stableID("xpu", item.Basic.PciBdfAddress, strconv.Itoa(item.Basic.DeviceID)),
|
|
Kind: KindXPU,
|
|
Vendor: item.Basic.VendorName,
|
|
Index: item.Basic.DeviceID,
|
|
Name: item.Basic.DeviceName,
|
|
Label: fmt.Sprintf("%d - %s", item.Basic.DeviceID, item.Basic.DeviceName),
|
|
BusID: item.Basic.PciBdfAddress,
|
|
Metrics: metrics,
|
|
XPU: item,
|
|
}
|
|
device.Capabilities = capabilities(metrics)
|
|
for _, process := range item.Processes {
|
|
device.Processes = append(device.Processes, Process{
|
|
PID: strconv.Itoa(process.PID),
|
|
Type: process.SHR,
|
|
Name: process.Command,
|
|
Memory: normalizedMemoryDisplay(process.Memory),
|
|
SharedMemory: process.SHR,
|
|
})
|
|
}
|
|
return device
|
|
}
|
|
|
|
func capabilities(metrics Metrics) Capabilities {
|
|
return Capabilities{
|
|
Utilization: metrics.Utilization.Available(),
|
|
Temperature: metrics.Temperature.Available(),
|
|
Power: metrics.Power.Available(),
|
|
PowerLimit: metrics.PowerLimit.Available(),
|
|
Memory: metrics.MemoryUsed.Available() || metrics.MemoryTotal.Available(),
|
|
FanSpeed: metrics.FanSpeed.Available(),
|
|
Frequency: metrics.Frequency.Available(),
|
|
}
|
|
}
|
|
|
|
func stableID(vendor, busID, fallback string) string {
|
|
if busID != "" && !strings.EqualFold(busID, "N/A") {
|
|
return vendor + ":" + busID
|
|
}
|
|
return vendor + ":" + fallback
|
|
}
|