From 79b8d178879d46a1813ced805795843ed03df63e Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Tue, 25 Feb 2025 14:16:22 +0800 Subject: [PATCH] feat: Support gpu of schema v11 (#7987) --- agent/utils/ai_tools/gpu/gpu.go | 15 +++++++++------ .../gpu/{schema_v12 => schema}/parser.go | 13 +++++++++---- .../ai_tools/gpu/{schema_v12 => schema}/types.go | 2 +- agent/utils/cmd/cmd.go | 16 ++++++++++++++++ frontend/src/views/ai/gpu/index.vue | 2 +- 5 files changed, 36 insertions(+), 12 deletions(-) rename agent/utils/ai_tools/gpu/{schema_v12 => schema}/parser.go (79%) rename agent/utils/ai_tools/gpu/{schema_v12 => schema}/types.go (99%) diff --git a/agent/utils/ai_tools/gpu/gpu.go b/agent/utils/ai_tools/gpu/gpu.go index ac21c32a8..1c557d03e 100644 --- a/agent/utils/ai_tools/gpu/gpu.go +++ b/agent/utils/ai_tools/gpu/gpu.go @@ -12,7 +12,7 @@ import ( "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/common" - "github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/schema_v12" + "github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/schema" "github.com/1Panel-dev/1Panel/agent/utils/cmd" ) @@ -28,7 +28,7 @@ func (n NvidiaSMI) LoadGpuInfo() (*common.GpuInfo, error) { return nil, fmt.Errorf("calling nvidia-smi failed, err: %w", err) } data := []byte(itemData) - schema := "v11" + version := "v11" buf := bytes.NewBuffer(data) decoder := xml.NewDecoder(buf) @@ -51,15 +51,18 @@ func (n NvidiaSMI) LoadGpuInfo() (*common.GpuInfo, error) { parts := strings.Split(directive, " ") s := strings.Trim(parts[len(parts)-1], "\" ") if strings.HasPrefix(s, "nvsmi_device_") && strings.HasSuffix(s, ".dtd") { - schema = strings.TrimSuffix(strings.TrimPrefix(s, "nvsmi_device_"), ".dtd") + version = strings.TrimSuffix(strings.TrimPrefix(s, "nvsmi_device_"), ".dtd") } else { global.LOG.Debugf("Cannot find schema version in %q", directive) } break } - if schema != "v12" { - return &common.GpuInfo{}, nil + if version == "v12" || version == "v11" { + return schema.Parse(data, version) + } else { + global.LOG.Errorf("don't support such schema version %s", version) } - return schema_v12.Parse(data) + + return &common.GpuInfo{}, nil } diff --git a/agent/utils/ai_tools/gpu/schema_v12/parser.go b/agent/utils/ai_tools/gpu/schema/parser.go similarity index 79% rename from agent/utils/ai_tools/gpu/schema_v12/parser.go rename to agent/utils/ai_tools/gpu/schema/parser.go index cc2c629fa..e0801ffff 100644 --- a/agent/utils/ai_tools/gpu/schema_v12/parser.go +++ b/agent/utils/ai_tools/gpu/schema/parser.go @@ -1,4 +1,4 @@ -package schema_v12 +package schema import ( "encoding/xml" @@ -6,7 +6,7 @@ import ( "github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/common" ) -func Parse(buf []byte) (*common.GpuInfo, error) { +func Parse(buf []byte, version string) (*common.GpuInfo, error) { var ( s smi info common.GpuInfo @@ -33,8 +33,13 @@ func Parse(buf []byte) (*common.GpuInfo, error) { gpuItem.Temperature = s.Gpu[i].Temperature.GpuTemp gpuItem.PerformanceState = s.Gpu[i].PerformanceState - gpuItem.PowerDraw = s.Gpu[i].GpuPowerReadings.PowerDraw - gpuItem.MaxPowerLimit = s.Gpu[i].GpuPowerReadings.MaxPowerLimit + if version == "v12" { + gpuItem.PowerDraw = s.Gpu[i].GpuPowerReadings.PowerDraw + gpuItem.MaxPowerLimit = s.Gpu[i].GpuPowerReadings.MaxPowerLimit + } else { + gpuItem.PowerDraw = s.Gpu[i].PowerReadings.PowerDraw + gpuItem.MaxPowerLimit = s.Gpu[i].PowerReadings.MaxPowerLimit + } gpuItem.MemUsed = s.Gpu[i].FbMemoryUsage.Used gpuItem.MemTotal = s.Gpu[i].FbMemoryUsage.Total gpuItem.GPUUtil = s.Gpu[i].Utilization.GpuUtil diff --git a/agent/utils/ai_tools/gpu/schema_v12/types.go b/agent/utils/ai_tools/gpu/schema/types.go similarity index 99% rename from agent/utils/ai_tools/gpu/schema_v12/types.go rename to agent/utils/ai_tools/gpu/schema/types.go index d878ca8ba..39328dd0c 100644 --- a/agent/utils/ai_tools/gpu/schema_v12/types.go +++ b/agent/utils/ai_tools/gpu/schema/types.go @@ -1,4 +1,4 @@ -package schema_v12 +package schema type smi struct { AttachedGpus string `xml:"attached_gpus"` diff --git a/agent/utils/cmd/cmd.go b/agent/utils/cmd/cmd.go index 8b604011a..506bfdf39 100644 --- a/agent/utils/cmd/cmd.go +++ b/agent/utils/cmd/cmd.go @@ -36,10 +36,12 @@ func handleErr(stdout, stderr bytes.Buffer, err error) (string, error) { } func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { + env := os.Environ() cmd := exec.Command("bash", "-c", cmdStr) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr + cmd.Env = env if err := cmd.Start(); err != nil { return "", err } @@ -62,6 +64,7 @@ func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { } func ExecWithLogFile(cmdStr string, timeout time.Duration, outputFile string) error { + env := os.Environ() cmd := exec.Command("bash", "-c", cmdStr) outFile, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, constant.DirPerm) @@ -72,6 +75,7 @@ func ExecWithLogFile(cmdStr string, timeout time.Duration, outputFile string) er cmd.Stdout = outFile cmd.Stderr = outFile + cmd.Env = env if err := cmd.Start(); err != nil { return err @@ -109,6 +113,7 @@ func ExecContainerScript(containerName, cmdStr string, timeout time.Duration) er } func ExecShell(outPath string, timeout time.Duration, name string, arg ...string) error { + env := os.Environ() file, err := os.OpenFile(outPath, os.O_WRONLY|os.O_CREATE, constant.FilePerm) if err != nil { return err @@ -118,6 +123,7 @@ func ExecShell(outPath string, timeout time.Duration, name string, arg ...string cmd := exec.Command(name, arg...) cmd.Stdout = file cmd.Stderr = file + cmd.Env = env if err := cmd.Start(); err != nil { return err } @@ -147,10 +153,12 @@ func (cw *CustomWriter) Write(p []byte) (n int, err error) { return len(p), nil } func ExecShellWithTask(taskItem *task.Task, timeout time.Duration, name string, arg ...string) error { + env := os.Environ() customWriter := &CustomWriter{taskItem: taskItem} cmd := exec.Command(name, arg...) cmd.Stdout = customWriter cmd.Stderr = customWriter + cmd.Env = env if err := cmd.Start(); err != nil { return err } @@ -172,10 +180,12 @@ func ExecShellWithTask(taskItem *task.Task, timeout time.Duration, name string, } func Execf(cmdStr string, a ...interface{}) (string, error) { + env := os.Environ() cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr + cmd.Env = env err := cmd.Run() if err != nil { return handleErr(stdout, stderr, err) @@ -184,10 +194,12 @@ func Execf(cmdStr string, a ...interface{}) (string, error) { } func ExecWithCheck(name string, a ...string) (string, error) { + env := os.Environ() cmd := exec.Command(name, a...) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr + cmd.Env = env err := cmd.Run() if err != nil { return handleErr(stdout, stderr, err) @@ -196,11 +208,13 @@ func ExecWithCheck(name string, a ...string) (string, error) { } func ExecScript(scriptPath, workDir string) (string, error) { + env := os.Environ() cmd := exec.Command("bash", scriptPath) var stdout, stderr bytes.Buffer cmd.Dir = workDir cmd.Stdout = &stdout cmd.Stderr = &stderr + cmd.Env = env if err := cmd.Start(); err != nil { return "", err } @@ -279,6 +293,7 @@ func Which(name string) bool { } func ExecShellWithTimeOut(cmdStr, workdir string, logger *log.Logger, timeout time.Duration) error { + env := os.Environ() ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -286,6 +301,7 @@ func ExecShellWithTimeOut(cmdStr, workdir string, logger *log.Logger, timeout ti cmd.Dir = workdir cmd.Stdout = logger.Writer() cmd.Stderr = logger.Writer() + cmd.Env = env if err := cmd.Start(); err != nil { return err } diff --git a/frontend/src/views/ai/gpu/index.vue b/frontend/src/views/ai/gpu/index.vue index 721965527..cabbcf677 100644 --- a/frontend/src/views/ai/gpu/index.vue +++ b/frontend/src/views/ai/gpu/index.vue @@ -329,7 +329,7 @@ const loadEcc = (val: string) => { if (val === 'Enabled') { return i18n.global.t('aiTools.gpu.enabled'); } - return val; + return val || 0; }; const loadProcessType = (val: string) => {