我的机器中有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一样运行)
答案 0 :(得分:21)
请参阅:Using GPUs
手动设备放置
如果您希望在您选择的设备上运行特定操作而不是为您自动选择的设备,则可以使用tf.device
创建设备上下文,以便该上下文中的所有操作都具有相同的设备分配。
# Creates a graph.
with 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)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))
您会看到现在a和b已分配给cpu:0
。由于没有为MatMul
操作明确指定设备,因此TensorFlow运行时将根据操作和可用设备(本示例中为gpu:0)选择一个设备,并在需要时自动在设备之间复制张量。
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus
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。
请参阅:Using GPUs
在多GPU系统上使用单个GPU
如果系统中有多个GPU,默认情况下将选择ID最低的GPU。如果您想在不同的GPU上运行,则需要明确指定首选项:
# Creates a graph.
with 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)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print sess.run(c)
早期答案1。
来自CUDA_VISIBLE_DEVICES – Masking GPUs
您的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_VISIBLE_DEVICES = 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可执行文件。 快乐的节目!
克里斯梅森