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 開発者。
  • AI/ML クラスタを運用するオペレーターで、Go でカスタムのヘルスチェック、自動スケーラー、リソース割り当てサービスを構築したい人。
  • 特定の GPU にタスクをピン止めしたり、電力・温度メトリクスを取得したい Go ベースの推論またはトレーニングパイプラインを開発する人。

動作の概要(高レベル)

  1. 生成ステップ – リポジトリには NVIDIA のヘッダー nvml.hc-for-go の記述ファイル(nvml.yml)が同梱されています。c-for-go ツールを実行すると、C 関数と対応する低レベルの Go バインディングが自動生成されます。
  2. 動的ロード – 実行時、パッケージはホストシステムから libnvidia-ml.so をロードします(ドライバーがインストールされている必要があります)。また、バージョン付きシンボル(例:nvmlInit_v2)が存在するかを検出し、デフォルトの v1 シンボルを新しいものに置き換えます。
  3. 手書きラッパー – 自動生成されたバインディングは原始的な C API に非常に近く、直接使うには煩雑です。このプロジェクトでは、バッファの割り当て、エラー変換、Go スタイルの戻り値を処理する薄い手書きラッパー(例:Device.GetUUID()Device.GetAccountingPids())を追加しています。
  4. エラー処理 – 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 ドライバーがインストールされたマシンでこのコードを実行すると、README に示された通り、すべての GPU の UUID が表示されます。

ビルドとテストのワークフロー

  • c-for-go ツールをインストール(Makefile で特定バージョンを固定)。
  • make を実行 – これによりバインディングが再生成され、pkg/nvml にコピーされます。
  • make test を実行 – 初期化、ドライバー バージョンの照会、イベントセットの処理などをチェックする小さなテストスイートを実行します。実際の GPU ドライバーがなくても問題なく動作します。共有ライブラリがロード可能であれば十分です。

制限事項

  • Linux専用 – バインディングは libnvidia-ml.so に依存しており、これは Linux ドライバーのみに提供されます。
  • 実行時依存 – ドライバーがなくてもコードをコンパイルできますが、実行時にライブラリが見つからないとパニックになります。
  • テストカバレッジが限定的 – README にはテストスイートが最小限であり、拡張可能であると記載されています。

使わない方がよいケース

Python、C++、または NVIDIA の公式ツール(例:nvidia-smi)を使って GPU 対応ソフトウェアを開発している場合、この Go ラッパーは必要ありません。これは、NVML に直接、低遅延でアクセスしたい Go プロジェクト向けに特化しています。


上記のすべての詳細はリポジトリの README からそのまま引用したものであり、追加機能は推測されていません。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • Dispatch
  • プロジェクト