Библиотеки времени выполнения C имеют ограничение 512 для количества файлов, которые могут быть открыты в любой момент времени. Попытка открыть больше, чем максимальное количество файловых дескрипторов или файловых потоков, приводит к сбою программы. Используйте _setmaxstdio
, чтобы изменить это число. Более подробную информацию об этом можно прочитать здесь здесь
Также вам может потребоваться проверить, поддерживает ли ваша версия Windows верхний предел, который вы пытаетесь установить с помощью _setmaxstdio
. Для получения дополнительной информации о _setmaxstdio
проверьте здесь
Информация о предмете, соответствующем VS 2015, можно найти здесь здесь
Я считаю, что вам нужно установить CUDA_VISIBLE_DEVICES=1
. Или какой GPU вы хотите использовать. Если вы сделаете видимым только один графический процессор, вы будете называть его /gpu:0
независимо от того, какую переменную среды вы установили.
Подробнее об этой переменной среды: https://devblogs.nvidia.com/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/
.Для этого есть 3 способа:
Использование переменной среды CUDA_VISIBLE_DEVICES
. установив переменную среды CUDA_VISIBLE_DEVICES="1"
, можно увидеть только устройство 1, а установив CUDA_VISIBLE_DEVICES="0,1"
, сделать устройства 0 и 1 видимыми. Вы можете сделать это в Python, имея строку os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
после импорта пакета os
.
Используя with tf.device('/gpu:2')
и создать граф. Затем он будет использовать устройство GPU 2.
Использование config = tf.ConfigProto(device_count = {'GPU': 1})
, а затем sess = tf.Session(config=config)
. Это будет использовать устройство с графическим процессором 1.
TF выделяет всю доступную память на каждом видимом графическом процессоре, если не указано иное. Вот 4 способа придерживаться только одного (или нескольких) графических процессоров.
Решение Bash. Установите CUDA_VISIBLE_DEVICES=0,1
в своем терминале / консоли перед запуском ноутбука Python или Jupyter.
Решение Python. перед построением сеанса выполните следующие 2 строки кода
import os
os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
Автоматизированное решение. Приведенный ниже метод автоматически обнаружит устройства с графическим процессором, которые не используются другими сценариями, и установит для вас CUDA_VISIBLE_DEVICES. Вы должны позвонить mask_unused_gpus
перед построением сеанса. Это отфильтрует графические процессоры по текущему использованию памяти. Таким образом, вы можете запускать несколько экземпляров вашего скрипта одновременно, не изменяя ваш код и не устанавливая параметры консоли.
Функция:
import subprocess as sp
import os
def mask_unused_gpus(leave_unmasked=1):
ACCEPTABLE_AVAILABLE_MEMORY = 1024
COMMAND = "nvidia-smi --query-gpu=memory.free --format=csv"
try:
_output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]
memory_free_info = _output_to_list(sp.check_output(COMMAND.split()))[1:]
memory_free_values = [int(x.split()[0]) for i, x in enumerate(memory_free_info)]
available_gpus = [i for i, x in enumerate(memory_free_values) if x > ACCEPTABLE_AVAILABLE_MEMORY]
if len(available_gpus) < leave_unmasked: raise ValueError('Found only %d usable GPUs in the system' % len(available_gpus))
os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, available_gpus[:leave_unmasked]))
except Exception as e:
print('"nvidia-smi" is probably not installed. GPUs are not masked', e)
mask_unused_gpus(2)
Ограничения: если вы запустите несколько сценариев одновременно, это может вызвать коллизию, поскольку память не выделяется сразу при создании сеанса. В случае, если это проблема для вас, вы можете использовать рандомизированную версию, как в исходном исходном коде: mask_busy_gpus ()
Tensorflow 2.0 предлагает еще один метод:
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
# Restrict TensorFlow to only use the first GPU
try:
tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
except RuntimeError as e:
# Visible devices must be set at program startup
print(e)
Вы можете изменить настройки параметров графического процессора, добавив в начале своего скрипта Python:
gpu_options = tf.GPUOptions(visible_device_list="0")
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
«0» - это имя графического процессора, который вы хотите использовать. Вы можете получить список доступных графических процессоров, набрав команду nvidia-smi в командной строке терминала.
Эти 2 функции позволяют выбрать процессор или графический процессор, а в случае графического процессора - долю памяти, которая будет использоваться.
def set_cpu_option():
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
os.environ["CUDA_VISIBLE_DEVICES"] = ""
def set_gpu_option(which_gpu, fraction_memory):
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = fraction_memory
config.gpu_options.visible_device_list = which_gpu
set_session(tf.Session(config=config))
# print('Ici le logger devrait parler')
logger.info('Session opened with GPU ID: {} and fraction memory: {}.'.format(which_gpu, fraction_memory))
return
set_gpu_option("0", 0.9)