IT/언어

[python] python을 이용해 GPU 사용률 등의 정보 얻기(nvidia-smi커맨드)

개발자 두더지 2021. 9. 24. 23:00
728x90

 linux의 경우 nvidia-smi 커맨드를 사용해서 바로 GPU 사용률 등에 대한 정보를 취득할 수 있으나, windows환경에서는 곤란할 때가 있다. windows환경 상에서 python 코드를 이용한 nividia-smi커맨드를 적용할 수 있는 방법을 알아보고자한다. 

 

 

python으로 nividia-smi의 정보를 얻을 수 있는 함수 만들기


import subprocess
import json

DEFAULT_ATTRIBUTES = (
    'index',
    'uuid',
    'name',
    'timestamp',
    'memory.total',
    'memory.free',
    'memory.used',
    'utilization.gpu',
    'utilization.memory'
)

def get_gpu_info(nvidia_smi_path='nvidia-smi', keys=DEFAULT_ATTRIBUTES, no_units=True):
    nu_opt = '' if not no_units else ',nounits'
    cmd = '%s --query-gpu=%s --format=csv,noheader%s' % (nvidia_smi_path, ','.join(keys), nu_opt)
    output = subprocess.check_output(cmd, shell=True)
    lines = output.decode().split('\n')
    lines = [ line.strip() for line in lines if line.strip() != '' ]

    return [ { k: v for k, v in zip(keys, line.split(', ')) } for line in lines ]


import pprint
pprint.pprint(get_gpu_info())

정의한 get_gpu_info 함수를 호출해서 GPU정보를 출력하면 된다.

  • 첫 번째 인수(nvidia_smi_path): nvidia-smi 커맨드의 경로를 절대 경로등으로 지정하고 싶은 경우 셋팅하길 바란다. 기본적으로는 "nvidia_smi"로 되어 있다.
  • 두 번째 인수(keys): 얻고 싶은 정보를 각 요소가 문자열의 list 혹은 tuple객체로 지정하길 바란다. 기본적으로는 코드 중 DEFAULT_ATTRIBUTES에 리스트된 내용으로 되어 있다.
  • 세 번째 인수(no_units) : 각 키의 값에 단위를 포함하고 싶은지 아닌지를 bool형식으로 셋팅하기 위한 요소이다. 디폴트는 True로 단위가 생략된다.
  • 반환값: GPU 유닛 갯수만큼의 dict 요소를 가진 list 객체, dict의 각 키는 세 번째 인수에서 지정한 것이다. 그리고 dict의 각 값은 바이트 문자열(index나 utilization.gpu를 수치로 다루고 싶은 경우는 int()함수를 사용하길 바란다)

추가적으로 nvidia-smi 커맨드와 관련된 옵션에 대해 간략히 메모해두고자 한다.

 

 

--query-gpu 옵션


 --query-gpu 옵션은 --format 옵션으로 지정했던 출력 스타일로 가공해서 출력해준다. 예를 들어 아래와 같은 정보를 지정하는 것이 가능하다.

  • index : 0부터 시작하는 하드웨어의 머신상의 번호, "0" 혹은 "1"
  • memory.free : 비어있는 GPU메모리, "5123MiB" 등
  • memory.used : 사용 GPU메모리, "3451MiB'등
  • memory.total : GPU에 탑재된 메모리, "8113 MiB"등
  • utilization.gpu : GPU사용률, "12%"등
  • utilization.memory : GPU 메모리 사용률, "49%"등
  • timestamp : nvidia-smi 커맨드가 실행된 시간, "2020/12/16 22:05:43.771"등
  • uuid : 글로벌, 유니크한 변화하지않는 ID. GPU에 붙어있는 번호와는 관계없는듯하다. "GPU-92275dc5-b7cc-1a5f-0348-f389e3040f2b"등

 그 외에 다양한 키가 있고, 그 키는 nvidia-smi --help-query-gpu로 확인할 수 있다.

 

 

--format 옵션


 --query-gpu로 지정한 정보를 CSV로 출력하기 위해 사용한다. --format=csv가 가장 심플한 호출 방법이지만, noheader와 nounits도 지정할 수 있다.

  • noheader : CSV의 가장 첫 번째 행으로써 헤더 행이 없어지게 된다.
  • nounits : 예를 들어 GPU 이용률(utlization.gpu)를 얻었을 때 "10%"로 할 것인지, "10"로 할 것인지 단위 표시여부를 지정한다.

 이러한 것을 조합해서 예를 들어 --format=csv,noheader 이나 --format=csv,noheader,nounits로 지정가능하다.


참고자료

https://qiita.com/tomotaka_ito/items/1da001c98b46ecf28ec7

728x90