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