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
  • 프로젝트