Ответ 1
Смотрите: Использование графических процессоров
Ручное расположение устройства
Если вы хотите, чтобы определенная операция выполнялась на выбранном вами устройстве, а не в том, что было автоматически выбрано для вас, вы можете использовать с 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.
Смотрите: Использование графических процессоров
Использование одного GPU в системе с несколькими 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 - Маскирование графических процессоров
Нужно ли вашему приложению CUDA ориентироваться на конкретный графический процессор? Если ты написав код с включенным графическим процессором, вы обычно используете запрос устройства для выберите нужные графические процессоры. Однако быстрое и простое решение для тестирование заключается в использовании переменной среды CUDA_VISIBLE_DEVICES для ограничьте устройства, которые видит ваше приложение CUDA. Это может быть полезно, если вы пытаетесь обмениваться ресурсами на node или хотите ваш графический процессор включил исполняемый файл для таргетинга на определенный графический процессор.
Синтаксис переменных среды
Результаты
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 установлено устройство, которое не существует, все устройства будут замаскированы. Вы можете указать сочетание действительные и недопустимые номера устройств. Все устройства до недопустимого значения будут перечислены, тогда как все устройства после недопустимого значения будут замаскированным.
Чтобы определить идентификатор устройства для доступного оборудования в вашей системе, вы можете запустить исполняемый файл NVIDIAs deviceQuery, включенный в SDK CUDA. Счастливое программирование!
Крис Мейсон