2017-07-30 2 views
1

1 PC avec 2 GPU. Pour former 2 CNN indépendants sur 2 GPU. J'utilise followings pour créer le graphique pour GPU:Tensorflow Comment former 2 CNN (indépendant) sur 2 GPU. CUDA_ERROR_OUT_OF_MEMORY Erreur

with tf.device('/gpu:%d' % self.single_gpu): 
    self._create_placeholders() 
    self._build_conv_net() 
    self._create_cost() 
    self._creat_optimizer() 

boucle de formation ne relève pas de th.device()

Après avoir démarré le 1er processus de formation CNN, par exemple en utilisant le GPU 1. Ensuite, je commence 2ème formation CNN avec GPU 0. Je reçois toujours l'erreur CUDA_ERROR_OUT_OF_MEMORY, et je n'ai pas pu démarrer le 2ème processus de formation.

Exécution de 2 tâches d'entraînement indépendantes assignées à 2 GPU sur le même PC possible? Si possible, qu'est-ce qui me manque?

E tensorflow/stream_executor/cuda/cuda_driver.cc:1002] failed to allocate 164.06M (172032000 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY 

W tensorflow/core/common_runtime/bfc_allocator.cc: 274] ____ ******* ****************** _______________________________________________________________________ W tensorflow /core/common_runtime/bfc_allocator.cc:275] Manque de mémoire essayant d'allouer 384.00MiB. Voir les journaux pour l'état de la mémoire. Traceback (dernier appel en dernier): Fichier "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", ligne 1022 , dans _do_call return fn (* args) Fichier "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", ligne 1004, en _run_fn état, run_metadata) fichier "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/contextlib.py", ligne 89, à la sortie suivant (auto. gen) Fichier "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", ligne 466, dans raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode (st atus)) tensorflow.python.framework.errors_impl.InternalError: Le tenseur DST n'est pas initialisé. [[Nœud: _recv_inputs/input_placeholder_0/_7 = _Recvclient_terminated = false, recv_device = "/ travail: localhost/réplique: 0/tâche: 0/gpu: 2", send_device = "/ travail: hôte local/réplique: 0/tâche: 0/cpu: 0 ", send_device_incarnation = 1, nom_tenseur =" edge_3__recv_inputs/input_placeholder_0 ", tensor_type = DT_FLOAT, _device ="/travail: hôte local/réplique: 0/tâche: 0/gpu: 2 "]] [[Node: Moyenne/_15 = _Recvclient_terminated = false, recv_device = "/ travail: localhost/réplique: 0/tâche: 0/cpu: 0", send_device = "/ travail: hôte local/réplique: 0/tâche: 0/gpu: 2", send_device_incarnation = 1, tensor_name = "edge_414_Mean", tensor_type = DT_FLOAT, _device = "/ job: localhost/réplique: 0/tâches: 0/CPU 0"]]

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "mg_model_nvidia_gpu.py", line 491, in <module> 
    main() 
    File "mg_model_nvidia_gpu.py", line 482, in main 
    nvidia_cnn.train(data_generator, train_data, val_data) 
    File "mg_model_nvidia_gpu.py", line 307, in train 
    self.keep_prob: self.train_config.keep_prob}) 
    File "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 767, in run 
    run_metadata_ptr) 
    File "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 965, in _run 
    feed_dict_string, options, run_metadata) 
    File "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1015, in _do_run 
    target_list, options, run_metadata) 
    File "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1035, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.InternalError: Dst tensor is not initialized. 
    [[Node: _recv_inputs/input_placeholder_0/_7 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:2", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="edge_3__recv_inputs/input_placeholder_0", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:2"]()]] 
    [[Node: Mean/_15 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:2", send_device_incarnation=1, tensor_name="edge_414_Mean", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

Répondre

1

Par défaut, tensorflow pré-alloue toute la mémoire des périphériques GPU auxquels il a accès. Par conséquent, aucune mémoire n'est disponible pour le second processus.

Vous pouvez contrôler cette allocation à l'aide config.gpu_options:

config = tf.ConfigProto() 
config.gpu_options.per_process_gpu_memory_fraction = 0.4 
sess = tf.Session(config=config) as sess: 

ou vous pourriez attribuer à vos deux processus une autre carte en utilisant le os.environ["CUDA_VISIBLE_DEVICES"].

+0

Par conséquent, un procédé pour utiliser une GPU 0: \t os.environ [ "CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" \t os.environ [ "CUDA_VISIBLE_DEVICES"] = "0" \t tf.device ('/ gpu : 0 '): processus 2 pour utiliser gpu 3: \t os.environ [ "CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" \t os.environ [ "CUDA_VISIBLE_DEVICES"] = "3" \t tf.device ('/ GPU: 3'): sont nécessaires pour utiliser deux GPU? – user6101147

+0

Que diriez-vous de 1 processus de formation, 2 tâches pour mettre en parallèle des données de lot dans 2 GPU? Même configuration que ci-dessus ou pas? – user6101147

+0

Je pense que dans ce cas, vous devrez utiliser tensorflow distribué de sorte que le processus d'entraînement et les 2 tâches se parlent. – npf