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


165

분산 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']가 필요합니다. 이것을 어떻게 구현할 수 있습니까?

답변:


245

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모든 메모리가 할당되지 않도록하십시오. 자세한 내용은 이 질문 을 참조하십시오.


12
추신 :이 방법이 이동 / 개조되면, 나는 꽤 많이 사용되고 있기 때문에 tensorflow / python / platform / test.py : is_gpu_available 내부를 볼 것입니다
Yaroslav Bulatov

1
장치의 여유 메모리와 총 메모리를 얻는 방법이 있습니까? 나는 DeviceAttributes에서 memory_limit를 필드가 있음을보고 나는 그것이 가능한 메모리 및 총 아니라고 생각
aarbelle

2
1 tensorflow 이전 버전의 경우 파이썬으로 가져올 때 gpus에 대한 정보를 인쇄한다는 것을 기억합니다. 최신 Tensorflow 버전에서 해당 메시지가 제거 되었습니까? (따라서 귀하의 제안은 GPU를 확인하는 유일한 방법입니다)?
Charlie Parker

@CharlieParker TF1.1을 시작할 때 GPU 장치 당 하나의 로그 라인을 인쇄한다고 생각합니다.
mrry

1
@aarbelle-위에서 언급 한 방법을 사용하여 모든 속성을 반환하려면을 Free memory사용하여 필드 가 포함됩니다 tensorflow1.1. python에서 : from tensorflow.python.client import device_lib,device_lib.list_local_devices()
n1k31t4

123

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

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbear는 기존 답변보다 정보가 매우 적기 때문에 @Kulbear.
Davidmh

3
단순성으로 인해이 답변을 선호합니다. 나는 bash에서 직접 사용하고 있습니다 :python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher

1
이 답변으로 시간을 절약 할 수 있다는 데 동의합니다. 더 긴 공식 답변을 읽지 않고 코드를 복사 / 붙여 넣었습니다. 세부 사항을 알고 코드 줄이 필요했습니다. 이미 답변으로 선정되지 않았으며 충분합니다. 공감할 필요가 없습니다.
Steven

1
오류가 발생cannot import name 'format_exc' from 'traceback'
Siddharth Das

43

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

tf.test.is_gpu_available()

그리고 / 또는

tf.test.gpu_device_name()

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


2
GPU 만 반환합니다.
Trisoloriansunscreen

@Tal은 1 개의 GPU를 사용할 수 있음을 의미합니다 (PCI 슬롯 ID 0에서). 그래서 tf.test.is_gpu_available()돌아올 것이다True
회개

4
OP는 사용 가능한 GPUS 목록을 반환하는 방법을 요청했습니다. 적어도 다중 GPU 설정에서 tf.test.gpu_device_name ()은 첫 번째 이름 만 반환합니다.
Trisoloriansunscreen

AttributeError : 'tensorflow'모듈에 'test'속성이 없습니다
Siddharth Das

27

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'해야했습니다 'XLA_GPU'.
Vivek Subramanian

19

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

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

import subprocess

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

8

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의 페이지는 많은 사람들이 알지 못하는 다른 흥미로운 정보를 제공합니다.


3

다음은 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


BASIC_GPU의 scaleTier를 사용할 때도 작동합니까? 이 코드를 실행하면 CPU 만
나옵니다

MiniQuark 중복 답변 (미만 세부 ..)
FluxLemur

1

NVIDIA GTX GeForce 1650 Ti내 컴퓨터에서 GPU를 호출 했습니다.tensorflow-gpu==2.2.0

다음 두 줄의 코드를 실행하십시오.

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

산출:

Num GPUs Available:  1

0

이 방법으로 모든 부품을 점검하십시오.

from __future__ import absolute_import, division, print_function, unicode_literals

import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_datasets as tfds


version = tf.__version__
executing_eagerly = tf.executing_eagerly()
hub_version = hub.__version__
available = tf.config.experimental.list_physical_devices("GPU")

print("Version: ", version)
print("Eager mode: ", executing_eagerly)
print("Hub Version: ", h_version)
print("GPU is", "available" if avai else "NOT AVAILABLE")

0

GPU 지원 시스템에 최신 TensorFlow 2.x GPU가 설치되어 있는지 확인 하고 다음 코드를 Python에서 실행하십시오.

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf 

print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

출력이 다음과 같이 나타납니다.

2020-02-07 10 : 45 : 37.587838 : I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc : 1006] SysFS에서 읽은 성공적인 NUMA 노드에 음수 값 (-1)이 있지만 하나 이상의 NUMA 노드가 있어야합니다. NUMA 노드 0 2020-02-07 10 : 45 : 37.588896 : I tensorflow / core / common_runtime / gpu / gpu_device.cc : 1746] 보이는 gpu 장치 추가 : 0, 1, 2, 3, 4, 5, 6, 7 Num 사용 가능한 GPU : 8


1
이 답변은 이미 게시되었습니다.
Björn Lindqvist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.