Почему я не могу запустить сеанс тензорного потока на ЦП, когда память одного устройства GPU распределена? - PullRequest
0 голосов
/ 05 ноября 2018

На веб-сайте tenorflow (https://www.tensorflow.org/guide/using_gpu) я обнаружил следующий код, чтобы вручную указать использование процессора вместо графического процессора:

# 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))

Я попытался запустить это на своей машине (с 4 графическими процессорами) и получил следующую ошибку:

2018-11-05 10: 02: 30.636733: I tenorflow / core / common_runtime / gpu / gpu_device.cc: 1392] Найдено устройство 0 со свойствами: название: GeForce GTX 1080 Ti мажор: 6 минор: 1 памятьClockRate (ГГц): 1,582 pciBusID: 0000: 18: 00.0 общая память: 10,92 ГБ свободная память: 10,76 ГБ 2018-11-05 10: 02: 30.863280: I tenorflow / core / common_runtime / gpu / gpu_device.cc: 1392] Найдено устройство 1 со свойствами: название: GeForce GTX 1080 Ti мажор: 6 минор: 1 памятьClockRate (ГГц): 1,582 pciBusID: 0000: 3b: 00.0 общая память: 10,92 ГБ свободная память: 10,76 ГБ 2018-11-05 10: 02: 31.117729: E tenorflow / core / common_runtime / direct_session.cc: 158] Внутренний: не удалось инициализировать StreamExecutor для устройства CUDA, порядковый номер 2: Внутренний: сбой вызова cuDevicePrimaryCtxRetain: CUDA_ERROR_OUT_OF_MEMORY; общий объем памяти: 11721506816 Traceback (последний вызов был последним): Файл "./tf_test.py", строка 10, в sess = tf.Session (config = tf.ConfigProto (log_device_placement = True)) Файл "... / anaconda2 / lib / python2.7 / site-packages / tenorflow / python / client / session.py", строка 1566, в init super (Session, self). init (target, graph, config = config) Файл "... / anaconda2 / lib / python2.7 / site-packages / tenorflow / python / client / session.py", строка 636, в init self._session = tf_session.TF_NewSession (self._graph._c_graph, опция) tenorflow.python.framework.errors_impl.InternalError: Не удалось создать сеанс.

Кажется, что когда я создаю сеанс, tenorflow пытается инициализировать потоковый исполнитель на всех устройствах. К сожалению, один из GPU сейчас используется моим коллегой. Я надеюсь, что его полное использование одного графического процессора не помешает мне использовать другое устройство (будь то графический процессор или процессор), но, похоже, это не так.

Кто-нибудь знает обходной путь к этому? Возможно, что-то добавить в конфиг? Это что-то, что можно исправить в тензорном потоке?

К вашему сведению ... здесь вывод "gpustat -upc":

<my_hostname>  Mon Nov  5 10:19:47 2018
[0] GeForce GTX 1080 Ti | 36'C,   0 % |    10 / 11178 MB |
[1] GeForce GTX 1080 Ti | 41'C,   0 % |    10 / 11178 MB |
[2] GeForce GTX 1080 Ti | 38'C,   0 % | 11097 / 11178 MB | <my_colleague>:python2/148901(11087M)
[3] GeForce GTX 1080 Ti | 37'C,   0 % |    10 / 11178 MB |

1 Ответ

0 голосов
/ 05 ноября 2018

ОК ... так что с помощью моего коллеги у меня есть работоспособное решение. Ключ, по сути, является модификацией конфига. Конкретно как то так:

config.gpu_options.visible_device_list = '0'

Это гарантирует, что тензор потока видит только графический процессор 0.

На самом деле я смог запустить следующее:

#!/usr/bin/env python                                                                                                                                                                                                                        

import tensorflow as tf

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.                                                                                                                                                                                   
config=tf.ConfigProto(log_device_placement=True)
config.gpu_options.visible_device_list = '0,1,3'
sess = tf.Session(config=config)
# Runs the op.                                                                                                                                                                                                                               
print(sess.run(c))

Обратите внимание, что этот код фактически указывает на работу на GPU 2 (который, как вы помните, является полным). Это важный момент ... графические процессоры перенумерованы в соответствии с visible_device_list, поэтому в приведенном выше коде, когда мы говорим «с gpu: 2», это относится к третьему графическому процессору в списке ('0,1,3 '), который на самом деле является графическим процессором 3. Это может укусить вас, если вы попробуете это:

#!/usr/bin/env python                                                                                                                                                                                                                        

import tensorflow as tf

with tf.device('/gpu:1'):
    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.                                                                                                                                                                                   
config=tf.ConfigProto(log_device_placement=True)
config.gpu_options.visible_device_list = '1'
sess = tf.Session(config=config)
# Runs the op.                                                                                                                                                                                                                               
print(sess.run(c))

Проблема в том, что он ищет 2-й графический процессор в списке, но в видимом списке есть только один графический процессор. Вы получите следующую ошибку:

InvalidArgumentError (см. Выше для отслеживания): не удается назначить устройство для операции 'a': Операция была явно назначена для / device: GPU: 1, но доступны устройства [/ job: localhost / replica: 0 / task: 0 / устройство: ЦП: 0, / задание: локальный хост / реплика: 0 / задание: 0 / устройство: GPU: 0]. Убедитесь, что в спецификации устройства указано действительное устройство. [[Узел: a = Constdtype = DT_FLOAT, значение = Тензор, _device = "/ устройство: GPU: 1"]]

Мне все еще кажется странным, что я должен указывать список графических процессоров, когда хочу запустить процессор. Я попытался использовать пустой список, и это не удалось, поэтому, если бы использовались все 4 графических процессора, я бы не нашел обходного пути. У кого-нибудь есть идея получше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...