วิธีรับ GPU ที่มีอยู่ในปัจจุบันในเทนเซอร์กระแส?


165

ฉันมีแผนที่จะใช้ TensorFlow แบบกระจายและฉันเห็น TensorFlow สามารถใช้ GPU สำหรับการฝึกอบรมและการทดสอบ ในสภาพแวดล้อมแบบคลัสเตอร์เครื่องแต่ละเครื่องสามารถมี 0 หรือ 1 หรือมากกว่า GPU และฉันต้องการที่จะเรียกใช้กราฟ TensorFlow ของฉันลงใน GPU บนเครื่องให้ได้มากที่สุด

ฉันพบว่าเมื่อใช้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)

คำถามของฉันคือฉันจะรับข้อมูลเกี่ยวกับ GPU ที่มีอยู่ในปัจจุบันจาก TensorFlow ได้อย่างไร ฉันสามารถรับข้อมูล GPU ที่โหลดจากบันทึก แต่ฉันต้องการที่จะทำในทางที่ซับซ้อนมากขึ้นทางโปรแกรม ฉันยังสามารถ จำกัด GPU โดยเจตนาใช้ตัวแปรสภาพแวดล้อม CUDA_VISIBLE_DEVICES ดังนั้นฉันจึงไม่ต้องการทราบวิธีรับข้อมูล GPU จากเคอร์เนลระบบปฏิบัติการ

กล่าวโดยย่อฉันต้องการฟังก์ชั่นเช่นนี้tf.get_available_gpus()ซึ่งจะส่งคืน['/gpu:0', '/gpu:1']หากมีสอง GPUs อยู่ในเครื่อง ฉันจะใช้สิ่งนี้ได้อย่างไร

คำตอบ:


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
มีวิธีรับอุปกรณ์ฟรีและหน่วยความจำทั้งหมดหรือไม่ ฉันเห็นว่ามีช่อง memory_limit ใน DeviceAttributes และฉันคิดว่ามันเป็นหน่วยความจำฟรีและไม่รวม
aarbelle

2
ฉันจำได้ว่าสำหรับรุ่นก่อนหน้านี้มากกว่า 1 tensorflow จะพิมพ์ข้อมูลเกี่ยวกับ gpus เมื่อมันถูกนำเข้าในไพ ธ อน มีข้อความเหล่านั้นที่ถูกลบในเวอร์ชัน tensorflow ที่ใหม่กว่าหรือไม่? (ดังนั้นข้อเสนอแนะของคุณเป็นวิธีเดียวที่จะตรวจสอบสิ่งที่ GPU)?
Charlie Parker

@CharlieParker ฉันเชื่อว่าเรายังคงพิมพ์บรรทัดบันทึกหนึ่งรายการต่ออุปกรณ์ GPU เมื่อเริ่มต้นใน TF1.1
mrry

1
@aarbelle - ใช้วิธีการดังกล่าวข้างต้นจะกลับคุณลักษณะทั้งหมดรวมถึงสนามสำหรับฉันใช้Free memory tensorflow1.1ในหลาม: 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 เพราะมีข้อมูลน้อยกว่าคำตอบที่มีอยู่อย่างเคร่งครัด
Davidmh

3
ยังคงต้องการคำตอบนี้เนื่องจากความเรียบง่าย ฉันใช้มันโดยตรงจาก bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher

1
ฉันเห็นด้วยคำตอบนี้ช่วยฉันประหยัดเวลา ฉันเพิ่งคัดลอก / วางโค้ดโดยไม่ต้องอ่านคำตอบที่เป็นทางการอีกต่อไป ฉันรู้รายละเอียดแค่ต้องการบรรทัดของโค้ด มันไม่ได้ถูกเลือกเป็นคำตอบและเพียงพอแล้ว ไม่จำเป็นต้องลงคะแนน
สตีเวน

1
ได้รับข้อผิดพลาดcannot import name 'format_exc' from 'traceback'
Siddharth Das

43

นอกจากนี้ยังมีวิธีในการทดสอบการใช้ ดังนั้นสิ่งที่ต้องทำคือ:

tf.test.is_gpu_available()

และ / หรือ

tf.test.gpu_device_name()

ค้นหาเอกสาร Tensorflow เพื่อหาข้อโต้แย้ง


2
สิ่งนี้ส่งคืนเพียง GPU: 0
Trisoloriansunscreen

@Tal นั่นหมายความว่าคุณมี GPU 1 ตัว (ที่ PCI slot ID 0) ดังนั้นtf.test.is_gpu_available()จะกลับมาอีกครั้งTrue
repoleved

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

คำตอบที่ได้รับการยอมรับจะช่วยให้คุณจำนวน GPUs แต่ยังจัดสรรหน่วยความจำทั้งหมดที่อยู่ใน GPUs เหล่านั้น คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยการสร้างเซสชั่นที่มีหน่วยความจำต่ำกว่าคงที่ก่อนที่จะโทรไปที่

ฉันลงเอยด้วยการใช้ nvidia-smi เพื่อรับจำนวน GPU โดยไม่ต้องจัดสรรหน่วยความจำใด ๆ

import subprocess

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

8

นอกเหนือจากคำอธิบายที่ยอดเยี่ยมโดย Mrry ที่เขาแนะนำให้ใช้device_lib.list_local_devices()ฉันสามารถแสดงให้คุณเห็นว่าคุณสามารถตรวจสอบข้อมูลที่เกี่ยวข้องกับ GPU จากบรรทัดคำสั่งได้อย่างไร

เนื่องจากปัจจุบัน gpus ของ Nvidia เท่านั้นที่ทำงานกับกรอบ 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 ตัวแรกของคุณ มันง่ายในการรันจาก pythonและคุณสามารถตรวจสอบ 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


ใช้งานได้เมื่อฉันใช้ scaleTier ของ BASIC_GPU ด้วย เมื่อฉันเรียกใช้รหัสนี้ให้ฉันเพียงแค่ซีพียู
shivas

คำตอบที่ซ้ำกันของ MiniQuark (แต่มีรายละเอียดน้อยกว่า .. )
FluxLemur

1

ฉันได้รับ GPU ที่เรียกว่าNVIDIA GTX GeForce 1650 Tiในเครื่องของฉันด้วย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

ตรวจสอบให้แน่ใจว่าคุณติดตั้งTensorFlow 2.x GPU ล่าสุดในเครื่องที่รองรับ GPU ของคุณดำเนินการโค้ดต่อไปนี้ในไพ ธ อน

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: ฉัน tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] โหนด NUMA ที่ประสบความสำเร็จอ่านจาก SysFS มีค่าลบ (-1) แต่ต้องมีอย่างน้อยหนึ่งโหนด NUMA ดังนั้นกลับมา NUMA node zero 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 GPUs ที่มี: 8


1
คำตอบนี้ได้รับการโพสต์แล้ว
Björn Lindqvist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.