Golang实时获取GPU使用率的实现方法

在Golang中想要实时获取GPU使用率,有什么可靠的实现方法吗?目前查到的资料大多是Python或C++的方案,不太清楚Go语言是否有成熟的库可以直接调用,或者需要自己通过CGO封装底层API?如果能提供具体的代码示例就更好了,主要是想监控NVIDIA显卡的使用情况。

2 回复

在Golang中实时获取GPU使用率,可以通过以下方法实现:

  1. 调用NVIDIA管理库(NVML)

    • 使用go-nvml库(github.com/NVIDIA/go-nvml)
    • 初始化NVML后调用DeviceGetUtilizationRates获取GPU利用率
    • 示例代码:
      nvml.Init()
      defer nvml.Shutdown()
      handle, _ := nvml.DeviceGetHandleByIndex(0)
      utilization, _ := handle.GetUtilizationRates()
      fmt.Printf("GPU使用率: %d%%\n", utilization.Gpu)
      
  2. 执行系统命令

    • 调用nvidia-smi命令解析输出:
      cmd := exec.Command("nvidia-smi", "--query-gpu=utilization.gpu", "--format=csv,noheader,nounits")
      output, _ := cmd.Output()
      // 解析字符串输出为数字
      
  3. 注意事项

    • 需提前安装NVIDIA驱动和CUDA工具包
    • 注意错误处理和资源释放
    • 循环获取时可配合time.Sleep实现定时采样

推荐优先使用NVML库,性能更好且无需解析文本。

更多关于Golang实时获取GPU使用率的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中实时获取GPU使用率,可以通过以下几种方法实现:

方法一:使用NVIDIA DCGM库(推荐)

package main

import (
    "fmt"
    "time"
    "github.com/NVIDIA/go-dcgm/pkg/dcgm"
)

func main() {
    // 初始化DCGM
    cleanup, err := dcgm.Init(dcgm.Standalone, "0.0.0.0:5555", "localhost")
    if err != nil {
        panic(err)
    }
    defer cleanup()

    // 获取GPU列表
    gpus, err := dcgm.GetAllDevices()
    if err != nil {
        panic(err)
    }

    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()

    for range ticker.C {
        for _, gpu := range gpus {
            // 获取GPU利用率
            utilization, err := dcgm.GetLatestValueForField(gpu, dcgm.DCGM_FI_DEV_GPU_UTIL)
            if err != nil {
                fmt.Printf("Error getting GPU %d utilization: %v\n", gpu, err)
                continue
            }
            fmt.Printf("GPU %d: %.1f%%\n", gpu, utilization.Float64())
        }
        fmt.Println("---")
    }
}

方法二:通过nvidia-smi命令解析

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "os/exec"
    "time"
)

type GPUInfo struct {
    Utilization struct {
        GPUUtil string `json:"gpu_util"`
    } `json:"utilization"`
}

func getGPUUsage() (map[int]float64, error) {
    cmd := exec.Command("nvidia-smi", "--query-gpu=index,utilization.gpu", "--format=csv,noheader,nounits")
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        return nil, err
    }

    result := make(map[int]float64)
    lines := bytes.Split(out.Bytes(), []byte("\n"))
    for _, line := range lines {
        if len(line) == 0 {
            continue
        }
        var gpuIndex int
        var utilization float64
        _, err := fmt.Sscanf(string(line), "%d, %f", &gpuIndex, &utilization)
        if err == nil {
            result[gpuIndex] = utilization
        }
    }
    return result, nil
}

func main() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()

    for range ticker.C {
        usage, err := getGPUUsage()
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }

        for gpu, util := range usage {
            fmt.Printf("GPU %d: %.1f%%\n", gpu, util)
        }
        fmt.Println("---")
    }
}

安装依赖

对于方法一,需要安装DCGM库:

go mod init gpu-monitor
go get github.com/NVIDIA/go-dcgm/pkg/dcgm

对于方法二,需要确保系统已安装nvidia-smi工具。

推荐方案

  • 生产环境:推荐使用DCGM方法,性能更好且更稳定
  • 简单场景:使用nvidia-smi解析方法,部署更简单

两种方法都能实现实时监控GPU使用率,选择哪种取决于具体需求和环境配置。

回到顶部