Почему один и тот же ноутбук выделяет большую различную виртуальную память в двух разных средах?

#python #tensorflow #pytorch #gpu #tensorflow2.0

Вопрос:

вы можете видеть, что этот ноутбук можно обучить в kaggle, используя лимит vram 16 ГБ от kaggle : https://www.kaggle.com/firefliesqn/g2net-gpu-newbie

я только что попытался запустить этот же ноутбук локально на графическом процессоре rtx3090,где у меня установлен torch 1.8, и тот же ноутбук, выделяющий около 23,3 Гб виртуальной памяти, почему это происходит и как я могу оптимизировать свою локальную среду, такую как kaggle? даже если я уменьшу размер пакета по сравнению с тем,что используется в kaggle, все равно локально мой ноутбук выделяет около 23 ГБ vram

в kggle я вижу факел 1.7,установленный tensorflow 2.4 и локально, так как я использую rtx3090,поэтому рекомендуется новая версия факела и tf, поэтому я использовал факел 1.8.1 и tensorflow 2.6

Ответ №1:

По умолчанию TensorFlow выделяет максимальное количество обнаруженной доступной памяти.

При использовании TensorFlow можно ограничить объем памяти, используемый следующим фрагментом:

 gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only allocate 12GB of memory on the first GPU
  try:
    tf.config.experimental.set_virtual_device_configuration(gpus[0],
        [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=12288)],
 

где 12228 = 1024x12

Другое решение (см. Обсуждение ниже) — использовать (работает для OP) (используйте это только в том случае, если у вас нет определенного верхнего предела используемой памяти) :

  tf.config.experimental.set_memory_growth(physical_devices[0], True)
 

https://www.tensorflow.org/api_docs/python/tf/config/experimental/set_memory_growth

В PyTorch это еще проще:

 import torch

# use 1/2 memory of the GPU 0 (should allocate very similar amount like TF)
torch.cuda.set_per_process_memory_fraction(0.5, 0)

#Can then check with
total_memory_available = torch.cuda.get_device_properties(0).total_memory
 

Комментарии:

1. пожалуйста, проверьте сотового 11 по max_memory_allocated(): функция здесь : kaggle.com/firefliesqn/g2net-gpu-newbie я использую эту функцию в kaggle и в местное ГПУ, где я rtx3090 связано..если вы установите этот блокнот : kaggle.com/hidehisaarai1213/… это похоже как на прошлом ноутбуке ссылке, что я общий, но этот ноутбук не выделять все ГПУ видеопамяти в tensorflow 2.4 МСИО разве это нормально, что ТФ выделяем всю память?

2. TensorFlow делает это по умолчанию (полное выделение), в то время как он использует только часть его во время обучения, что, так сказать, другое дело; единственный способ ограничить использование памяти GPU в TF кодом (я лично знаю об этом) — это описанный выше.

3. в этой записной книжке я читаю/обрабатываю данные tfrec с помощью tf и тренируюсь с использованием моделей torch. итак, какой код ограничения выделения памяти я должен использовать из двух приведенных выше примеров? пайторч один или тф один?

4. Я бы сказал и то, и другое: либо ограничить память от TensorFlow до 0 и использовать PyTorch 1/2 из памяти, либо небольшую константу из TensorFlow (максимум 1 ГБ/2 ГБ), последнее просто для того, чтобы убедиться, что TF не сломается (хотя операции, выполняемые для чтения, я ожидаю, будут выполняться на процессоре). Потому что TF по умолчанию, когда он видит, что доступен графический процессор, выделит максимальное количество доступной памяти, оставив PyTorch без памяти для обучения ваших моделей.

5. скажем,для размера пакета 16 моему учебному ноутбуку нужно 16 ГБ оперативной памяти, в pytorch автоматически выделено 16 ГБ,,, для tf могу ли я это сделать? мне не нравится эта идея выделения tf всей памяти 🙁 как и pytorch,я хочу заставить его использовать столько памяти, сколько нужно моему ноутбуку для обучения моей настроенной модели, как я могу это сделать? iirc в прошлых версиях tf я не сталкивался с проблемой выделения всей памяти