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:
-
Utilizando
CUDA_VISIBLE_DEVICES
Variable ambiental. configurando la variable de entornoCUDA_VISIBLE_DEVICES="1"
hace que solo el dispositivo 1 sea visible y al configurarCUDA_VISIBLE_DEVICES="0,1"
hace que los dispositivos 0 y 1 sean visibles. Puedes hacer esto en python al tener una líneaos.environ["CUDA_VISIBLE_DEVICES"]="0,1"
después de importaros
paquete. -
Utilizando
with tf.device('/gpu:2')
y creando el gráfico. Luego usará el dispositivo GPU 2 para ejecutarse. -
Utilizando
config = tf.ConfigProto(device_count = 'GPU': 1)
y luegosess = 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.