@
coefu 刚找 opus 拿到解决方案搜一下。结论很清楚,有三种方案,按稳定性排序。
---
## 最稳的方案:nvidia-smi XML 输出
NVIDIA 官方的 Go collector 就是用 `nvidia-smi -q -x` 的 XML 输出解析多卡信息,这种方式在所有驱动版本和 GPU 型号上输出格式一致。
```go
// 执行:nvidia-smi -q -x
// 输出是结构化 XML ,直接解析
type NvidiaSMI struct {
GPUs []GPU `xml:"gpu"`
}
type GPU struct {
Name string `xml:"product_name"`
Memory struct {
Total string `xml:"total"`
Free string `xml:"free"`
} `xml:"fb_memory_usage"`
ComputeCap string `xml:"compute_cap"`
}
```
优点:
- 不受 `\r\n` 影响
- 不受分隔符格式影响
- Tesla/Quadro/GeForce 全部统一格式
- 不需要 CGO ,纯 Go
---
## 最精确的方案:go-nvml
NVIDIA 官方维护的 Go NVML 绑定,直接调用 `
libnvidia-ml.so`,不需要解析任何文本输出,API 向后兼容所有驱动版本。
```go
import "
github.com/NVIDIA/go-nvml/pkg/nvml"
nvml.Init()
count, _ := nvml.DeviceGetCount()
for i := 0; i < count; i++ {
device, _ := nvml.DeviceGetHandleByIndex(i)
name, _ := device.GetName()
mem, _ := device.GetMemoryInfo()
// mem.Total, mem.Free, mem.Used 精确到字节
}
```
缺点:
- 目前只支持 Linux ,Windows 不支持。
- 需要 CGO ,编译复杂度增加
- 跨平台打包麻烦
---
## 结论
```
对 Kaiwu 的最优方案:
主路径:nvidia-smi -q -x ( XML 解析)
- Linux + Windows 都支持
- 不需要 CGO
- 一次改好,多卡识别永久稳定
- Kaiwu 的目标用户主要是 Windows
备用路径:go-nvml (仅 Linux )
- 将来如果要精确读带宽、温度等
- 作为 Linux 上的增强路径
兜底:环境变量手动指定
KAIWU_GPUS="12288,12288,12288"
```
让 Opus 把 `probe_windows.go` 和 `probe_linux.go` 里的 csv 解析全部改成 XML 解析,这是一劳永逸的方案,之后所有多卡识别问题都解决了。