web-dev-qa-db-fra.com

Tensorflow sessions multiples avec plusieurs GPU

J'ai un poste de travail avec 2 GPU et j'essaie d'exécuter plusieurs tâches tensorflow en même temps, donc je peux former plus d'un modèle à la fois, etc.

Par exemple, j'ai essayé de séparer les sessions en différentes ressources via l'API python en utilisant dans script1.py:

with tf.device("/gpu:0"):
    # do stuff

dans script2.py:

with tf.device("/gpu:1"):
    # do stuff

dans script3.py

with tf.device("/cpu:0"):
    # do stuff

Si j'exécute chaque script seul, je peux voir qu'il utilise le périphérique spécifié. (De plus, les modèles s'intègrent très bien dans un seul GPU et n'en utilisent pas un autre même si les deux sont disponibles.)

Cependant, si un script est en cours d'exécution et j'essaie d'en exécuter un autre, j'obtiens toujours cette erreur:

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 8
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties: 
name: GeForce GTX 980
major: 5 minor: 2 memoryClockRate (GHz) 1.2155
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 187.65MiB
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 1 with properties: 
name: GeForce GTX 980
major: 5 minor: 2 memoryClockRate (GHz) 1.2155
pciBusID 0000:04:00.0
Total memory: 4.00GiB
Free memory: 221.64MiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0:   Y Y 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1:   Y Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating    TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX 980, pci bus id: 0000:04:00.0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Allocating 187.40MiB bytes.
E tensorflow/stream_executor/cuda/cuda_driver.cc:932] failed to allocate 187.40M (196505600 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
F tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:47] Check failed: gpu_mem != nullptr  Could not allocate GPU device memory for device 0. Tried to allocate 187.40MiB
Aborted (core dumped)

Il semble que chaque processus tensorflow essaie de récupérer tous les GPU de la machine lors du chargement, même si tous les périphériques ne seront pas utilisés pour exécuter le modèle.

Je vois qu'il existe une option pour limiter la quantité de GPU utilisée par chaque processus

tf.GPUOptions(per_process_gpu_memory_fraction=0.5)

... Je ne l'ai pas essayé, mais il semblerait que deux processus essaient de partager 50% de chaque GPU au lieu d'exécuter chaque processus sur un GPU séparé ...

Est-ce que quelqu'un sait comment configurer tensorflow pour utiliser un seul GPU et laisser l'autre disponible pour un autre processus tensorflow?

19
j314erre

TensorFlow tentera d'utiliser (une fraction égale de la mémoire de) tous les périphériques GPU qui lui sont visibles. Si vous souhaitez exécuter différentes sessions sur différents GPU, vous devez procéder comme suit.

  1. Exécutez chaque session dans un processus Python différent.
  2. Démarrez chaque processus avec une valeur différente pour le CUDA_VISIBLE_DEVICES variable d'environnement . Par exemple, si votre script s'appelle my_script.py et vous disposez de 4 GPU, vous pouvez exécuter ce qui suit:

    $ CUDA_VISIBLE_DEVICES=0 python my_script.py  # Uses GPU 0.
    $ CUDA_VISIBLE_DEVICES=1 python my_script.py  # Uses GPU 1.
    $ CUDA_VISIBLE_DEVICES=2,3 python my_script.py  # Uses GPUs 2 and 3.
    

    Notez que les périphériques GPU dans TensorFlow seront toujours numérotés à partir de zéro (c'est-à-dire "/gpu:0" etc.), mais ils correspondront aux appareils que vous avez rendus visibles avec CUDA_VISIBLE_DEVICES.

49
mrry