theanorc для нескольких графических процессоров

У меня есть машина aws с 4 графическими процессорами:

00:03.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)
00:04.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)
00:05.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)
00:06.0 VGA compatible controller: NVIDIA Corporation GK104GL [GRID K520] (rev a1)

и мой файл theanorc выглядит так:

[global]
floatX = float32
device = gpu0

[lib]
cnmem = 1

Когда я открываю один блокнот jupyter и импортирую theano, я получаю следующее (которое, как я предполагаю, использует только один графический процессор):

Using Theano backend.
Using gpu device 0: GRID K520 (CNMeM is enabled with initial size: 95.0% of memory, cuDNN 5105)
/home/sabeywardana/anaconda3/lib/python3.5/site-packages/theano/sandbox/cuda/__init__.py:600: UserWarning: Your cuDNN version is more recent than the one Theano officially supports. If you see any problems, try updating Theano or downgrading cuDNN to version 5.

Однако, если я одновременно открою второй ноутбук Jupyter на том же компьютере. Затем я получаю сообщение об ошибке:

ERROR (theano.sandbox.cuda): ERROR: Not using GPU. Initialisation of device 0 failed:
initCnmem: cnmemInit call failed! Reason=CNMEM_STATUS_OUT_OF_MEMORY. numdev=1

ERROR (theano.sandbox.cuda): ERROR: Not using GPU. Initialisation of device gpu failed:
initCnmem: cnmemInit call failed! Reason=CNMEM_STATUS_OUT_OF_MEMORY. numdev=1

Если я вручную изменю свой .theanorc на использование gpu1, то второй ноутбук Jupyter будет работать нормально. Итак, вопрос: есть ли способ настроить .theanorc, чтобы просто получить доступный графический процессор?


person sachinruk    schedule 25.11.2016    source источник
comment
Не уверен, что я. Хотя пытается. Попробуйте заменить gpu0 только на gpu. Дайте мне знать, если это работает.   -  person Avijit Dasgupta    schedule 25.11.2016
comment
Пробовал это и gpu? безуспешно.   -  person sachinruk    schedule 25.11.2016


Ответы (2)


Вы можете использовать device=gpu, который выберет первый доступный графический процессор. Однако в вашем случае GPU 0 по-прежнему будет считаться «доступным» (памяти у него осталось немного, но выполнение все же возможно). Вы можете использовать nvidia-smi, чтобы установить режим вычислений ваших графических процессоров на «Эксклюзивный поток», чтобы первый ноутбук «блокировал» первый графический процессор для его монопольного использования, а второй ноутбук использовал другой.

Другой вариант — изменить переменную среды THEANO_FLAGS внутри блокнота перед импортом theano. Что-то типа:

import os

os.environ['THEANO_FLAGS'] = os.environ.get('THEANO_FLAGS', '') + ',' + 'device=gpu1'

import theano
person Pascal Lamblin    schedule 25.11.2016
comment
Я думаю, что вместо того, чтобы изменять переменную env внутри блокнота, лучше, чтобы он мог запустить блокнот, выполнив $THEANO_FLAGS=device=gpuN блокнот jupyter. - person Sentient07; 25.11.2016

Невозможно изменить устройство графического процессора после импорта theano.

Может быть, вы можете попробовать это-

import os
os.system("THEANO_FLAGS='device=gpu0' python script_1.py")
os.system("THEANO_FLAGS='device=gpu1' python script_2.py")
os.system("THEANO_FLAGS='device=gpu1' python script_3.py")
os.system("THEANO_FLAGS='device=gpu1' python script_4.py")

Если вы хотите сделать это изнутри блокнота (более программно), вы можете использовать следующий фрагмент: -

import theano.sandbox.cuda
theano.sandbox.cuda.use("gpu0")

Вставьте это в каждую записную книжку и измените идентификатор GPU. Это будет работать.

person Avijit Dasgupta    schedule 25.11.2016