1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-01 03:24:14 +08:00

feat: Support gpu of schema v11 (#7987)

This commit is contained in:
ssongliu 2025-02-25 14:16:22 +08:00 committed by GitHub
parent ec746c021a
commit 79b8d17887
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 36 additions and 12 deletions

View File

@ -12,7 +12,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/global" "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/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" "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) return nil, fmt.Errorf("calling nvidia-smi failed, err: %w", err)
} }
data := []byte(itemData) data := []byte(itemData)
schema := "v11" version := "v11"
buf := bytes.NewBuffer(data) buf := bytes.NewBuffer(data)
decoder := xml.NewDecoder(buf) decoder := xml.NewDecoder(buf)
@ -51,15 +51,18 @@ func (n NvidiaSMI) LoadGpuInfo() (*common.GpuInfo, error) {
parts := strings.Split(directive, " ") parts := strings.Split(directive, " ")
s := strings.Trim(parts[len(parts)-1], "\" ") s := strings.Trim(parts[len(parts)-1], "\" ")
if strings.HasPrefix(s, "nvsmi_device_") && strings.HasSuffix(s, ".dtd") { 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 { } else {
global.LOG.Debugf("Cannot find schema version in %q", directive) global.LOG.Debugf("Cannot find schema version in %q", directive)
} }
break break
} }
if schema != "v12" { if version == "v12" || version == "v11" {
return &common.GpuInfo{}, nil 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
} }

View File

@ -1,4 +1,4 @@
package schema_v12 package schema
import ( import (
"encoding/xml" "encoding/xml"
@ -6,7 +6,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/common" "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 ( var (
s smi s smi
info common.GpuInfo info common.GpuInfo
@ -33,8 +33,13 @@ func Parse(buf []byte) (*common.GpuInfo, error) {
gpuItem.Temperature = s.Gpu[i].Temperature.GpuTemp gpuItem.Temperature = s.Gpu[i].Temperature.GpuTemp
gpuItem.PerformanceState = s.Gpu[i].PerformanceState gpuItem.PerformanceState = s.Gpu[i].PerformanceState
gpuItem.PowerDraw = s.Gpu[i].GpuPowerReadings.PowerDraw if version == "v12" {
gpuItem.MaxPowerLimit = s.Gpu[i].GpuPowerReadings.MaxPowerLimit 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.MemUsed = s.Gpu[i].FbMemoryUsage.Used
gpuItem.MemTotal = s.Gpu[i].FbMemoryUsage.Total gpuItem.MemTotal = s.Gpu[i].FbMemoryUsage.Total
gpuItem.GPUUtil = s.Gpu[i].Utilization.GpuUtil gpuItem.GPUUtil = s.Gpu[i].Utilization.GpuUtil

View File

@ -1,4 +1,4 @@
package schema_v12 package schema
type smi struct { type smi struct {
AttachedGpus string `xml:"attached_gpus"` AttachedGpus string `xml:"attached_gpus"`

View File

@ -36,10 +36,12 @@ func handleErr(stdout, stderr bytes.Buffer, err error) (string, error) {
} }
func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) {
env := os.Environ()
cmd := exec.Command("bash", "-c", cmdStr) cmd := exec.Command("bash", "-c", cmdStr)
var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout cmd.Stdout = &stdout
cmd.Stderr = &stderr cmd.Stderr = &stderr
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return "", err 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 { func ExecWithLogFile(cmdStr string, timeout time.Duration, outputFile string) error {
env := os.Environ()
cmd := exec.Command("bash", "-c", cmdStr) cmd := exec.Command("bash", "-c", cmdStr)
outFile, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, constant.DirPerm) 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.Stdout = outFile
cmd.Stderr = outFile cmd.Stderr = outFile
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return err 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 { 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) file, err := os.OpenFile(outPath, os.O_WRONLY|os.O_CREATE, constant.FilePerm)
if err != nil { if err != nil {
return err return err
@ -118,6 +123,7 @@ func ExecShell(outPath string, timeout time.Duration, name string, arg ...string
cmd := exec.Command(name, arg...) cmd := exec.Command(name, arg...)
cmd.Stdout = file cmd.Stdout = file
cmd.Stderr = file cmd.Stderr = file
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return err return err
} }
@ -147,10 +153,12 @@ func (cw *CustomWriter) Write(p []byte) (n int, err error) {
return len(p), nil return len(p), nil
} }
func ExecShellWithTask(taskItem *task.Task, timeout time.Duration, name string, arg ...string) error { func ExecShellWithTask(taskItem *task.Task, timeout time.Duration, name string, arg ...string) error {
env := os.Environ()
customWriter := &CustomWriter{taskItem: taskItem} customWriter := &CustomWriter{taskItem: taskItem}
cmd := exec.Command(name, arg...) cmd := exec.Command(name, arg...)
cmd.Stdout = customWriter cmd.Stdout = customWriter
cmd.Stderr = customWriter cmd.Stderr = customWriter
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return err return err
} }
@ -172,10 +180,12 @@ func ExecShellWithTask(taskItem *task.Task, timeout time.Duration, name string,
} }
func Execf(cmdStr string, a ...interface{}) (string, error) { func Execf(cmdStr string, a ...interface{}) (string, error) {
env := os.Environ()
cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...))
var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout cmd.Stdout = &stdout
cmd.Stderr = &stderr cmd.Stderr = &stderr
cmd.Env = env
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return handleErr(stdout, stderr, err) 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) { func ExecWithCheck(name string, a ...string) (string, error) {
env := os.Environ()
cmd := exec.Command(name, a...) cmd := exec.Command(name, a...)
var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout cmd.Stdout = &stdout
cmd.Stderr = &stderr cmd.Stderr = &stderr
cmd.Env = env
err := cmd.Run() err := cmd.Run()
if err != nil { if err != nil {
return handleErr(stdout, stderr, err) return handleErr(stdout, stderr, err)
@ -196,11 +208,13 @@ func ExecWithCheck(name string, a ...string) (string, error) {
} }
func ExecScript(scriptPath, workDir string) (string, error) { func ExecScript(scriptPath, workDir string) (string, error) {
env := os.Environ()
cmd := exec.Command("bash", scriptPath) cmd := exec.Command("bash", scriptPath)
var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
cmd.Dir = workDir cmd.Dir = workDir
cmd.Stdout = &stdout cmd.Stdout = &stdout
cmd.Stderr = &stderr cmd.Stderr = &stderr
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return "", err return "", err
} }
@ -279,6 +293,7 @@ func Which(name string) bool {
} }
func ExecShellWithTimeOut(cmdStr, workdir string, logger *log.Logger, timeout time.Duration) error { func ExecShellWithTimeOut(cmdStr, workdir string, logger *log.Logger, timeout time.Duration) error {
env := os.Environ()
ctx, cancel := context.WithTimeout(context.Background(), timeout) ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel() defer cancel()
@ -286,6 +301,7 @@ func ExecShellWithTimeOut(cmdStr, workdir string, logger *log.Logger, timeout ti
cmd.Dir = workdir cmd.Dir = workdir
cmd.Stdout = logger.Writer() cmd.Stdout = logger.Writer()
cmd.Stderr = logger.Writer() cmd.Stderr = logger.Writer()
cmd.Env = env
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return err return err
} }

View File

@ -329,7 +329,7 @@ const loadEcc = (val: string) => {
if (val === 'Enabled') { if (val === 'Enabled') {
return i18n.global.t('aiTools.gpu.enabled'); return i18n.global.t('aiTools.gpu.enabled');
} }
return val; return val || 0;
}; };
const loadProcessType = (val: string) => { const loadProcessType = (val: string) => {