Как узнать, использует ли tensorflow ускорение gpu изнутри оболочки python?

Я установил tensorflow в моем ubuntu 16.04, используя второй ответ здесь С встроенной установкой ubuntu apt cuda.

теперь мой вопрос: как я могу проверить, действительно ли tensorflow использует gpu? У меня есть GTX 960M gpu. Когда Я ... --1--> это выход

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 ?

11 ответов


Нет, я не думаю, что "Открытая библиотека CUDA" достаточно сказать, потому что разные узлы графика могут быть на разных устройствах.

чтобы узнать, какое устройство используется, Вы можете включить размещение журнала устройств следующим образом:

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

Проверьте консоль для этого типа вывода.


Помимо использования sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) который изложен в других ответах, а также в TF official документация, вы можете попытаться назначить вычисление 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": процессор вашей машины.
  • " / gpu: 0": GPU вашей машины, если у вас есть.

Если у вас есть gpu и вы можете его использовать, вы увидите результат. В противном случае вы увидите сообщение об ошибке с длинные трассировки стека. В конце концов у вас будет что-то вроде этого:

не удается назначить устройство узлу "MatMul": не удалось удовлетворить явное спецификация устройства "/ device:GPU:0", потому что нет устройств, соответствующих этому спецификации регистрируются в этом процессе


следующий фрагмент кода должен предоставить вам все устройства, доступные для 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: 0000:05:00.0" ]


это подтвердит, что tensorflow использует GPU во время обучения?

код

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

выход

I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GT 730
major: 3 minor: 5 memoryClockRate (GHz) 0.9015
pciBusID 0000:01:00.0
Total memory: 1.98GiB
Free memory: 1.72GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0)
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0
I tensorflow/core/common_runtime/direct_session.cc:255] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0

Я думаю, что есть более простой способ добиться этого.

import tensorflow as tf
if tf.test.gpu_device_name():
    print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
else:
    print("Please install GPU version of TF")

Он обычно печатает как

Default GPU Device: /device:GPU:0

Это кажется мне проще, чем эти подробные журналы.


Это должно дать список устройств, доступных для Tensorflow (под Py-3.6):

tf = tf.Session(config=tf.ConfigProto(log_device_placement=True))
tf.list_devices()
# _DeviceAttributes(/job:localhost/replica:0/task:0/device:CPU:0, CPU, 268435456)

Я предпочитаю использовать nvidia-smi для мониторинга использования GPU. если он значительно увеличивается при запуске программы, это сильный признак того, что ваш tensorflow использует GPU.


в дополнение к другим ответам, следующее должно помочь вам убедиться, что ваша версия tensorflow включает поддержку GPU.

import tensorflow as tf
print(tf.test.is_built_with_cuda())

Я считаю, что просто запросить 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 должен соответствовать pid от nvidia-smi


Ok, первый запуск ipython shell из терминала и import TensorFlow

$ ipython --pylab
Python 3.6.5 |Anaconda custom (64-bit)| (default, Apr 29 2018, 16:14:56) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
Using matplotlib backend: Qt5Agg

In [1]: import tensorflow as tf

теперь мы можем посмотреть использование памяти GPU с помощью команды:

# realtime update for every 2s
$ watch -n 2 nvidia-smi

поскольку мы imported TensorFlow, но еще не использовали GPU, статистика использования будет:

tf non-gpu usage

наблюдайте, как использование памяти GPU очень меньше (~200 МБ).



теперь давайте загрузим GPU в наш код. Как указано в tf documentation, do:

In [2]: sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

и посмотреть статистика должна показывать обновленную память использования GPU, как показано ниже:

tf gpu-watch

посмотрите, как наш процесс Python из оболочки ipython использует 7,7 ГБ памяти GPU.


P. S. Вы можете продолжать смотреть эта статистика, как код работает, чтобы увидеть, насколько интенсивно использование GPU.


выполните следующие действия в 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\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\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

вы можете видеть здесь, что я использую TensorFlow с Nvidia Quodro K620.