我已经在我的ubuntu 16.04中安装了tensorflow,使用的是ubuntu内置的apt cuda安装。

现在我的问题是,我如何测试tensorflow是否真的使用gpu?我有一个gtx 960m gpu。当我导入tensorflow时,这是输出

I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally

这个输出是否足够检查tensorflow是否使用gpu ?


当前回答

如果你正在使用TensorFlow 2.0,你可以使用这个for循环来显示设备:

with tf.compat.v1.Session() as sess:
  devices = sess.list_devices()
devices

其他回答

下面的代码段应该给出tensorflow可用的所有设备。

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

样例输出 (名字:“/ cpu: 0” device_type:“CPU” memory_limit: 268435456 位置{ } 化身:4402277519343584096, 名称:“/ gpu: 0” device_type:“GPU” memory_limit: 6772842168 位置{ bus_id: 1 } 化身:7471795903849088328 physical_device_desc: "设备:0,名称:GeForce GTX 1070, pci总线id: 0000:05:00.0" ]

更新为tensorflow >= 2.1

检查TensorFlow是否使用GPU的推荐方法如下:

tf.config.list_physical_devices('GPU') 

从TensorFlow 2.1开始,tf.test.gpu_device_name()已经被弃用,取而代之的是前面提到的。

然后,在终端中,您可以使用nvidia-smi检查有多少GPU内存已分配;同时,使用watch -n K nvidia-smi会告诉你,例如每K秒你使用了多少内存(你可能想使用K = 1实时)

如果你有多个GPU,你想使用多个网络,每个网络都在一个独立的GPU上,你可以使用:

 with tf.device('/GPU:0'):
      neural_network_1 = initialize_network_1()
 with tf.device('/GPU:1'):
      neural_network_2 = initialize_network_2()

我更喜欢使用nvidia-smi来监控GPU使用情况。如果当你开始你的程序时,它显著上升,这是一个强烈的迹象,表明你的张量流正在使用GPU。

对于Tensorflow 2.0

import tensorflow as tf

tf.test.is_gpu_available(
    cuda_only=False,
    min_cuda_compute_capability=None
)

源在这里

其他选择是:

tf.config.experimental.list_physical_devices('GPU')

Tensorflow 2.1

一个简单的计算,可以用nvidia-smi验证GPU上的内存使用情况。

import tensorflow as tf 

c1 = []
n = 10

def matpow(M, n):
    if n < 1: #Abstract cases where n < 1
        return M
    else:
        return tf.matmul(M, matpow(M, n-1))

with tf.device('/gpu:0'):
    a = tf.Variable(tf.random.uniform(shape=(10000, 10000)), name="a")
    b = tf.Variable(tf.random.uniform(shape=(10000, 10000)), name="b")
    c1.append(matpow(a, n))
    c1.append(matpow(b, n))