[python] tensorflow에서 현재 사용 가능한 GPU를 얻는 방법은 무엇입니까?

분산 TensorFlow를 사용할 계획이 있으며 TensorFlow가 훈련 및 테스트에 GPU를 사용할 수 있다는 것을 알았습니다. 클러스터 환경에서 각 머신은 0 또는 1 이상의 GPU를 가질 수 있으며 가능한 많은 머신에서 GPU로 TensorFlow 그래프를 실행하고 싶습니다.

tf.Session()TensorFlow를 실행할 때 아래와 같이 로그 메시지에서 GPU에 대한 정보를 제공 한다는 것을 알았습니다 .

I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)

내 질문은 TensorFlow에서 현재 사용 가능한 GPU에 대한 정보를 어떻게 얻습니까? 로그에서 GPU 정보를로드 할 수는 있지만보다 정교하고 프로그래밍 방식으로 수행하고 싶습니다. CUDA_VISIBLE_DEVICES 환경 변수를 사용하여 의도적으로 GPU를 제한 할 수도 있으므로 OS 커널에서 GPU 정보를 얻는 방법을 알고 싶지 않습니다.

요컨대, 기계에 두 개의 GPU가 있으면 tf.get_available_gpus()반환 되는 함수 ['/gpu:0', '/gpu:1']가 필요합니다. 이것을 어떻게 구현할 수 있습니까?



답변

device_lib.list_local_devices()로컬 프로세스에서 사용 가능한 장치를 나열 할 수 있는 문서화되지 않은 메소드 가 있습니다. ( NB 문서화되지 않은 메소드로서, 이전 버전과 호환되지 않는 변경 사항이 적용됩니다.) 함수는 DeviceAttributes프로토콜 버퍼 오브젝트 목록을 리턴 합니다. GPU 장치의 문자열 장치 이름 목록을 다음과 같이 추출 할 수 있습니다.

from tensorflow.python.client import device_lib

def get_available_gpus():
    local_device_protos = device_lib.list_local_devices()
    return [x.name for x in local_device_protos if x.device_type == 'GPU']

(최소한 TensorFlow 1.4 이상) 호출 device_lib.list_local_devices()하면 기본적으로 모든 장치에 모든 GPU 메모리를 할당하는 초기화 코드가 실행됩니다 ( GitHub 문제 ). 이를 피하려면 먼저 명시 적으로 작은 세션을 작성 per_process_gpu_fraction하거나 allow_growth=True모든 메모리가 할당되지 않도록하십시오. 자세한 내용은 이 질문 을 참조하십시오.


답변

다음 코드를 사용하여 모든 장치 목록을 확인할 수 있습니다.

from tensorflow.python.client import device_lib

device_lib.list_local_devices()


답변

테스트 유틸리티 에는 메소드도 있습니다 . 따라서해야 할 일은 다음과 같습니다.

tf.test.is_gpu_available()

그리고 / 또는

tf.test.gpu_device_name()

인수에 대해서는 Tensorflow 문서를 찾으십시오.


답변

TensorFlow 2.0에서는 다음을 사용할 수 있습니다 tf.config.experimental.list_physical_devices('GPU').

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    print("Name:", gpu.name, "  Type:", gpu.device_type)

두 개의 GPU가 설치되어 있으면 다음을 출력합니다.

Name: /physical_device:GPU:0   Type: GPU
Name: /physical_device:GPU:1   Type: GPU

2.1에서 다음을 삭제할 수 있습니다 experimental.

gpus = tf.config.list_physical_devices('GPU')

보다:


답변

허용 대답은 당신에게 GPU의 수를 제공뿐만 아니라 그 GPU에서 모든 메모리를 할당합니다. device_lib.list_local_devices ()를 호출하기 전에 일부 응용 프로그램에서 원하지 않을 수있는 고정 된 하위 메모리로 세션을 작성하면이를 피할 수 있습니다.

나는 nvidia-smi를 사용하여 메모리를 할당하지 않고 GPU 수를 얻었습니다.

import subprocess

n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')


답변

Mrry가 사용을 제안한 탁월한 설명 외에도 device_lib.list_local_devices()명령 줄에서 GPU 관련 정보를 확인하는 방법을 보여줄 수 있습니다.

현재 Nvidia의 gpus 만 NN 프레임 워크에서 작동하기 때문에 이에 대한 답변 만 제공됩니다. Nvidia에는 / proc 파일 시스템 인터페이스를 사용하여 드라이버, 설치된 NVIDIA 그래픽 카드 및 AGP 상태에 대한 런타임 정보를 얻는 방법을 설명하는 페이지 가 있습니다.

/proc/driver/nvidia/gpus/0..N/information

설치된 각 NVIDIA 그래픽 어댑터 (모델 이름, IRQ, BIOS 버전, 버스 유형)에 대한 정보를 제공하십시오. BIOS 버전은 X가 실행 중일 때만 사용할 수 있습니다.

따라서 명령 줄에서이를 실행 cat /proc/driver/nvidia/gpus/0/information하고 첫 번째 GPU에 대한 정보를 볼 수 있습니다 . 파이썬에서 이것을 쉽게 실행할 수 있으며 실패 할 때까지 두 번째, 세 번째, 네 번째 GPU를 확인할 수 있습니다.

확실히 Mrry의 대답은 더 강력하고 내 대답이 Linux 이외의 시스템에서 작동하는지 확실하지 않지만 Nvidia의 페이지는 많은 사람들이 알지 못하는 다른 흥미로운 정보를 제공합니다.


답변

다음은 tensorflow 2에서 작동합니다.

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    print("Name:", gpu.name, "  Type:", gpu.device_type)

2.1에서 다음을 삭제할 수 있습니다 experimental.

    gpus = tf.config.list_physical_devices('GPU')

https://www.tensorflow.org/api_docs/python/tf/config/list_physical_devices