如果我在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 |
答案 0 :(得分:2)
默认情况下,启动时TensorFlow会在可见的所有设备上分配几乎所有GPU内存。但是,除非您另行指定(在with tf.device():
块中,否则它只会将设备上的操作(对于TensorFlow)设置为"/gpu:0"
,其他GPU将处于空闲状态。
有几种解决方法:
在启动CUDA_VISIBLE_DEVICES=0
之前,先设置环境变量1
(或2
,python
等,然后再控制哪些设备对TensorFlow可见。在创建第一个tf.ConfigProto
时,也可以使用tf.Session
选项visible_device_list
配置此内容。
在创建第一个tf.ConfigProto
时设置tf.Session
选项allow_growth=True
。这将阻止TensorFlow预先分配所有GPU内存。