2016-01-17 3 views
16

У меня есть 3 GTX Titan GPU в моей машине. Я бегу пример, приведенный в Cifar10 с cifar10_train.py и получил следующий результат:Использует ли TensorFlow по умолчанию все доступные графические процессоры в машине?

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)

+1

Найдено [Любой способ заставить ТФ не занимать все ресурсы? (относительно multi-gpu)] (https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ), что приводит к [CUDA_VISIBLE_DEVICES - маскированию графических процессоров] (http : //acceleware.com/blog/cudavisibledevices-masking-gpus) –

+0

Это действительно помогает. Но почему TensorFlow автоматически инициализируется для всех устройств на машине? Кстати, просто сделайте ответ, который я приму. – Zk1001

+0

TensorFlow нацелен на «исследование производства». Кажется, что по умолчанию используется вся вычислительная мощность, отвечающая ожиданиям, чтобы выполнить свою работу как можно скорее. Отлично, что можно настроить, на самом деле. Но вы упоминали 3 GPU, и только 2 показывают в вас журналы. Почему так? –

ответ

19

См: 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)) 

Вы увидите, что теперь и б назначены 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 в вашем система, GPU с самым низким ID будет выбран по умолчанию. Если вы хотели бы работать на другом 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 нужно настроить таргетинг на конкретный графический процессор? Если вы используете , введя код с включенным графическим процессором, вы, как правило, используете запрос устройства на , выберите нужные графические процессоры. Тем не менее, быстрое и простое решение для тестирования - использовать переменную среды CUDA_VISIBLE_DEVICES для , чтобы ограничить устройства, которые видит ваше приложение CUDA. Это может быть полезно, если вы пытаетесь обмениваться ресурсами на узле или хотите, чтобы ваш графический процессор с включенным графическим процессором, предназначенный для работы с конкретным графическим процессором, имел .

Переменная окружения Синтаксис

Результаты

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 установлено устройство, что не существует, все устройства будут замаскированы. Вы можете указать сочетание действительных и недопустимых номеров устройств. Все устройства до недопустимого значения будут перечислены, а все устройства после недопустимого значения будут в масках.

Чтобы определить идентификатор устройства для доступного оборудования в вашей системе, , вы можете запустить исполняемый файл NVIDIA deviceQuery, включенный в SDK CUDA. Счастливое программирование!

Chris Mason

+0

Я сделал то же самое. Но затем, когда я сделал '' 'nvidia-smi'', я увидел, что одинаковое количество памяти используется со всех устройств gpu. –

+0

связанный с тензорным потоком gpu info старый/сломанный; вместо этого (по состоянию на 2017/10) попробуйте: https://www.tensorflow.org/tutorials/using_gpu – michael

+0

@Michael Спасибо. Обновленный ответ. –

Смежные вопросы