Почему у меня CUDA не хватает памяти при запуске модели 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.
Как решить эту проблему?
Ответы
Большинство людей (даже в потоке ниже) сразу же предполагают, что уменьшение batch_size решит эту проблему. На самом деле, в данном случае это не так. Например, для сети было бы нелогично обучаться на 8 ГБ видеопамяти и при этом не обучаться на 11 ГБ видеопамяти, учитывая, что в системе с 11 ГБ видеопамяти не было других приложений, потребляющих видеопамять, и установлена точно такая же конфигурация и используемый.
Причина, по которой это произошло в моем случае, заключалась в том, что при использовании DataLoader
объекта я установил очень высокое (12) значение для workers
параметра. Уменьшение этого значения до 4 в моем случае решило проблему.
На самом деле, хотя и внизу ветки, ответ Юрасыка на https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 указал мне в правильном направлении.
Решение: Уменьшите количество workers
в PyTorch DataLoader
. Хотя я не совсем понимаю, почему это решение работает, я предполагаю, что оно связано с потоками, создаваемыми за кулисами для выборки данных; может случиться так, что на некоторых процессорах такая ошибка появляется.