2017-07-30 20 views
1

2台のGPUを搭載した1台のPC。 2つの独立したCNNを2つのGPUでトレーニングする。私は、GPUのためのグラフを作成するために、以下を使用します。Tensorflow 2 GPUで2 CNN(独立型)をトレーニングする方法。 CUDA_ERROR_OUT_OF_MEMORYエラー

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

トレーニングループは、その後、GPU 1を用いて、第一CNNトレーニングプロセスを開始した後th.device()

の下ではありませんが、私は第二CNNのトレーニングを開始しますGPU 0で私はいつもCUDA_ERROR_OUT_OF_MEMORYエラーが発生し、2回目のトレーニングプロセスを開始できませんでした。

同じPC上の2つのGPUに割り当てられた2つの独立したトレーニングタスクを実行できますか?可能であれば、私は何が欠けていますか?

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 /コア/ common_runtime/bfc_allocator.cc:274] ******* ____ ****************** _______________________________________________________________________ W tensorflow /core/common_runtime/bfc_allocator.cc:275]メモリが不足して384.00MiBを割り当てようとしました。メモリ状態のログを参照してください。 トレースバック(最新の最後のコール): ファイル "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py"、1022行目、in _do_call return fn(* args) ファイル "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py"、行1004年、_run_fn 状況、終了 次の(自己中run_metadata) ファイル "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/contextlib.py"、ライン89、インチgen) ファイル "/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py"、466行目、raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode (st atus)) tensorflow.python.framework.errors_impl.InternalError:Dstテンソルが初期化されていません。[ノード:_recv_inputs/input_placeholder_0/_7 = _Recvclient_terminated = false、recv_device = "/ job:localhost/replica:0/task:0/gpu:2"、send_device = "/ job:localhost/replica:0/task: tenor_type = DT_FLOAT、_device = "/ job:localhost/replica:0/task:0/gpu:2"] [[ノード:0/cpu:0]、send_device_incarnation = 1、テンソル名= "edge_3__recv_inputs/input_placeholder_0"平均/ _15 = _Recvclient_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 = "/仕事:localhostの/レプリカ:0 /タスク: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"]()]] 

答えて

1

、TensorFlow事前割り当てアクセスしているGPUデバイスのメモリ全体。したがって、2番目のプロセスで使用できるメモリはありません。

あなたはconfig.gpu_optionsを使用して、この割り当てを制御することができます

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

か、os.environ["CUDA_VISIBLE_DEVICES"]を使用して、二つのプロセス別のカードに属性があります。 \tはos.environ [ "CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" \tはos.environ [ "CUDA_VISIBLE_DEVICES"] = "0" \t tf.device( '/ GPU:

+0

従って、プロセス1は、GPU 0を使用します:0 '): gpuを使用するプロセス2 3: \t os。環境[ "CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" \tはos.environ [ "CUDA_VISIBLE_DEVICES"] = "3" \t tf.device( '/ GPU:3'): 2のGPUを使用するために必要とされていますか? – user6101147

+0

2つのGPUにデータをパラレルにバッチするには、1トレーニングプロセス、2タスクはどうですか?上記と同じ設定かどうか? – user6101147

+0

私はこの場合、トレーニングプロセスと2つのタスクがお互いに話すように、テンソルフローを使用する必要があると思います。 – npf

関連する問題