NVIDIA/go-nvml
Go Bindings for the NVIDIA Management Library (NVML)
項目簡介
NVIDIA/go-nvml 是 NVIDIA 的 NVML(NVIDIA Management Library)的 Go 語言封裝。NVML 是一個位於驅動提供之共享函式庫 libnvidia-ml.so 中的 C API,可讓程式查詢與控制 NVIDIA GPU(溫度、使用率、電力限制、UUID 等)。本倉儲並未重新實作 NVML;它僅透過 cgo 和少量手寫「包裝器」程式碼,將現有的 C 函數暴露給 Go 程式碼,使 API 更符合 Go 的慣用風格。
適用對象
- 需要查看 Linux 主機上有哪些 GPU 的監控、編排或排程工具的 Go 開發者。
- 希望以 Go 編寫自訂健康檢查、自動擴縮器或資源分配服務的 AI/ML 集群運維人員。
- 需要將工作綁定至特定 GPU 或讀取功耗/溫度指標的 Go 基礎推理或訓練流程開發者。
工作原理(高階)
- 生成步驟 – 倉儲包含 NVIDIA 的標頭
nvml.h和一個c-for-go描述檔案(nvml.yml)。執行c-for-go工具會自動產生與每個 C 函數對應的低階 Go 綁定。 - 動態載入 – 執行時,該套件會從主機系統載入
libnvidia-ml.so(必須安裝驅動)。它也會偵測哪些版本化符號(例如nvmlInit_v2)存在,並將預設的 v1 符號替換為較新的版本。 - 手寫包裝器 – 自動產生的綁定非常接近原始 C API,直接使用相當繁瑣。本專案新增一層薄的、手寫的包裝器(例如
Device.GetUUID()、Device.GetAccountingPids()),用於處理緩衝區配置、錯誤轉換和 Go 風格的回傳值。 - 錯誤處理 – NVML 回傳碼被封裝為 Go 的
error類型,呼叫者可使用熟悉的if err != nil模式。
快速範例(來自 README)
import (
"fmt"
"log"
"github.com/NVIDIA/go-nvml/pkg/nvml"
)
func main() {
if ret := nvml.Init(); ret != nvml.SUCCESS {
log.Fatalf("NVML init failed: %v", nvml.ErrorString(ret))
}
defer nvml.Shutdown()
count, _ := nvml.DeviceGetCount()
for i := 0; i < count; i++ {
dev, _ := nvml.DeviceGetHandleByIndex(i)
uuid, _ := dev.GetUUID()
fmt.Println(uuid)
}
}
在安裝了 NVIDIA 驅動的機器上執行此程式碼,將印出每個 GPU 的 UUID,與 README 中所示完全一致。
建構與測試工作流程
- 安裝
c-for-go工具(Makefile 固定特定版本)。 - 執行
make– 這將重新產生綁定並複製到pkg/nvml。 - 執行
make test– 執行一個小的測試套件,檢查初始化、驅動版本查詢、事件集處理等。即使沒有實際 GPU 驅動,測試也能正常運行;只需共享函式庫可載入即可。
限制
- 僅限 Linux – 綁定依賴於
libnvidia-ml.so,該檔案僅在 Linux 驅動中提供。 - 執行時依賴 – 你可以在沒有驅動的情況下編譯程式碼,但呼叫任何函數時,若執行時找不到該函式庫,將會引發 panic。
- 測試覆蓋率稀疏 – README 指出測試套件目前較小,可進一步擴充。
無需使用的情況
如果你使用 Python、C++ 或 NVIDIA 自帶工具(例如 nvidia-smi)開發 GPU 友好型軟體,則不需要此 Go 包裝器。它專門用於希望直接、低開銷存取 NVML 的 Go 專案。
以上所有細節均直接取自倉儲的 README;未推斷任何額外功能。
相關
- 專案
- 專案
- 專案
- Dispatch
- 專案