当前位置:   article > 正文

ubuntu 查看GPU使用信息以及用GPU进行TensorFlow计算加速_检查gpu计算情况

检查gpu计算情况

一、ubuntu 查看GPU的版本信息和使用情况

1.1 使用nvidia自带的nvidia-smi的命令行工具

1.1.1 查看静态使用情况(当前GPU使用情况)

nvidia自带了一个nvidia-smi的命令行工具,会显示显存的使用情况

nvidia-smi
  • 1

在这里插入图片描述
解析

  1. 第一栏中:Driver Version :352.63 表示我们使用的驱动是352.63

  2. 第二栏中:

  • 第一行表示GPU序号,名字,Persisitence-M(持续模式状态)。如该电脑中有一个GPU,序号为0;名字为GeForce DTX 970;持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态。
  • 第二行:
    Fan:显示风扇的转速,从0到100%之间变动,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A。有的nvidia设备如笔记本,tesla系列不是主动散热的可能显示不了转速
    Temp:显示内部温度,单位是摄氏度
    Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示最小性能
    Pwr:表示能耗
    Bus-Id:设计GPU总线的相关信息
    Disp.A:DisPlay Active ,表示GPU是否有初始化
    Memory-Usage:表示显存的使用率
    Volatile GPU-Util:表示浮动的GPU的利用率
    Uncorr.ECC:表示ECC的相关信息,ECC即 Error Correcting Code 错误检查和纠正,在服务器和工作站上的内存中才有的技术
    Compute M:表示计算模式
    Processes:显示每块GPU上每个进程所使用的显存情况。
    图中红框标注的参数为一些重要的参数,主要有温度、内存使用、GPU利用率

1.2 查看动态使用情况(周期性输出GPU使用情况)

watch -n * nvidia-smi                  # 每 * 秒更新
watch -n 10 nvidia-smi               # 每10秒更新
watch nvidia-smi                         # 每2 秒更新
  • 1
  • 2
  • 3

在这里插入图片描述

1.2 使用nvidia GPU

lspci |grep -i vga
lspci |grep -i nvidia
  • 1
  • 2

有GPU的linux的服务器
在这里插入图片描述
没有GPU的linux的服务器
在这里插入图片描述

二、用GPU进行TensorFlow计算加速

将深度学习应用到实际问题时,存在的一个非常大的问题是训练深度学习模型需要的计算量太大。
为了加速训练过程,接下来将介绍如何在TensorFlow中使用单个GPU进行计算加速,以及生成TensorFlow会话(tf.Session)时的一些常用参数。通过这些参数可以使调试更加方便而且程序的可扩展性更好。
本文选自**《TensorFlow:实战Google深度学习框架(第2版)》**。

2.1 tf.device函数

TensorFlow程序可以通过tf.device函数来指定运行每一个操作的设备,这个设备可以是本地的CPU或者GPU,也可以是某一台远程的服务器。但在本文中只关心本地的设备。

TensorFlow会给每一个可用的设备一个名称,tf.device函数可以通过设备的名称来指定执行运算的设备。

  • CPU在TensorFlow中的名称为/cpu:0。在默认情况下,即使机器有多个CPU,TensorFlow也不会区分它们,所有的CPU都使用/cpu:0作为名称。
  • 而一台机器上不同GPU的名称是不同的,第n个GPU在TensorFlow中的名称为/gpu:n。比如第一个GPU的名称为/gpu:0,第二个GPU名称为/gpu:1,以此类推。

TensorFlow提供了一个快捷的方式来查看运行每一个运算的设备。在生成会话时,可以通过设置log_device_placement参数来打印运行每一个运算的设备。以下程序展示了如何使用log_device_placement这个参数。

import tensorflow as tf
a = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a')
b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')
c = a + b

# 通过log_device_placement参数来输出运行每一个运算的设备。
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print (sess.run(c))

'''
在没有GPU的机器上运行以上代码可以得到类似以下的输出:
Device mapping: no known devices.
add: (Add): /job:localhost/replica:0/task:0/cpu:0
b: (Const): /job:localhost/replica:0/task:0/cpu:0
a: (Const): /job:localhost/replica:0/task:0/cpu:0
[ 2.  4.  6.]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在配置好GPU环境的TensorFlow中,如果操作没有明确地指定运行设备,那么TensorFlow会优先选择GPU,并且只会将运算优先放到/gpu:0上。如果需要将某些运算放到不同的GPU或者CPU上,就需要通过tf.device来手工指定。以下程序给出了一个通过tf.device手工指定运行设备的样例。

import tensorflow as tf

# 通过tf.device将运算指定到特定的设备上。
with tf.device('/cpu:0'):
   a = tf.constant([1.0, 2.0, 3.0], shape=[3], name='a')
   b = tf.constant([1.0, 2.0, 3.0], shape=[3], name='b')
   
with tf.device('/gpu:1'):
    c = a + b
    
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print sess.run(c)

'''
在AWS g2.8xlarge实例上运行上述代码可以得到以下结果:
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GRID K520, pci bus id: 0000:00:03.0
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GRID K520, pci bus id: 0000:00:04.0
/job:localhost/replica:0/task:0/gpu:2 -> device: 2, name: GRID K520, pci bus id: 0000:00:05.0
/job:localhost/replica:0/task:0/gpu:3 -> device: 3, name: GRID K520, pci bus id: 0000:00:06.0

add: (Add): /job:localhost/replica:0/task:0/gpu:1
b: (Const): /job:localhost/replica:0/task:0/cpu:0
a: (Const): /job:localhost/replica:0/task:0/cpu:0
[ 2.  4.  6.]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在TensorFlow中,不是所有的操作都可以被放在GPU上,如果强行将无法放在GPU上的操作指定到GPU上,那么程序将会报错。以下代码给出了一个报错的样例。

import tensorflow as tf

# 在CPU上运行tf.Variable
a_cpu = tf.Variable(0, name="a_cpu")

with tf.device('/gpu:0'):
    # 将tf.Variable强制放在GPU上。
    a_gpu = tf.Variable(0, name="a_gpu")

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
sess.run(tf.initialize_all_variables())

'''
运行以上程序将会报出以下错误:
tensorflow.python.framework.errors.InvalidArgumentError: Cannot assign a device to node 'a_gpu': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available.
Colocation Debug Info:
Colocation group had the following types and devices: 
Identity: CPU 
Assign: CPU 
Variable: CPU 
[[Node: a_gpu = Variable[container="", dtype=DT_INT32, shape=[], shared_ name="", _device="/device:GPU:0"]()]]

'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

不同版本的TensorFlow对GPU的支持不一样,如果程序中全部使用强制指定设备的方式会降低程序的可移植性。在TensorFlow的kernel中定义了哪些操作可以跑在GPU上。比如可以在variable_ops.cc程序中找到以下定义。

# define REGISTER_GPU_KERNELS(type)                                       \
    REGISTER_KERNEL_BUILDER(                                                 \
      Name("Variable").Device(DEVICE_GPU).TypeConstraint<type>("dtype"),\
      VariableOp);                                                                 \
   …
TF_CALL_GPU_NUMBER_TYPES(REGISTER_GPU_KERNELS);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这段定义中可以看到GPU只在部分数据类型上支持tf.Variable操作。如果在TensorFlow代码库中搜索调用这段代码的宏TF_CALL_GPU_NUMBER_TYPES,可以发现在GPU上,tf.Variable操作只支持实数型(float16、float32和double)的参数。而在报错的样例代码中给定的参数是整数型的,所以不支持在GPU上运行。

为避免这个问题,TensorFlow在生成会话时可以指定allow_soft_placement参数。

当allow_soft_placement参数设置为True时,如果运算无法由GPU执行,那么TensorFlow会自动将它放到CPU上执行。以下代码给出了一个使用allow_soft_placement参数的样例。

import tensorflow as tf
a_cpu = tf.Variable(0, name="a_cpu")
with tf.device('/gpu:0'):
    a_gpu = tf.Variable(0, name="a_gpu")

# 通过allow_soft_placement参数自动将无法放在GPU上的操作放回CPU上。
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_ placement=True))
sess.run(tf.initialize_all_variables())

'''
运行上面这段程序可以得到以下结果:
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GRID K520, pci bus id: 0000:00:03.0
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GRID K520, pci bus id: 0000:00:04.0
/job:localhost/replica:0/task:0/gpu:2 -> device: 2, name: GRID K520, pci bus id: 0000:00:05.0
/job:localhost/replica:0/task:0/gpu:3 -> device: 3, name: GRID K520, pci bus id: 0000:00:06.0
a_gpu: /job:localhost/replica:0/task:0/cpu:0
a_gpu/read: /job:localhost/replica:0/task:0/cpu:0
a_gpu/Assign: /job:localhost/replica:0/task:0/cpu:0
init/NoOp_1: /job:localhost/replica:0/task:0/gpu:0
a_cpu: /job:localhost/replica:0/task:0/cpu:0
a_cpu/read: /job:localhost/replica:0/task:0/cpu:0
a_cpu/Assign: /job:localhost/replica:0/task:0/cpu:0
init/NoOp: /job:localhost/replica:0/task:0/gpu:0
init: /job:localhost/replica:0/task:0/gpu:0
a_gpu/initial_value: /job:localhost/replica:0/task:0/gpu:0
a_cpu/initial_value: /job:localhost/replica:0/task:0/cpu:0
从输出的日志中可以看到在生成变量a_gpu时,无法放到GPU上的运算被自动调整到了CPU上(比如a_gpu和a_gpu/read),而可以被GPU执行的命令(比如a_gpu/initial_value)依旧由GPU执行。

'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.2 设置CUDA_VISIBLE_DEVICES环境变量

虽然GPU可以加速TensorFlow的计算,但一般来说不会把所有的操作全部放在GPU上。一个比较好的实践是将计算密集型的运算放在GPU上,而把其他操作放到CPU上。GPU是机器中相对独立的资源,将计算放入或者转出GPU都需要额外的时间。而且GPU需要将计算时用到的数据从内存复制到GPU设备上,这也需要额外的时间。TensorFlow可以自动完成这些操作而不需要用户特别处理,但为了提高程序运行的速度,用户也需要尽量将相关的运算放在同一个设备上。

TensorFlow默认会占用设备上的所有GPU以及每个GPU的所有显存。如果在一个TensorFlow程序中只需要使用部分GPU,可以通过设置CUDA_VISIBLE_DEVICES环境变量来控制。以下样例介绍了如何在运行时设置这个环境变量。

# 只使用第二块GPU(GPU编号从0开始)。在demo_code.py中,机器上的第二块GPU的
# 名称变成/gpu:0,不过在运行时所有/gpu:0的运算将被放在第二块GPU上。
CUDA_VISIBLE_DEVICES=1 python demo_code.py
# 只使用第一块和第二块GPU。
CUDA_VISIBLE_DEVICES=0,1 python demo_code.py

CUDA_VISIBLE_DEVICES="0,1"       # Same as above, quotation marks are optional
CUDA_VISIBLE_DEVICES=0,2,3       # Devices 0, 2, 3 will be visible; device 1 is maskedCUDA_VISIBLE_DEVICES=""    # No GPU will be visible
————————————————
版权声明:本文为CSDN博主「Colie-Li」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guvcolie/article/details/77164230
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

TensorFlow也支持在程序中设置环境变量,以下代码展示了如何在程序中设置这些环境变量。

import os
# 只使用第三块GPU。
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
  • 1
  • 2
  • 3

2.3 TensorFlow动态分配显存

虽然TensorFlow默认会一次性占用一个GPU的所有显存,但是TensorFlow也支持动态分配GPU的显存,使得一块GPU上可以同时运行多个任务。下面给出了TensorFlow动态分配显存的方法。

config = tf.ConfigProto()

# 让TensorFlow按需分配显存。
# 方法一:设置最小的GPU使用量
config.gpu_options.allow_growth = True   
# 方法二:设置定量的GPU使用量,以下代码会占用所有可使用GPU的90%显存                  
# config.gpu_options.per_process_gpu_memory_fraction = 0.9  

session = tf.Session(config=config, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

原文链接:
https://www.cnblogs.com/wj-1314/articles/9947477.html
https://blog.csdn.net/zhang_yang_43/article/details/78357458
https://blog.csdn.net/broadview2006/article/details/79459121
多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Tensorflow全局设置可见GPU编号
深度学习之卷积神经网络CNN及tensorflow代码实现示例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/129350
推荐阅读
相关标签
  

闽ICP备14008679号