#python #tensorflow #pytorch #out-of-memory
#python #tensorflow #pytorch #нехватка памяти
Вопрос:
Я задаю этот вопрос, потому что я успешно обучаю сеть сегментации на моем GTX 2070 на ноутбуке с 8 ГБ видеопамяти, и я использую точно такой же код и точно такие же библиотеки программного обеспечения, установленные на моем настольном ПК с GTX 1080TI, и он по-прежнему выбрасывает память.
Почему это происходит, учитывая, что:
-
Одна и та же Windows 10 CUDA 10.1 CUDNN 7.6.5.32 драйвер Nvidia 418.96 (поставляется вместе с CUDA 10.1) установлена как на ноутбуке, так и на ПК.
-
Тот факт, что обучение с помощью TensorFlow 2.3 на графическом процессоре моего ПК проходит гладко, однако не удается выделить память для обучения только с помощью PyTorch.
-
PyTorch распознает графический процессор (печатает GTX 1080 TI) с помощью команды :
print(torch.cuda.get_device_name(0))
-
PyTorch выделяет память при выполнении этой команды:
torch.rand(20000, 20000).cuda()
#allocated 1.5GB of VRAM.
Каково решение этой проблемы?
Комментарии:
1. Спасибо downvoter за то, что высказали свой вариант. Я хотел бы увидеть в вашем комментарии причину понижения голосов, чтобы также узнать ошибку в моем вопросе / предположениях.
2. Это интересно. Этого не должно произойти, и, похоже, это не вариант использования «уменьшить размер пакета» 🙂 Вы использовали какой-то пользовательский набор данных / сэмплер / DataLoader? Вы перемещали данные на графический процессор в одном из этих компонентов? Вы пытались создать минимально воспроизводимый пример? Я мог бы попытаться воспроизвести проблему и исследовать, почему решение работает, но на данный момент в вопросе нет необходимой информации. Если он у вас все еще есть, не могли бы вы также опубликовать полную трассировку стека?
3. Да, я использую этот ноутбук jupyter, который создает проблему. Обратите внимание, что ошибка возникает не на моем ноутбуке, но на ПК она возникает (точно такие же конфигурации), независимо от PyTorch [1.2, 1.6] и эквивалентной версии torchvision. github.com/qubvel/segmentation_models.pytorch/blob/master / … . Поскольку проблема была решена путем уменьшения количества рабочих элементов в устройстве загрузки данных, я предполагаю, что это связано с процессором или потоками?
4. Вы проверили, по-прежнему ли проблема возникает при использовании no augmentation (
augmentation=None
)? В остальном, кажется, все в порядке. Я попробую позже.5. Это по-прежнему вызывает проблему, поскольку я с самого начала установил для нее значение None в обеих ситуациях (ПК и ноутбук)
Ответ №1:
Большинство людей (даже в теме ниже) склонны предполагать, что уменьшение batch_size решит эту проблему. На самом деле, в данном случае этого не происходит. Например, было бы нелогично, если бы сеть обучалась на 8 ГБ видеопамяти и при этом не смогла обучиться на 11 ГБ видеопамяти, учитывая, что в системе с 11 ГБ видеопамяти не было других приложений, потребляющих видеопамять, и установлена и используется точно такая же конфигурация.
Причина, по которой это произошло в моем случае, заключалась в том, что при использовании DataLoader
объекта я установил очень высокое (12)
значение для workers
параметра. Уменьшение этого значения до 4
в моем случае решило проблему.
На самом деле, хотя в нижней части потока ответ, предоставленный Yurasyk на https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 указал мне правильное направление.
Решение: Уменьшите количество workers
в PyTorch DataLoader
. Хотя я не совсем понимаю, почему это решение работает, я предполагаю, что это связано с потоками, созданными за кулисами для выборки данных; возможно, на некоторых процессорах появляется такая ошибка.
Комментарии:
1. Ваши рабочие загружали тензоры в графический процессор? При использовании нескольких рабочих элементов, я думаю, обычно предполагается привязать тензоры к процессору, а затем в итерационном цикле загрузить тензоры на графический процессор, а затем запустить модель на них. Я думаю, если бы у вас было 4 workers, и ваш пакет не был слишком интенсивным в использовании памяти GPU, это тоже было бы нормально, но для некоторых моделей / типов ввода с несколькими workers вся загрузка информации на GPU вызвала бы ошибки ООМ, которые могли бы привести к тому, что новичок уменьшит размер пакета, когда в этом не будет необходимости.
2. уменьшил количество рабочих до 1 и все еще получил проблему: (
3. Вы уменьшили рабочие параметры до 1, а также значительно уменьшили размер пакета?