Saltar al contenido

¿Cómo configurar gpu específico en tensorflow?

Si encuentras alguna parte que no comprendes puedes dejarlo en los comentarios y te ayudaremos lo mas rápido que podamos.

Solución:

Hay 3 formas de lograr esto:

  1. Utilizando CUDA_VISIBLE_DEVICES Variable ambiental. configurando la variable de entorno CUDA_VISIBLE_DEVICES="1" hace que solo el dispositivo 1 sea visible y al configurar CUDA_VISIBLE_DEVICES="0,1" hace que los dispositivos 0 y 1 sean visibles. Puedes hacer esto en python al tener una línea os.environ["CUDA_VISIBLE_DEVICES"]="0,1" después de importar os paquete.

  2. Utilizando with tf.device('/gpu:2') y creando el gráfico. Luego usará el dispositivo GPU 2 para ejecutarse.

  3. Utilizando config = tf.ConfigProto(device_count = 'GPU': 1) y luego sess = tf.Session(config=config). Esto utilizará el dispositivo GPU 1.

TF asignaría toda la memoria disponible en cada GPU visible si no se le indica lo contrario. Aquí hay 5 formas de apegarse a solo una (o algunas) GPU.

Solución bash. Colocar CUDA_VISIBLE_DEVICES=0,1 en su terminal/consola antes de iniciar python o jupyter notebook:

CUDA_VISIBLE_DEVICES=0,1 python script.py

Solución Python. ejecute las siguientes 2 líneas de código antes de construir una sesión

import os
os.environ["CUDA_VISIBLE_DEVICES"]="0,1"

Solución automatizada. El método a continuación detectará automáticamente los dispositivos de GPU que no utilizan otros scripts y establecerá CUDA_VISIBLE_DEVICES por usted. tienes que llamar mask_unused_gpus antes de construir una sesión. Filtrará las GPU por uso de memoria actual. De esta manera, puede ejecutar varias instancias de su secuencia de comandos a la vez sin cambiar su código ni configurar los parámetros de la consola.

La función:

import subprocess as sp
import os

def mask_unused_gpus(leave_unmasked=1):
  ACCEPTABLE_AVAILABLE_MEMORY = 1024
  COMMAND = "nvidia-smi --query-gpu=memory.free --format=csv"

  try:
    _output_to_list = lambda x: x.decode('ascii').split('n')[:-1]
    memory_free_info = _output_to_list(sp.check_output(COMMAND.split()))[1:]
    memory_free_values = [int(x.split()[0]) for i, x in enumerate(memory_free_info)]
    available_gpus = [i for i, x in enumerate(memory_free_values) if x > ACCEPTABLE_AVAILABLE_MEMORY]

    if len(available_gpus) < leave_unmasked: raise ValueError('Found only %d usable GPUs in the system' % len(available_gpus))
    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, available_gpus[:leave_unmasked]))
  except Exception as e:
    print('"nvidia-smi" is probably not installed. GPUs are not masked', e)

mask_unused_gpus(2)

Limitaciones: si inicia varias secuencias de comandos a la vez, podría provocar una colisión, ya que la memoria no se asigna inmediatamente cuando construye una sesión. En caso de que sea un problema para usted, puede usar una versión aleatoria como en el código fuente original: mask_busy_gpus()

Tensorflow 2.0 sugerir otro método más:

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only use the first GPU
  try:
    tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
  except RuntimeError as e:
    # Visible devices must be set at program startup
    print(e)

Tensorflow/Keras también permite especificar gpu para usar con la configuración de la sesión. Puedo recomendarlo solo si la configuración de la variable de entorno no es una opción (es decir, una ejecución de MPI). Porque tiende a ser el menos confiable de todos los métodos, especialmente con keras.

config = tf.ConfigProto()
config.gpu_options.visible_device_list = "0,1"
with tf.Session(config) as sess:
#or K.set_session(tf.Session(config))

Creo que necesitas configurar CUDA_VISIBLE_DEVICES=1. O la GPU que quieras usar. Si solo hace visible una GPU, se referirá a ella como /gpu:0 en tensorflow independientemente de lo que establezca la variable de entorno.

Más información sobre esa variable de entorno: https://devblogs.nvidia.com/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/

Si estás contento con lo expuesto, puedes dejar una división acerca de qué le añadirías a esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *