Machine learning 默认情况下TensorFlow是否使用机器中所有可用的GPU?

Machine learning 默认情况下TensorFlow是否使用机器中所有可用的GPU?,machine-learning,computer-vision,gpu,tensorflow,Machine Learning,Computer Vision,Gpu,Tensorflow,我的机器中有3个GTX Titan GPU。我使用Cifar10_train.py运行了Cifar10中提供的示例,并获得了以下输出: I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1 I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot e

我的机器中有3个GTX Titan GPU。我使用Cifar10_train.py运行了Cifar10中提供的示例,并获得了以下输出:

I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0:   Y N 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1:   N Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0)
在我看来,TensorFlow正在尝试在两个设备(gpu0和gpu1)上初始化自己

我的问题是为什么它只在两个设备上这样做,有没有办法防止这种情况?(我只希望它像一个GPU一样运行)

请参阅:

手动设备放置

如果您希望在您选择的设备上运行特定操作,而不是自动为您选择的设备,则可以使用with
tf.device
创建设备上下文,以便该上下文中的所有操作都具有相同的设备分配

#创建一个图形。
使用tf.device('/cpu:0'):
a=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c=tf.matmul(a,b)
#创建日志\u设备\u位置设置为True的会话。
sess=tf.Session(config=tf.ConfigProto(log\u device\u placement=True))
#执行任务。
打印(sess.run(c))
您将看到,现在a和b被分配给
cpu:0
。由于没有为
MatMul
操作明确指定设备,因此TensorFlow运行时将根据操作和可用设备(本例中为gpu:0)选择一个设备,并根据需要在设备之间自动复制张量

设备映射:
/作业:本地主机/副本:0/任务:0/gpu:0->设备:0,名称:特斯拉K40c,pci总线
id:0000:05:00.0
b:/job:localhost/replica:0/task:0/cpu:0
a:/job:localhost/replica:0/task:0/cpu:0
MatMul:/job:localhost/replica:0/task:0/gpu:0
[[ 22.  28.]
 [ 49.  64.]]

先前的答案2

见:

在多GPU系统上使用单个GPU

如果系统中有多个GPU,默认情况下将选择ID最低的GPU。如果要在不同的GPU上运行,则需要明确指定首选项:

#创建一个图形。
使用tf.device('/gpu:2'):
a=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c=tf.matmul(a,b)
#创建日志\u设备\u位置设置为True的会话。
sess=tf.Session(config=tf.ConfigProto(log\u device\u placement=True))
#执行任务。
打印sess.run(c)

先前的答案1

您的CUDA应用程序是否需要针对特定的GPU?如果你是 在编写支持GPU的代码时,通常会使用设备查询 选择所需的GPU。但是,对于 测试是使用环境变量CUDA_VISIBLE_DEVICES 限制CUDA应用程序看到的设备。这可能是 如果您正在尝试共享节点上的资源或希望共享资源,则此功能非常有用 启用GPU的可执行文件以特定GPU为目标

环境变量语法

结果

CUDA_VISIBLE_DEVICES=1只会看到设备1 CUDA_VISIBLE_DEVICES=0,1设备0和1将可见 CUDA_VISIBLE_DEVICES=“0,1”与上述相同,引号是可选的 CUDA_可视_设备=0,2,3设备0,2,3将可见;设备1 他戴着面具

CUDA将从零开始枚举可见设备。最后 在这种情况下,设备0、2、3将显示为设备0、1、2。如果你改变 字符串的顺序为“2,3,0”,将枚举设备2,3,0 分别为0,1,2。如果CUDA_VISIBLE_DEVICES设置为 不存在,所有设备都将被屏蔽。您可以指定以下项的组合: 有效和无效的设备编号。无效值之前的所有设备 将枚举,而将枚举无效值之后的所有设备 蒙面的

要确定系统中可用硬件的设备ID, 您可以运行CUDA SDK中包含的NVIDIA的deviceQuery可执行文件。 快乐编程

克里斯·梅森


发现导致这一点真的很有帮助。但是为什么TensorFlow会自动初始化机器上的所有设备?顺便说一句,我会接受你的回答。TensorFlow的目标是“从研究到生产”。默认使用所有计算能力似乎满足了尽快完成任务的期望。很好,事实上,可以调整。但是你提到了3个GPU,在你的日志中只显示了2个。为什么?我刚刚发现这是因为第三个GPU不起作用(出于某种原因,我还不知道),所以我想如果是的话,TensorFlow也会使用它。我做了完全相同的事情。但是,当我使用nvidia smi时,我发现所有gpu设备使用的内存量相等。链接到tensorflow gpu的信息是旧的/损坏的;相反(从2017/10开始)试试:@Michael谢谢。更新答案。@GuyCoder:我对运行tensorflow gpu代码也有类似的疑问。它使用所有的gpu,但为什么所有的内核都没有像多处理器模块一样被使用呢?你能检查一下吗?