Tensorflow如何在2个GPU上训练2个CNN(独立)。CUDA\u错误\u内存不足错误

Tensorflow如何在2个GPU上训练2个CNN(独立)。CUDA\u错误\u内存不足错误,tensorflow,multi-gpu,Tensorflow,Multi Gpu,1台PC和2个GPU。在2个GPU上培训2个独立的CNN。我使用以下内容为GPU创建图形: with tf.device('/gpu:%d' % self.single_gpu): self._create_placeholders() self._build_conv_net() self._create_cost() self._creat_optimizer() 训练循环不在th.device()下 开始第一个CNN培训过程后,如使用GPU 1。然后,

1台PC和2个GPU。在2个GPU上培训2个独立的CNN。我使用以下内容为GPU创建图形:

  with tf.device('/gpu:%d' % self.single_gpu):
    self._create_placeholders()
    self._build_conv_net()
    self._create_cost()
    self._creat_optimizer()
训练循环不在th.device()下

开始第一个CNN培训过程后,如使用GPU 1。然后,我用GPU0开始第二次CNN培训。我总是出现CUDA_错误,无法启动第二次训练过程

是否可以在同一台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/core/common_runtime/bfc_分配器。cc:274]*******____******************_______________________________________________________________________ W tensorflow/core/common_runtime/bfc_allocator.cc:275]试图分配384.00mb时内存不足。有关内存状态,请参阅日志。 回溯(最近一次呼叫最后一次): 文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第1022行,在调用中 返回fn(*args) 文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site packages/tensorflow/python/client/session.py”,第1004行,在 状态,运行(元数据) 文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/contextlib.py”,第89行,在退出 下一个(self.gen) 文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site packages/tensorflow/python/framework/errors\u impl.py”,第466行,处于引发异常打开状态 pywrap_tensorflow.TF_GetCode(状态)) tensorflow.python.framework.errors_impl.InternalError:Dst tensor未初始化。 [[Node:_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:0/cpu:0”,send_device_化身=1,tensor_name=“edge_3_recv_inpus/inpu/inpu/inpu placeholder_0”,tensor_type=DT_FLOAT,/gpu device=“/job:host/replica:0/gpu-0/task”] [[Node:Mean/\u 15=\u Recvclient\u terminated=false,recv\u device=“/job:localhost/replica:0/task:0/cpu:0”,send\u device=“/job:localhost/replica:0/task:0/gpu:2”,send\u device\u化身=1,tensor\u name=“edge\u 414\u-Mean”,tensor\u type=DT\u FLOAT,\u device=“/job:localhost/replica:0/task:0/cpu:0”]

在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“mg_model_nvidia_gpu.py”,第491行,在
main()
文件“mg_model_nvidia_gpu.py”,第482行,主目录
nvidia_cnn.train(数据发生器、train_数据、val_数据)
文件“mg_model_nvidia_gpu.py”,第307行,列车中
self.keep\u prob:self.train\u config.keep\u prob})
文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site packages/tensorflow/python/client/session.py”,第767行,正在运行
运行_元数据_ptr)
文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site packages/tensorflow/python/client/session.py”,第965行,正在运行
提要(dict字符串、选项、运行元数据)
文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site packages/tensorflow/python/client/session.py”,第1015行,运行
目标\u列表、选项、运行\u元数据)
文件“/home/hl/anaconda3/envs/dl-conda-py36/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第1035行,在调用中
提升类型(e)(节点定义、操作、消息)
tensorflow.python.framework.errors_impl.InternalError:Dst tensor未初始化。
[[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_化身=1,tensor_name=“edge_3_recv_inputs/inpu/inpu/input_placeholder_0”,tensor_type=DT_FLOAT,/gpu device=“/job:localhost/replica:0/gpu fault:0”]
[[Node:Mean/_15=_Recv[client\u terminated=false,Recv\u device=“/job:localhost/replica:0/cpu:0”,send\u device=“/job:localhost/replica:0/task:0/gpu:2”,send\u device\u化身=1,tensor\u name=“edge\u 414\u-Mean”,tensor\u type=DT\u FLOAT,\u device=“/job:localhost/replica:0/task:0/cpu:0”]()]

默认情况下,TensorFlow预先分配它可以访问的GPU设备的全部内存。因此,第二个进程没有可用内存

您可以使用
config.gpu\u选项控制此分配:

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

或者,您可以使用
os.environ[“CUDA\U VISIBLE\U DEVICES”]

将不同的卡赋予两个进程。因此,进程1使用gpu 0:os.environ[“CUDA\U DEVICE\U ORDER”]=“PCI\U总线ID”os.environ[“CUDA\U VISIBLE\U DEVICES”]=“0”tf.DEVICE('/gpu:0'):进程2使用gpu 3:os.environ[“CUDA\U DEVICE\U ORDER”=“PCI\U总线ID”os.Enviro[“CUDA_可视_设备”]=“3”tf.device('/gpu:3'):需要使用2个gpu吗?1个培训过程,2个任务如何将批处理数据并行到2个gpu中?是否与上面的配置相同?我认为在这种情况下,您需要使用tensorflow distributed,以便培训过程和两个任务相互通信。os.environ[“CUDA_VISIBLE_DEVICES”]=“0,3”表示1个进程能够使用GPU 0和3?然后,可以使用tf.device()将任务1分配给gpu 0,将任务2分配给gpu 3?我将不得不做实验。这种配置确实令人困惑。如果没有os.Enviro[“CUDA\u可见\u设备”]=“0,3”,第二个进程报告CUDA\u错误\u内存不足。
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
sess = tf.Session(config=config) as sess: