多GPU上的默认Tensorflow设备

时间:2017-03-21 22:21:24

标签: tensorflow multi-gpu

如果我在multi-gpu平台上运行一个具有一个GPU的张量流模型(例如cifar10),则tensorflow会在所有可用的GPU上创建和广播(训练/推理)数据。由于我将num_gpus设置为1,因此它只在一个GPU上运行。但是,我也可以在其他gpus上看到相同的进程。有意吗?这有什么理由吗?我很快检查了像Caffe这样的其他DL框架,但设计/操作是不同的。当然,我可以在代码级别指定device,但我很好奇。此外,如果共享计算机,此默认设计可能会让其他用户感到烦恼。

tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:0) -> (device: 0, name:

tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:1) -> (device: 1, name: 

tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:2) -> (device: 2, name: 

tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:3) -> (device: 3, name: ...



+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0     67056    C   python                                       15623MiB |
|    1     67056    C   python                                       15499MiB |
|    2     67056    C   python                                       15499MiB |
|    3     67056    C   python                                       15499MiB |
|    4     67056    C   python                                       15499MiB |

1 个答案:

答案 0 :(得分:2)

默认情况下,启动时TensorFlow会在可见的所有设备上分配几乎所有GPU内存。但是,除非您另行指定(在with tf.device():块中,否则它只会将设备上的操作(对于TensorFlow)设置为"/gpu:0",其他GPU将处于空闲状态。

有几种解决方法:

  1. 在启动CUDA_VISIBLE_DEVICES=0之前,先设置环境变量1(或2python等,然后再控制哪些设备对TensorFlow可见。在创建第一个tf.ConfigProto时,也可以使用tf.Session选项visible_device_list配置此内容。

  2. 在创建第一个tf.ConfigProto时设置tf.Session选项allow_growth=True。这将阻止TensorFlow预先分配所有GPU内存。