¿Cómo saber si tensorflow está usando aceleración de gpu desde el interior del shell de Python?
He instalado tensorflow en mi ubuntu 16.04 usando la segunda respuesta aquí con la instalación apt cuda incorporada de ubuntu.
Ahora mi pregunta es ¿cómo puedo probar si tensorflow realmente usa gpu? Tengo una gpu gtx 960m. Cuando yo import tensorflow
esta es la salida
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
¿Es este resultado suficiente para comprobar si tensorflow está usando gpu?
No, no creo que "abrir la biblioteca CUDA" sea suficiente para saberlo, porque diferentes nodos del gráfico pueden estar en diferentes dispositivos.
Cuando se usa tensorflow2:
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
Para tensorflow1, para saber qué dispositivo se utiliza, puede habilitar la ubicación del dispositivo de registro de esta manera:
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
Verifique su consola para ver este tipo de salida.
Además de usar sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
lo que se describe en otras respuestas, así como en la documentación oficial de TensorFlow , puede intentar asignar un cálculo a la gpu y ver si tiene un error.
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))
Aquí
- "/cpu:0": La CPU de su máquina.
- "/gpu:0": La GPU de tu máquina, si tienes una.
Si tienes una gpu y puedes usarla, verás el resultado. De lo contrario, verá un error con un seguimiento de pila largo. Al final tendrás algo como esto:
No se puede asignar un dispositivo al nodo 'MatMul': no se pudo satisfacer la especificación explícita del dispositivo '/device:GPU:0' porque no se han registrado dispositivos que coincidan con esa especificación en este proceso
Recientemente aparecieron algunas funciones útiles en TF:
- tf.test.is_gpu_available indica si la gpu está disponible
- tf.test.gpu_device_name devuelve el nombre del dispositivo gpu
También puedes consultar los dispositivos disponibles en la sesión:
with tf.Session() as sess:
devices = sess.list_devices()
devices
te devolverá algo como
[_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)
El siguiente fragmento de código debería brindarle todos los dispositivos disponibles para tensorflow.
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
Salida de muestra
[nombre: "/cpu:0" tipo_dispositivo: "CPU" límite_memoria: 268435456 localidad { } encarnación: 4402277519343584096,
nombre: "/gpu:0" tipo_dispositivo: "GPU" límite_memoria: 6772842168 localidad {id_bus: 1} encarnación: 7471795903849088328 dispositivo_físico_desc: "dispositivo: 0, nombre: GeForce GTX 1070, ID de bus pci: 0000:05:00.0" ]