我已经在我的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 ?


当前回答

除了使用sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)),这是在其他答案和官方TensorFlow文档中列出的,你可以尝试给gpu分配一个计算,看看你是否有错误。

import tensorflow as tf
with tf.device('/gpu:0'):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
    c = tf.matmul(a, b)

with tf.Session() as sess:
    print (sess.run(c))

在这里

"/cpu:0":您机器的cpu。 "/gpu:0":你机器的gpu,如果你有的话。

如果你有一个gpu并且可以使用它,你会看到结果。否则,您将看到一个带有很长的堆栈跟踪的错误。最后你会得到这样的结果:

无法将设备分配给节点“MatMul”:无法满足显式要求 设备规格'/device:GPU:0'因为没有设备与之匹配 规范是在这个过程中注册的


最近在TF中出现了几个有用的函数:

tf.test。Is_gpu_available表示gpu是否可用 tf.test。Gpu_device_name返回gpu设备名称

你也可以检查会话中可用的设备:

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

设备会给你一些类似的东西

[_DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:CPU:0, CPU, -1, 4670268618893924978),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:XLA_CPU:0, XLA_CPU, 17179869184, 6127825144471676437),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:XLA_GPU:0, XLA_GPU, 17179869184, 16148453971365832732),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:TPU:0, TPU, 17179869184, 10003582050679337480),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:TPU:1, TPU, 17179869184, 5678397037036584928)

其他回答

在Jupyter上运行以下命令,

import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

如果你已经正确地设置了环境,你将在运行“jupyter notebook”的终端中得到以下输出,

2017-10-05 14:51:46.335323: I c:\tf_jenkins\home\workspace\release-win\m\windows-gpu\py\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1030] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Quadro K620, pci bus id: 0000:02:00.0)
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Quadro K620, pci bus id: 0000:02:00.0
2017-10-05 14:51:46.337418: I c:\tf_jenkins\home\workspace\release-win\m\windows-gpu\py\35\tensorflow\core\common_runtime\direct_session.cc:265] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Quadro K620, pci bus id: 0000:02:00.0

你可以看到我在使用Nvidia Quodro K620的TensorFlow。

对于TF2.4+, tensorflow网站上列出的“官方”方法来检查TF是否使用GPU

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

除了使用sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)),这是在其他答案和官方TensorFlow文档中列出的,你可以尝试给gpu分配一个计算,看看你是否有错误。

import tensorflow as tf
with tf.device('/gpu:0'):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
    c = tf.matmul(a, b)

with tf.Session() as sess:
    print (sess.run(c))

在这里

"/cpu:0":您机器的cpu。 "/gpu:0":你机器的gpu,如果你有的话。

如果你有一个gpu并且可以使用它,你会看到结果。否则,您将看到一个带有很长的堆栈跟踪的错误。最后你会得到这样的结果:

无法将设备分配给节点“MatMul”:无法满足显式要求 设备规格'/device:GPU:0'因为没有设备与之匹配 规范是在这个过程中注册的


最近在TF中出现了几个有用的函数:

tf.test。Is_gpu_available表示gpu是否可用 tf.test。Gpu_device_name返回gpu设备名称

你也可以检查会话中可用的设备:

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

设备会给你一些类似的东西

[_DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:CPU:0, CPU, -1, 4670268618893924978),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:XLA_CPU:0, XLA_CPU, 17179869184, 6127825144471676437),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:XLA_GPU:0, XLA_GPU, 17179869184, 16148453971365832732),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:TPU:0, TPU, 17179869184, 10003582050679337480),
 _DeviceAttributes(/job:tpu_worker/replica:0/task:0/device:TPU:1, TPU, 17179869184, 5678397037036584928)

我发现从命令行查询gpu是最简单的:

nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.98                 Driver Version: 384.98                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 980 Ti  Off  | 00000000:02:00.0  On |                  N/A |
| 22%   33C    P8    13W / 250W |   5817MiB /  6075MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1060      G   /usr/lib/xorg/Xorg                            53MiB |
|    0     25177      C   python                                      5751MiB |
+-----------------------------------------------------------------------------+

如果你的学习是一个后台过程,pid从 Jobs -p应该匹配nvidia-smi的pid

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

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