Làm thế nào để có được GPU hiện có trong dòng chảy?


165

Tôi có một kế hoạch sử dụng TensorFlow phân tán và tôi thấy TensorFlow có thể sử dụng GPU để đào tạo và thử nghiệm. Trong môi trường cụm, mỗi máy có thể có 0 hoặc 1 GPU trở lên và tôi muốn chạy đồ thị TensorFlow của mình thành GPU trên càng nhiều máy càng tốt.

Tôi thấy rằng khi chạy tf.Session()TensorFlow cung cấp thông tin về GPU trong các thông điệp tường trình như bên dưới:

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)

Câu hỏi của tôi là làm thế nào để tôi có được thông tin về GPU hiện có từ TensorFlow? Tôi có thể tải thông tin GPU từ nhật ký, nhưng tôi muốn thực hiện theo cách lập trình, tinh vi hơn. Tôi cũng có thể hạn chế GPU cố ý sử dụng biến môi trường CUDA_VISIBLE_DEVICE, vì vậy tôi không muốn biết cách lấy thông tin GPU từ nhân hệ điều hành.

Nói tóm lại, tôi muốn một chức năng như thế tf.get_available_gpus()sẽ trở lại ['/gpu:0', '/gpu:1']nếu có hai GPU có sẵn trong máy. Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


244

Có một phương pháp không có giấy tờ được gọi là device_lib.list_local_devices()cho phép bạn liệt kê các thiết bị có sẵn trong quy trình cục bộ. ( NB Là một phương thức không có tài liệu, điều này có thể thay đổi ngược không tương thích.) Hàm trả về một danh sách các đối tượng DeviceAttributesbộ đệm giao thức . Bạn có thể trích xuất danh sách tên thiết bị chuỗi cho các thiết bị GPU như sau:

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']

Lưu ý rằng (ít nhất lên đến TensorFlow 1.4), việc gọi device_lib.list_local_devices()sẽ chạy một số mã khởi tạo, theo mặc định, sẽ phân bổ tất cả bộ nhớ GPU trên tất cả các thiết bị ( vấn đề GitHub ). Để tránh điều này, trước tiên hãy tạo một phiên có quy mô nhỏ rõ ràng per_process_gpu_fractionhoặc allow_growth=Trueđể ngăn tất cả bộ nhớ được phân bổ. Xem câu hỏi này để biết thêm chi tiết.


12
PS, nếu phương thức này đã từng được di chuyển / đổi tên, tôi sẽ xem xét bên trong tenorflow / python / platform / test.py: is_gpu_av Available vì nó được sử dụng khá nhiều
Yaroslav Bulatov

1
Có cách nào để có được các thiết bị Miễn phí và Tổng bộ nhớ không? Tôi thấy rằng có một trường memory_limit trong DeviceAttribution và tôi nghĩ đó là bộ nhớ trống và không phải là toàn bộ
aarbelle

2
Tôi nhớ rằng đối với các phiên bản cũ hơn 1 tenorflow sẽ in một số thông tin về gpus khi nó được nhập vào python. Những tin nhắn đó đã bị xóa trong các phiên bản mới hơn? (do đó đề xuất của bạn là cách duy nhất để kiểm tra công cụ gpu)?
Charlie Parker

@CharlieParker Tôi tin rằng chúng tôi vẫn in một dòng nhật ký cho mỗi thiết bị GPU khi khởi động trong TF1.1.
mrry

1
@aarbelle - sử dụng phương thức được đề cập ở trên để trả về tất cả các thuộc tính bao gồm một trường Free memorycho tôi, sử dụng tensorflow1.1. Trong python : from tensorflow.python.client import device_lib, sau đódevice_lib.list_local_devices()
n1k31t4

123

Bạn có thể kiểm tra tất cả danh sách thiết bị bằng mã sau:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbear vì nó chứa ít thông tin hơn câu trả lời hiện có.
Davidmh

3
Vẫn thích câu trả lời này do tính đơn giản của nó. Tôi đang sử dụng nó trực tiếp từ bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher

1
Tôi đồng ý, câu trả lời này giúp tôi tiết kiệm thời gian. Tôi chỉ cần sao chép / dán mã mà không cần phải đọc câu trả lời chính thức dài hơn. Tôi biết các chi tiết, chỉ cần dòng mã. Nó đã không được chọn là câu trả lời và thế là đủ. Không cần downvote.
Steven

1
gặp lỗicannot import name 'format_exc' from 'traceback'
Siddharth Das

43

Ngoài ra còn có một phương pháp trong việc sử dụng thử nghiệm . Vì vậy, tất cả những gì phải được thực hiện là:

tf.test.is_gpu_available()

và / hoặc

tf.test.gpu_device_name()

Tra cứu các tài liệu Tensorflow cho các đối số.


2
Điều này chỉ trả về GPU: 0
Trisoloriansunscreen 13/07/18

@Tal có nghĩa là bạn có sẵn 1 GPU (tại khe cắm PCI ID 0). Vì vậy, tf.test.is_gpu_available()sẽ trở lạiTrue
repoleved

4
OP đã yêu cầu một phương thức trả về danh sách GPUS có sẵn. Ít nhất là trong thiết lập đa GPU của tôi, tf.test.gpu_device_name () chỉ trả về tên của cái đầu tiên.
Trisoloriansunscreen

AttributionError: mô-đun 'tenorflow' không có thuộc tính 'test'
Siddharth Das

27

Trong TensorFlow 2.0, bạn có thể sử dụng 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)

Nếu bạn đã cài đặt hai GPU, nó sẽ xuất ra điều này:

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

Từ 2.1, bạn có thể bỏ experimental:

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

Xem:


Bộ chỉ huy làm việc tuyệt vời. Tôi đã phải thay đổi 'GPU'để 'XLA_GPU'.
Subramanian Vivek

19

Các câu trả lời được chấp nhận cung cấp cho bạn số lượng GPU nhưng nó cũng phân bổ tất cả các bộ nhớ trên những GPU. Bạn có thể tránh điều này bằng cách tạo một phiên có bộ nhớ thấp hơn cố định trước khi gọi device_lib.list_local_devices () có thể không mong muốn đối với một số ứng dụng.

Cuối cùng tôi đã sử dụng nvidia-smi để lấy số lượng GPU mà không phân bổ bất kỳ bộ nhớ nào trên chúng.

import subprocess

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

8

Ngoài lời giải thích tuyệt vời của Mrry, nơi ông đề nghị sử dụng device_lib.list_local_devices() tôi có thể chỉ cho bạn cách bạn có thể kiểm tra thông tin liên quan đến GPU từ dòng lệnh.

Bởi vì hiện tại chỉ có gpus của Nvidia hoạt động cho các khung NN, nên câu trả lời chỉ bao gồm chúng. Nvidia có một trang nơi họ ghi lại cách bạn có thể sử dụng giao diện hệ thống tập tin / Proc để có được thông tin về thời gian chạy về trình điều khiển, mọi thẻ đồ họa NVIDIA đã cài đặt và trạng thái AGP.

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

Cung cấp thông tin về từng bộ điều hợp đồ họa NVIDIA đã cài đặt (tên model, IRQ, phiên bản BIOS, Loại xe buýt). Lưu ý rằng phiên bản BIOS chỉ khả dụng khi X đang chạy.

Vì vậy, bạn có thể chạy nó từ dòng lệnh cat /proc/driver/nvidia/gpus/0/informationvà xem thông tin về GPU đầu tiên của bạn. Nó dễ dàng để chạy nó từ python và bạn cũng có thể kiểm tra GPU thứ hai, thứ ba, thứ tư cho đến khi nó bị lỗi.

Chắc chắn câu trả lời của Mrry mạnh mẽ hơn và tôi không chắc câu trả lời của mình có hoạt động trên máy không linux hay không, nhưng trang của Nvidia cung cấp thông tin thú vị khác, điều mà không nhiều người biết đến.


3

Các hoạt động sau đây trong tenorflow 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)

Từ 2.1, bạn có thể bỏ experimental:

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

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


Điều này có hoạt động khi tôi sử dụng scaleTier của BASIC_GPU không. Khi tôi chạy mã này, nó chỉ cho tôi các CPU
shivas

Câu trả lời trùng lặp của MiniQuark (nhưng với ít chi tiết hơn ..)
FluxLemur

1

Tôi có một GPU được gọi NVIDIA GTX GeForce 1650 Titrong máy của tôi vớitensorflow-gpu==2.2.0

Chạy hai dòng mã sau:

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

Đầu ra:

Num GPUs Available:  1

0

Sử dụng cách này và kiểm tra tất cả các phần:

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

Đảm bảo bạn đã cài đặt GPU TensorFlow 2.x mới nhất trong máy hỗ trợ GPU của mình, Thực thi mã sau trong 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')))

Sẽ nhận được một đầu ra trông như,

2020/02/07 10: 45: 37.587838: Tôi tenorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] Nút NUMA thành công được đọc từ SysFS có giá trị âm (-1), nhưng phải có ít nhất một nút NUMA, vì vậy phải có ít nhất một nút NUMA Nút NUMA zero 2020/02/07 10: 45: 37.588896: Tôi tenorflow / core / common_r nb / gpu / gpu_device.cc: 1746] Thêm các thiết bị gpu hiển thị: 0, 1, 2, 3, 4, 5, 6, 7 Num GPU có sẵn: 8


1
Câu trả lời này đã được đăng.
Bjorn Lindqvist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.